簡單認識自旋鎖和訊號量

來源:互聯網
上載者:User
 

為了避免多個進程對同一資源進行訪問或多處理器並發產生競爭,核心採用鎖機制來實現對共用資料的保護。首先簡單分析一下作業系統之分類:

 一 作業系統分類

即時作業系統和分時作業系統。它們的共同特點是都是多任務的,但是主要區別在於應用場合,舉個不恰當的例子即時作業系統應用於飛彈發射、衛星發射等即時性要求較高的場合,而分時操作對即時性要求相對較低場合。

多任務作業系統分為兩類:非搶佔式多任務和搶佔式多任務。

非搶佔式多任務,就是每個進程不斷的佔用CPU,直到運行完畢或者是自己讓出,別的進程才能使用CPU。
搶佔式多任務,就是每個進程佔用CPU時間是有限的,到了一定時間,它必須讓出來,類似於電腦網路中的分時複用技術。搶佔式多任務調度是很多作業系統最基本的調度方法。

二 進程調度

實際中我們發現進程可以分為兩類:

I/O消耗型:就是說進程頻繁的和外界互動,比如要開啟、瀏覽檔案,要等待使用者命令,要讀取光碟片上的資料。

處理器消耗型:就是說進程多數時間總是不斷的在CPU裡面運行,很少需要等待。所以我們應該區別對待這兩種類型的進程。我們利用處理器遵循的原則是:輸送量大和回應時間快。對於I/O消耗型,由於它需要頻繁等待I/O,這樣它需要較高的優先順序來搶佔當前運行進程,以確保當I/O條件滿足後能馬上得到CPU響應,並且它的時間片相對其它處理器消耗型進程來說更長。相反,處理器消耗型進程優先順序相對就低了,並且其時間片沒有必要太長。
   讓我們看一個例子,加深理解:假設使用者運行兩個程式,一個是打字程式,一個是視頻程式。很明顯,打字程式是I/O消耗型的,而視頻程式是處理器消耗型的。人的打字速度再快也不可能快過電腦計算視頻編碼並在螢幕上顯示出來的速度,可是人希望他每打一個字,就能輸入電腦並在螢幕上顯示。因此,對於打字程式,我們讓它有較高的優先順序,以便讓人可以馬上輸入,並且其時間片也要多些;相比下,視頻程式的優先順序就低些,以便讓位給打字程式,時間片當然也就少些。實際上,一般來說,優先順序越高,時間片也就越長,反之亦然。

三 自旋鎖

鎖機制的原理是當進程進入CPU運行時,就會給它的代碼上鎖,以免別的CPU中的進程修改裡面的代碼。鎖本身是一種互斥鎖,即有“上鎖”和“開鎖”一說!

一個執行單元要想訪問被自旋鎖保護的共用資源,必須先得到鎖,在訪問完共用資源後,必須釋放鎖。如果在擷取自旋鎖時,沒有任何執行單元保持該鎖,那麼將立即得到鎖;如果在擷取自旋鎖時鎖已經有保持者,那麼擷取鎖操作將自旋在那裡,直到該自旋鎖的保持者釋放了鎖。

簡單的說所謂自旋鎖就是這樣的一把鎖:進程A進入CPU,鎖上門運行,進程B來到CPU前,發現門被鎖上了,於是等待進程A出來交出開鎖鑰匙。
   正如每次我們談到“鎖”這個概念時,總會談到“死結”——是的,我們用鎖,就必須防止死結,死結是這樣產生的:進程A進入CPU運行,上鎖,進程B來到CPU門前等待進程A出來,可是糟糕的情況出現了:進程A要想出來就必須擷取進程B的協助,於是進程A開始等待進程B的協助,可是進程B卻又一直等待
進程A出來!這樣的等待無法終止,最終成為死結。
   再比如,進程A要鎖上甲程式碼片段,然後想再去鎖乙程式碼片段,進程B要鎖上乙程式碼片段,然後想再去鎖甲程式碼片段。第一步大家都沒問題,可是兩個進程都要進行下一步時,發現無法完成任務了:進程A已經鎖上甲程式碼片段,進程B沒法再去操作它,同理進程B已經鎖上乙程式碼片段,進程A也沒辦法操作它,於是兩個進程等待對方釋放鎖,當然,這樣的等待也是無止無休的。這就好象兩輛汽車在一座很榨的橋上相向行駛,兩車碰頭誰也不讓誰,都在等待對方讓路。
避免死結,必須使每次上鎖操作都是有順序的、原子的操作。有順序的,也就是說每次都按照可執行隊列地址從低向高的順序上鎖。

缺點:一個被爭用的自旋鎖使得請求它的線程在等待鎖重新可用時自旋(特別浪費處理器時間)。所以,自旋鎖不應該被長時間持有。

四 訊號量

 

Linux中的訊號量是一種睡眠鎖。如果有一個任務試圖獲得一個已被持有的訊號量時,訊號量會將其推入等待隊列,然後讓其睡眠。這時處理器獲得自由去執行其它代碼。當持有訊號量的進程將訊號量釋放後,在等待隊列中的一個任務將被喚醒,從而便可以獲得這個訊號量。
    訊號量的睡眠特性,使得訊號量適用於鎖會被長時間持有的情況;只能在進程上下文中使用,因為中斷上下文中是不能被調度的;另外當代碼持有訊號量時,不可以再持有自旋鎖。

 

五 兩者區別

雖然聽起來兩者之間的使用條件複雜,其實在實際使用中訊號量和自旋鎖並不易混淆。注意以下原則:

如果代碼需要睡眠——這往往是發生在和使用者空間同步時——使用訊號量是唯一的選擇。由於不受睡眠的限制,使用訊號量通常來說更加簡單一些。如果需要在自旋鎖和訊號量中作選擇,應該取決於鎖被持有的時間長短。理想情況是所有的鎖都應該儘可能短的被持有,但是如果鎖的持有時間較長的話,使用訊號量是更好的選擇。另外,訊號量不同於自旋鎖,它不會關閉核心搶佔,所以持有訊號量的代碼可以被搶佔。這意味者訊號量不會對影響調度反應時間帶來負面影響。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.