spinlock與linux核心調度的關係

來源:互聯網
上載者:User

作者:劉洪濤,華清遠見嵌入式學院進階講師,ARM公司授權ATC講師。

  關於自旋鎖用法介紹的文章,已經有很多,但有些細節的地方點的還不夠透。我這裡就把我個人認為大家容易有疑問的地方拿出來討論一下。

  一、自旋鎖(spinlock)簡介

  自旋鎖在同一時刻只能被最多一個核心任務持有,所以一個時刻只有一個線程允許存在於臨界區中。這點可以應用在多處理機器、或運行在單一處理器上的搶佔式核心中需要的鎖定服務。

  二、訊號量簡介

  這裡也介紹下訊號量的概念,因為它的用法和自旋鎖有相似的地方。

Linux中的訊號量是一種睡眠鎖。如果有一個任務試圖獲得一個已被持有的訊號量時,訊號量會將其推入等待隊列,然後讓其睡眠。這時處理器獲得自由去執行其它代碼。當持有訊號量的進程將訊號量釋放後,在等待隊列中的一個任務將被喚醒,從而便可以獲得這個訊號量。

  三、自旋鎖和訊號量對比

  在很多地方自旋鎖和訊號量可以選擇任何一個使用,但也有一些地方只能選擇某一種。下面對比一些兩者的用法。

  表1-1自旋鎖和訊號量對比

應用場合

訊號量or自旋鎖

低開銷加鎖(臨界區執行時間較快)

優先選擇自旋鎖

低開銷加鎖(臨界區執行時間較長)

優先選擇訊號量

臨界區可能包含引起睡眠的代碼

不能選自旋鎖,可以選擇訊號量

臨界區位於非進程上下文時,此時不能睡眠

優先選擇自旋鎖,即使選擇訊號量也只能用down_trylock非阻塞的方式

四、自旋鎖與linux核心進程調度關係

我們討論下表1-1中的第3種情況(其它幾種情況比較好理解),如果臨界區可能包含引起睡眠的代碼則不能使用自旋鎖,否則可能引起死結。

那麼為什麼訊號量保護的代碼可以睡眠而自旋鎖就不能呢?

先看下自旋鎖的實現方法吧,自旋鎖的基本形式如下:

spin_lock(&mr_lock);

//臨界區

spin_unlock(&mr_lock);

跟蹤一下spin_lock(&mr_lock)的實現

#define spin_lock(lock)  _spin_lock(lock)

#define _spin_lock(lock)      __LOCK(lock)

#define __LOCK(lock) \

do { preempt_disable(); __acquire(lock); (void)(lock); } while (0)

注意到“preempt_disable()”,這個調用的功能是“關搶佔”(在spin_unlock中會重新開啟搶佔功能)。從中可以看出,使用自旋鎖保護的地區是工作在非搶佔的狀態;即使擷取不到鎖,在“自旋”狀態也是禁止搶佔的。瞭解到這,我想咱們應該能夠理解為何自旋鎖保護的代碼不能睡眠了。試想一下,如果在自旋鎖保護的代碼中間睡眠,此時發生進程調度,則可能另外一個進程會再次調用spinlock保護的這段代碼。而我們現在知道了即使在擷取不到鎖的“自旋”狀態,也是禁止搶佔的,而“自旋”又是動態,不會再睡眠了,也就是說在這個處理器上不會再有進程調度發生了,那麼死結自然就發生了。

咱們可以總結下自旋鎖的特點:

●  單一處理器非搶佔核心下:自旋鎖會在編譯時間被忽略;

●  單一處理器搶佔核心下:自旋鎖僅僅當作一個設定核心搶佔的開關;

●  多處理器下:此時才能完全發揮出自旋鎖的作用,自旋鎖在核心中主要用來防止多處理器中並發訪問臨界區,防止核心搶佔造成的競爭。

五、linux搶佔發生的時間

最後在瞭解下linux搶佔發生的時間,搶佔分為使用者搶佔和核心搶佔。

使用者搶佔在以下情況下產生:

●  從系統調用返回使用者空間

●  從中斷處理常式返回使用者空間

核心搶佔會發生在:

●  當從中斷處理常式返回核心空間的時候,且當時核心具有可搶佔性;

●  當核心代碼再一次具有可搶佔性的時候。(如:spin_unlock時)

●  如果核心中的任務顯式的調用schedule()

●  如果核心中的任務阻塞。

基本的進程調度就是發生在時鐘中斷後,並且發現進程的時間片已經使用完了,則發生進程搶佔。通常我們會利用中斷處理常式返回核心空間的時候可以進行核心搶佔這個特性來提高一些I/O操作的即時性,如:當I/O事件發生的是時候,對應的中斷處理常式被啟用,當它發現有進程在等待這個I/O事件的時候,它會啟用等待進程,並且設定當前正在執行進程的need_resched標誌,這樣在中斷處理常式返回的時候,發送器被啟用,原來在等待I/O事件的進程(很可能)獲得執行權,從而保證了對I/O事件的相對快速響應(毫秒級)。可以看出,在I/O事件發生的時候,I/O事件的處理進程會搶佔當前進程,系統的響應速度與調度時間片的長度無關。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.