《深入理解LINUX核心》筆記(五)

2021-07-30 15:43:21 字數 1680 閱讀 2561

一種廣泛應用的同步技術就是加鎖(

locking),當核心控制路徑必須訪問共享資料結構或進入臨界區時,就需要獲取「鎖」

自旋鎖(

spinlock)是用來在一種多處理器環境中工作的一種特殊的鎖

在單處理器系統上,這種鎖本身並不起鎖的作用,自旋鎖原語僅僅是禁止或啟用核心搶占 讀

/寫自旋鎖的引入是為了增加核心的併發能力

允許對資料併發讀可以提高系統效能

對於順序鎖(

seqlock)來說,讀者必須讀資料前後兩次讀順序計數器,若值不同,則暗示剛讀到的值是無效的 讀

-拷貝-更新(

rcu)是為了保護在多數情況下被多個

cpu讀的資料結構而設計的另一種同步技術,(

rcu不使用鎖)

rcu只保護被動態分配並通過指標引用的資料結構 在被

rcu保護的臨界區中,任何核心控制路徑都不能睡眠

記憶體屏障的作用:

只有在資料結構被修改之後,已更新的指針對其他

cpu才是可見的

訊號量,從本質上說,提供了乙個加鎖原語,即讓等待者睡眠,直到等待的資源變為空閒

實際上,

linux提供兩種訊號量:核心訊號量,由核心控制路徑使用

system vipc訊號量,由使用者態程序使用

只有可以睡眠的函式可以獲取核心訊號量,中斷處理程式和可延遲函式都不能使用核心訊號量

核心以嚴格的

fifo順序處理等待讀

/寫訊號量的所有程序

當訊號量被釋放時,就檢查處於等待佇列鍊錶第乙個位置的程序。如果是寫者程序,則其他程序繼續睡眠,如果是讀者程序,其他程序也被喚醒並等待鎖。不過,在寫者程序之後的讀者程序繼續睡眠 補充

completion原語

補充原語和訊號量之間的關係在於如何使用等待佇列中的自旋鎖

在補充原語中,自旋鎖用來確保

complete()和

wait_for_competion()不會併發執行。在訊號量中,自旋鎖用於併發執行的

down()函式訊號量的資料結構

確保組核心語句被當作乙個臨界區處理的主要機制之一就是中斷禁止

可延遲函式可能在不可預知的時間執行

沒有中斷處理程式被啟用,則軟中斷保護就不能非同步地開始

把系統的併發度儲存在盡可能的高的乙個程度

併發讀取決於兩個主要因素:同時運轉的

i/o裝置數;雲是有效工作的

cpu數

為了使i/o裝置吞吐量最大化,應該使中斷禁止保持在很短的時間

為了有效利用

cpu,應盡可能避免使用基於自旋鎖的同步原語

自旋鎖對硬體快取記憶體有影響

原子操作速度快

同步原語的選擇取決於訪問資料結構的核心控制路徑的種類

訪問資料結構的核心控制路徑

單處理器保護

多處理器進一步保護 異常

訊號量無 中斷

本地中斷禁止

自旋鎖

可延遲函式

無無或自旋鎖

異常與中斷

本地中斷禁止

自旋鎖

異常與可延遲函式

本地軟中斷禁止

自旋鎖

中斷與可延遲函式

本地中斷禁止

自旋鎖

異常與可延遲函式

本地中斷禁止

自旋鎖

linux核心使用了幾個巨集,把本地中斷啟用

/禁止與自旋鎖結合起來

深入理解Linux核心 筆記

第一章 緒論 1.unix檔案可以是下列型別之一 a.正規檔案 regular file b.目錄 directroy c.符號鏈 symbolic link d.塊裝置檔案 block oriented device file e.字元裝置檔案 charactor oriented device ...

《深入理解LINUX核心》筆記(四)

每個能夠發出中斷請求的硬體裝置控制器都有一條名為 irq iinterpretrequest 的輸出線 80x86微處理器大約發布了約 20種不同的異常,核心必須位每種異常提供一種專門的異常處理程式 對某些異常,cpu控制單元會在執行異常處理程式前產生乙個硬體出錯碼 hardwareerror co...

深入理解Linux核心 核心同步

核心基本的同步機制 搶占核心的主要特點 乙個在核心態執行的程序,可能在執行核心函式期間被另外乙個程序取代。核心搶占 linux 2.6允許使用者在編譯核心的時候配置十分啟用 程序臨界區 每個程序中訪問臨界資源 一次僅允許乙個程序使用的共享資源 的那段 稱為臨界區。優化屏障 保證編譯程式不會混淆放在原...