Posted on 2012-11-09 16:34
鑫龍 閱讀(357)
評論(0) 編輯 收藏 引用 所屬分類:
linux內核
自旋鎖可分為用在單核處理器上和用在多核處理器上。單核處理器:
用在單核處理器上,又可分為兩種:
1.系統不支持內核搶占
此時自旋鎖什么也不做,確實也不需要做什么,因為單核處理器只有一個線程在執行,又不支持內核搶占,因此資源不可能會被其他的線程訪問到。
2.系統支持內核搶占
這種情況下,自旋鎖加鎖僅僅是禁止了內核搶占,解鎖則是啟用了內核搶占。
在上述兩種情況下,在獲取自旋鎖后可能會發生中斷,若中斷處理程序去訪問自旋鎖所保護的資源,則會發生死鎖。因此,linux內核又提供了spin_lock_irq()和spin_lock_irqsave(),這兩個函數會在獲取自旋鎖的同時(同時禁止內核搶占),禁止本地外部可屏蔽中斷,從而保證自旋鎖的原子操作。
多核處理器:
多核處理器意味著有多個線程可以同時在不同的處理器上并行執行。舉個例子:
四核處理器,若A處理器上的線程1獲取了鎖,B、C兩個處理器恰好這個時候也要訪問這個鎖保護的資源,因此他倆CPU就一直自旋忙等待。D并不需要這個資源,因此它可以正常處理其他事情。
自旋鎖的幾個特點:
1.被自旋鎖保護的臨界區代碼執行時不能睡眠。單核處理器下,獲取到鎖的線程睡眠,若恰好此時CPU調度的另一個執行線程也需要獲取這個鎖,則會造成死鎖;多核處理器下,若想獲取鎖的線程在同一個處理器下,同樣會造成死鎖,若位于另外的處理器,則會長時間占用CPU等待睡眠的線程釋放鎖,從而浪費CPU資源。
2.被自旋鎖保護的臨界區代碼執行時不能被其他中斷打斷。原因同上類似。
3.被自旋鎖保護的臨界區代碼在執行時,內核不能被搶占,亦同上類似。