spinlock理解

鎖理解:
1、比如自旋鎖,如果一個CPU的情況:
他是指的線程運行的主體CPU或者對應的線程core在在某個線程或者進程已開始進來加鎖成功後,然後CPU就在時間片內一直執行鎖內部的代碼操作,在時間片結束的最後一個CPU指令是中斷處理,也就是需要切換CPU到其他進程或者線程,如果此時是加的自旋鎖,則被切換的線程2執行到加鎖位置,此時因爲鎖在線程1上還沒有被釋放,所以線程2讓這個CPU繼續忙等待什麼都不做,拜拜浪費CPU,直到這個時間片到達過去,切換到下一個線程,同樣也是白白浪費到下一個線程CPU執行週期,最終這個CPU切換到最開始那個線程,到這裏可以執行接下來的程序,但是可能又被切走,這樣就相當於會白白浪費很多線程上的白等待時間,看起來有死鎖的味道。因此在單CPU上如果上自旋鎖,則只能是CPU不聽的切換(時間片到了),但是切換後還是什麼都幹不了,就是不停的切換不停的自旋,最終這個那個CPU在整個時間週期都在自旋,所以自旋鎖不能在單個CPU上執行。
同樣,如果是信號量呢,則切換到線程2時候,由於獲取不到信號量,則睡眠(意思就是讓出CPU,讓CPU切換到其他線程的去執行)。這樣CPU就很快被切換走,不會忙等待白自旋。等一會CPU在切換到線程1時候,繼續執行線程1的動作,執行完成後,釋放鎖,切換去執行其他線程。

Spinlock可以用在中斷上下文中嗎?
Spinlock和中斷的關係,因爲一般情況下,spinlock會被一個單獨的進程使用,進程拿到這個鎖,然後進行臨界區的修改,然後在釋放鎖。但是如果在這過程中存在中斷髮生,中斷處理程序就可能會在進程正在處理持有鎖的過程中被中斷打斷,以至於CPU被切換去處理中斷的動作,此時執行的主體就是中斷上下文中,此時可能存在中斷上下文也會修改臨界區資源,這樣就沒有做到臨界區的互斥了。所以爲了解決這個問題, spinlock支持在加鎖過程中關閉中斷,也就是過程中不處理本CPU上的中斷,其他CPU不關係。這個接口就是spin_lock_irqsave.這樣在CPU加鎖執行spinlock的過程中CPU不會被中斷切走執行。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章