1. 程式人生 > >10.Linux核心設計與實現 P148---自旋鎖總結 (轉)

10.Linux核心設計與實現 P148---自旋鎖總結 (轉)

自旋鎖可分為用在單核處理器上和用在多核處理器上。單核處理器:用在單核處理器上,又可分為兩種:1.系統不支援核心搶佔此時自旋鎖什麼也不做,確實也不需要做什麼,因為單核處理器只有一個執行緒在執行,又不支援核心搶佔,因此資源不可能會被其他的執行緒訪問到。2.系統支援核心搶佔這種情況下,自旋鎖加鎖僅僅是禁止了核心搶佔,解鎖則是啟用了核心搶佔。在上述兩種情況下,在獲取自旋鎖後可能會發生中斷,若中斷處理程式去訪問自旋鎖所保護的資源,則會發生死鎖。因此,linux核心又提供了spin_lock_irq()和spin_lock_irqsave(),這兩個函式會在獲取自旋鎖的同時(同時禁止核心搶佔),禁止本地外部可遮蔽中斷,從而保證自旋鎖的原子操作。多核處理器:多核處理器意味著有多個執行緒可以同時在不同的處理器上並行執行。舉個例子:四核處理器,若A處理器上的執行緒1獲取了鎖,B、C兩個處理器恰好這個時候也要訪問這個鎖保護的資源,因此他倆CPU就一直自旋忙等待。D並不需要這個資源,因此它可以正常處理其他事情。自旋鎖的幾個特點:1.被自旋鎖保護的臨界區程式碼執行時不能睡眠。單核處理器下,獲取到鎖的執行緒睡眠,若恰好此時CPU排程的另一個執行執行緒也需要獲取這個鎖,則會造成死鎖;多核處理器下,若想獲取鎖的執行緒在同一個處理器下,同樣會造成死鎖,若位於另外的處理器,則會長時間佔用CPU等待睡眠的執行緒釋放鎖,從而浪費CPU資源。2.被自旋鎖保護的臨界區程式碼執行時不能被其他中斷打斷。原因同上類似。3.被自旋鎖保護的臨界區程式碼在執行時,核心不能被搶佔,亦同上類似。