信號量: 是用來解決進程/線程之間的同步和互斥問題的一種通信機制,是用來保證兩個或多個關鍵代碼不被併發調用。 信號量(Saphore)由一個值和一個指針組成,指針指向等待該信號量的進程。信號量的值表示相應資源的使用情況。信號量S>=0時,S表示可用資源的數量。執行一次P操作意味著請求分配一個資源,因 ...
信號量:
是用來解決進程/線程之間的同步和互斥問題的一種通信機制,是用來保證兩個或多個關鍵代碼不被併發調用。
信號量(Saphore)由一個值和一個指針組成,指針指向等待該信號量的進程。信號量的值表示相應資源的使用情況。信號量S>=0時,S表示可用資源的數量。執行一次P操作意味著請求分配一個資源,因此S的值減1;當S<0時,表示已經沒有可用資源,S的絕對值表示當前等待該資源的進程數。請求者必須等待其他進程釋放該類資源,才能繼續運行。而執行一個V操作意味著釋放一個資源,因此S的值加1;若S<0,表示有某些進程正在等待該資源,因此要喚醒一個等待狀態的進程,使之運行下去。
也就是說信號量通過PV操作同步解決了進程/線程對臨界資源利用的衝突問題;
信號量是選擇睡眠的方式來對共用工作停止訪問的。
互斥鎖:
互斥鎖同樣也是對線程間(不能對進程)同步和互斥的一種另一種機制。
互斥鎖更多的是強調對共用資源的鎖定作用,當一個線程占用了當前共用資源,使用互斥鎖將其lock住之後,其他線程就無法訪問,必須等到unlock之後,其他線程才能利用共用資源裡面的內容;
也就是說互斥鎖通過對共用資源的鎖定和互斥解決利用資源衝突問題;
互斥鎖是選擇睡眠的方式來對共用工作停止訪問的。
自旋鎖:
是為實現保護共用資源而提出一種鎖機制。其實,自旋鎖與互斥鎖比較類似,它們都是為瞭解決對某項資源的互斥使用。無論是互斥鎖,還是自旋鎖,在任何時刻,最多只能有一個保持者,也就說,在任何時刻最多只能有一個執行單元獲得鎖。但是兩者在調度機制上略有不同。對於互斥鎖,如果資源已經被占用,資源申請者只能進入睡眠狀態。但是自旋鎖不會引起調用者睡眠,如果自旋鎖已經被別的執行單元保持,調用者就一直迴圈在那裡看是否該自旋鎖的保持者已經釋放了鎖,"自旋"一詞就是因此而得名。
以上總結幾點,互斥鎖與信號量的區別:
1、信號量一般以同步的方式對共用資源進行控制,而互斥鎖通過互斥的方式對共用資源對其進行控制;
2、信號量可以對進程的共用資源進行控制,而互斥鎖不行;
3、信號量的值為非負整數,而互斥鎖的值只能為0或1;
4、互斥量的加鎖和解鎖必須由同一線程分別對應使用,信號量可以由一個線程釋放,另一個線程得到;
自旋鎖與互斥鎖的區別:
1、因為自旋鎖不會引起調用者睡眠,所以效率比較高
2、自旋鎖比較適用於鎖使用者保持鎖時間比較短的情況。
3、自旋鎖容易造成死鎖,所以需要安全使用它;