Linux自旋鎖與互斥鎖的區別與選用原則

1、區別

1.實現方式上的區別:互斥鎖是基於自旋鎖實現的,因此自旋鎖相較於互斥鎖更加底層。函數

2.開銷上的區別:獲取不到互斥鎖時會發生上下文切換並休眠,而自旋鎖則「自旋」在原地直到被獲取。spa

3.使用場景的區別:互斥鎖只能在進(線)程中使用,不能在中斷裏使用,而自旋鎖能夠在中斷裏使用。class

4.使用方式上區別:互斥鎖只能由獲取到該鎖的進(線)程來釋放,而自旋鎖沒有這個限制,但上鎖和解鎖通常都是成對使用的。效率

2、選用原則

根據上述區別可得出如下三條選用原則:請求

1.當須要保護的臨界區較小時,宜選用自旋鎖,不然選用互斥鎖。由於當鎖不能被獲取到時,互斥鎖的開銷是上下文切換,上下文切換的開銷是很大的。但當臨界區執行時間的開銷大於上下文切換的開銷時,就適合使用互斥鎖了,這種狀況下使用自旋鎖會讓CPU空轉直到其餘執行單元解鎖爲止(還不如發生一次上下文切換),下降了系統效率。di

2.自旋鎖保護的臨界區不能有引發切換上下文(休眠)的函數,但互斥鎖能夠。若自旋鎖保護的臨界區發生上下文切換,而切換上下文後執行的進(線)程又來獲取該自旋鎖,這樣就必然會致使死鎖的發生。另外,互斥鎖保護的臨界區也應該儘可能避免阻塞(例如請求另一個互斥鎖),不然也容易出現死鎖的狀況。時間

3.若是被保護的臨界區處於中斷裏,那麼只能使用自旋鎖。由於互斥鎖可能會致使阻塞,而中斷是不能被阻塞的。co

相關文章
相關標籤/搜索