linux内核笔记-内核同步
? ? linux內核就相當于不斷對請求進行響應的服務器,這些請求可能來自CPU,可能來自發出中斷的外部設備。我們將內核看作兩種請求的侍者。
? (1)老板提出請求,侍者如果空閑,為老板服務。(系統調用或異常)
? (2)侍者正在無顧客服務時,老板提出請求,則轉去為老板服務。(中斷異常嵌套)
? (3)侍者正為老板服務時,另一老板提出請求,此時轉去為另一個老板服務,回頭再給這個老板服務。(中斷嵌套)
? (4)老板可命令老板停止為當前客戶服務,侍者完成老板請求之后,可能為新選中的顧客服務。(內核搶占)
內核搶占特點:一個內核態運行的進程,可以被執行內核函數期間被另一個進程取代。有關內核搶占參照本文:內核搶占
同步概念
? ? ? 臨界區是一段代碼,進入臨界區的內核控制路徑必須全部執行這段代碼,其他控制路徑才能進入臨界區。單核cpu可以通過簡單的關閉中斷、禁止內核搶占來進行保證臨界區的互斥訪問,多cpu就不行 了。
? ? ? 下列條件不需要同步:
? ? (1)執行中斷的內核路徑不可能被可延遲或系統調用服務例程內核路徑所中斷,所以不需要同步;
? ? (2)軟中斷和tasklet不能再同一個CPU上交替執行,所以僅這兩者存在時,不需要同步;
? ? (3)僅被一種tasklet訪問的數據結構不需要同步。
同步原語
1.每CPU變量
? ? ?最重要的同步技術就是把內核變量聲明為每CPU變量,每CPU變量主要是數據結構的數組,系統每個CPU對應數組的一個元素。一個CPU不應該訪問與其他CPU對應的數組元素。每個CPU可以隨意修改自己的元素不用擔心出現競爭條件。每CPU變量對來自異步函數(中斷和可延遲函數)的訪問不提供保護,在這種情況下需要提供另外的同步原語。內核搶占可導致每CPU變量產生競爭條件。
2.原子操作
? ? ?這樣的操作是芯片原子級的,執行這樣的指令,中間不能中斷,且避免其他的CPU訪問同樣的內存單元。這種原子操作,通過“鎖定”內存總線實現,直到這條指令執行結束為止,其他處理器不能訪問該內存單元。原子操作:
? ? ? atom_read(v),atom_set,atom_add,atom_sub.....
3.優化和內存屏障
? ? ?當使用編譯器的時候,編譯器可能重新安排匯編語言指令以使寄存器以最優的方式執行。當處理同步時,必須避免指令重新排序。可通過設置內存屏障,確保原語之后的操作語句執行之前,原語操作之前的語句已經完成,這樣保證匯編語句順序執行。
4.自旋鎖
? ?? 自旋鎖是用來多處理環境中的一種特殊鎖。如果內核路徑發現鎖是開著的,則可獲取鎖進入臨界區。相反如果內核路徑發現鎖由另一個CPU上的控制路徑所持有,則在周圍“旋轉”(其實,占著cpu死等,等到為止)。
? ? ?自旋鎖的循環指令表示“忙等”(這種忙等,是nop操作,經過linux優化了,說是節省能源)。注意,在忙等期間,內核搶占有效,就是等待的進程可能被其他進程替代。一般來說,由自旋鎖所保護的每個臨界區都是禁止內核搶占的。
spinlock_t含有的兩個字段:
? ? ? slock;自旋鎖的狀態,1表示未加鎖
? ? ? break_lock:表示有無等待該鎖的進程
提供的操作:
? ? ? spin_lock_init();//初始化一把鎖
? ? ? spin_lock();//循環試圖獲得自旋鎖
? ? ? spin_unlock();//釋放鎖
? ? ? spin_unlock_wait();//等待鎖
? ? ? spin_is_locked();//判斷鎖釋是否被持有
5.讀寫自旋鎖
? ? ? 讀寫鎖是為了增加內核的并發能力。該鎖的特點:讀者進程可以同時多個進入臨界區;寫者只能一個進入臨界區(有寫者的時候,讀者無法進入)。讀者和寫者具有相同的優先權。
? ? ? 讀/寫自旋鎖是一個rwlock_t結構。有read_lock和write_lock。
6.順序鎖
? ? ?讀/寫自旋鎖中,讀者和寫者具有相同的優先權。事實上,可以這樣,即使讀者在讀的時候,也可以讓寫者繼續進行,這種策略,寫者永遠不會等待。但是,讀者需要對所讀到的東西檢查,檢查是否有被某個寫者修改,一旦發現被修改,要重新讀取。
7.讀-拷貝-創新(RCU)
? ? ?寫者要寫的時候,拷貝一份出來寫,然后拷回去。
8.信號量
? ? ?信號量其實也是為了實現互斥和同步(無外乎就是一種P/V操作封裝)。但是,信號量中的進程一旦發現資源不可用時,就將自己掛起進入睡眠狀態,這不是一種忙等。
? ? ?然后,使用該資源的進程使用結束后,喚醒正在等待的進程,ok,同步完畢。
? ? ?linux提供兩種信號量:(1)內核信號量,由內核控制路徑控制;(2)System V IPC信號量,用戶態進程使用。
9.信號量
? ? ?跟信號量是一樣的,但是允許多個讀者同時進入設計的,你懂的。
?
總結
以上是生活随笔為你收集整理的linux内核笔记-内核同步的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux——软件包简单学习笔记
- 下一篇: uva 610(tarjan的应用)