天天看點

自旋鎖 互斥鎖自旋鎖 互斥鎖

自旋鎖 互斥鎖

本文從以下3個方面來介紹。

1. 為什麼會有自旋鎖、互斥鎖?

2. 什麼是自旋鎖、互斥鎖?

3. 分别有什麼作用?

1. 為什麼會有自旋鎖、互斥鎖?

講這些鎖之前,先談以下并發、臨界區、同步的概念。

1.1 并發 臨界區 同步

臨界區:是作業系統的概念,每個程序中通路共享資源的代碼段稱為臨界區;

并發:分為單處理器和多處理器上的并發。

如果在單處理器主機上發生并發,在這種主機中多個線程共享同一個 CPU 并且搶占(preemption)建立競态條件。搶占 通過臨時中斷一個線程以執行另一個線程的方式來實作 CPU 共享。競态條件發生在兩個或更多線程操縱一個共享資料項時,其結果取決于執行的時間;

如果在在多處理器計算機中并發,其中每個處理器中共享相同資料的線程同時執行。注意在 MP 情況下存在真正的并行(parallelism),因為線程是同時執行的。而在 UP 情形中,并行是通過搶占建立的。

下面通過一個例子來說明并發:

如果不是并發:

對資源i的通路:ProcessA和B通路後得到正确的結果應該是9:

自旋鎖 互斥鎖自旋鎖 互斥鎖

程序是并發執行,有可能得到的結果是:8

自旋鎖 互斥鎖自旋鎖 互斥鎖

于是,為了阻止這種情況發生,保證對資源通路的原子操作,引入了鎖機制。

這裡又引入了一個新名詞,什麼是原子操作。一作業系統老師說過,最煩解釋一個名詞時又使用另外一個名詞。

原子操作:不可被中斷的一個或一系列操作。

同步:同步的概念一般和互斥的概念一起講。程序同步也是程序之間直接的制約關系,是為完成某種任務而建立的兩個或多個線程,這個線程需要在某些位置上協調他們的工作次序而等待、傳遞資訊所産生的制約關系。程序間的直接制約關系來源于他們之間的合作。

1.2 鎖

通過加鎖來保證程序間的同步,因為加鎖後,程序對共享資源的通路操作都是原子操作,不會出錯(另外一種常用的同步機制是barrier,之前在塊裝置層見過barrier)。

鎖的種類有很多,如互斥鎖,自旋鎖,讀寫鎖,現在用的比較多的是互斥鎖和自旋鎖,是以下面介紹一下互斥鎖和自旋鎖。

2. 互斥鎖和自旋鎖

2.1 兩種鎖的基本概念

互斥鎖(mutexlock):最常使用于線程同步的鎖;标記用來保證在任一時刻,隻能有一個線程通路該對象,同一線程多次加鎖操作會造成死鎖;

自旋鎖(spinlock):同樣用來标記隻能有一個線程通路該對象,在同一線程多次加鎖操作會造成死鎖;

2.2 兩種鎖的對比

兩種鎖的加鎖原理

互斥鎖:線程會從sleep(加鎖)——>running(解鎖),過程中有上下文的切換,cpu的搶占,信号的發送等開銷。

自旋鎖:線程一直是running(加鎖——>解鎖),死循環檢測鎖的标志位,機制不複雜。

兩種鎖的差別

互斥鎖的起始原始開銷要高于自旋鎖,但是基本是一勞永逸,臨界區持鎖時間的大小并不會對互斥鎖的開銷造成影響,而自旋鎖是死循環檢測,加鎖全程消耗cpu,起始開銷雖然低于互斥鎖,但是随着持鎖時間,加鎖的開銷是線性增長。

兩種鎖的應用

互斥鎖用于臨界區持鎖時間比較長的操作,比如下面這些情況都可以考慮:

1 臨界區有IO操作

2 臨界區代碼複雜或者循環量大

3 臨界區競争非常激烈

4 單核處理器

至于自旋鎖就主要用在臨界區持鎖時間非常短且CPU資源不緊張的情況下。

3. 有什麼用

就是起同步作用,保護共享資源。

補充一個死鎖的概念:

死鎖是指多個執行線程互相等待被對方占用的資源,但永遠不會釋放各自擁有的資源,導緻衆線程永遠無法得到執行。

死鎖發生的4個必要條件:

)互斥條件:指程序對所配置設定到的資源進行排它性使用,即在一段時間内某資源隻由一個程序占用。如果此時還有其它程序請求資源,則請求者隻能等待,直至占有資源的程序用畢釋放。

2)請求和保持條件:指程序已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它程序占有,此時請求程序阻塞,但又對自己已獲得的其它資源保持不放。

3)不剝奪條件:指程序已獲得的資源,在未使用完之前,不能被剝奪,隻能在使用完時由自己釋放。

4)環路等待條件:指在發生死鎖時,必然存在一個程序——資源的環形鍊,即程序集合{P0,P1,P2,···,Pn}中的P0正在等待一個P1占用的資源;P1正在等待P2占用的資源,……,Pn正在等待已被P0占用的資源。(百度百科)

參考:

[1] http://blog.chinaunix.net/uid-22002972-id-1805575.html

[2] http://www.cnblogs.com/bastard/archive/2012/09/19/2694243.html

[3] http://blog.csdn.net/kyokowl/article/details/6294341

[4] http://www.cnblogs.com/CareySon/archive/2012/04/14/Process-SynAndmutex.html

[5] http://www.cnblogs.com/hdflzh/p/3716156.html

繼續閱讀