讀書筆記(10) kernel 完成量

2021-10-12 18:06:41 字數 1156 閱讀 8164

完成量特點

自旋鎖訊號量在內的各種鎖類機制都有乙個共同的特點即加鎖者和解鎖者必須是同乙個程序,而完成量不同,a程序加鎖,b程序解鎖的同步原語操作,主要用於程序間通訊。

資料結構

struct completion
其中done欄位表示完成狀態,wait欄位代表等待佇列。工作原理就是:a程序將done

設定為未完成,然後將自己掛接到wait佇列上並進入睡眠(類似於訊號量的加鎖操作down),b程序完成所需要的工作之後,喚醒a程序(類似於訊號量的解鎖操作up),很明顯完成量只能在程序上下文使用,並不能用於中斷上下文。

完成量主要使用的api

宣告乙個完成量(全域性變數):

declare_completion

(work)

在棧內宣告乙個完成量(區域性變數):

declare_completion_onstack

(work)

初始化乙個完成量:

init_completion

(work)

等待乙個完成量完成,當前程序將進入不可中斷睡眠狀態(task_uninterruptible):

wait_for_completion_killable

(x)等待完成量完成,當前程序將進入可中斷睡眠狀態(task_interruptible):

wait_for_completion_timeout

(x,timeout)

等待完成量完成,當前程序進入帶超時值timeout的可殺死睡眠狀態(task_killable):

wait_for_completion_interruptiable_timeout

(x,timeout)

;等待完成量完成,當前程序進入帶超時值timeout的可中斷睡眠狀態(task_interruptiable):

wait_for_completion_interrupt_timeout

(x,timeout)

執行完成操作,並喚醒等待佇列上的第乙個程序:

complete

(x)執行完成操作,並喚醒等待佇列上的所有程序:

complete_all

(x)判斷完成量是否已經完成:

complete_done

(x)

讀書筆記(7) kernel 訊號量

linux 核心中應用最廣泛的同步原語除了自旋鎖就是訊號量 semaphore 可以說自旋鎖和訊號量在很大程度上是一種互補的關係,它們有各自適用的場景,兩者的場景加起來基本上可以覆蓋一切核心中的所有場景。訊號量可以是多值的 多值訊號量 當其為二值訊號量 只有兩個值 時,類似於鎖 乙個值代表未鎖,另乙...

《C Primer》讀書筆記(10)

1.關於繼承 派生類雖然可以訪問基類的公有和保護成員,但是不建議在建構函式裡直接初始化這些值,而是呼叫基類的建構函式來初始化。2.c 11新標準,在類的後面加乙個final關鍵字,即可防止類被繼承。在函式後面加乙個final關鍵字,可以防止函式被覆寫。3.c 11新標準,在派生類中,如果是想覆寫乙個...

Effective cpp 讀書筆記10

set new handler允許客戶指定乙個函式,在記憶體分配無法獲得滿足時被呼叫 nothrow new是乙個頗為侷限的工具,因為它只適用於記憶體分配 後續的構造函式呼叫還是可能丟擲異常 namespace std為了檢測執行錯誤 可能存在記憶體洩漏 資料overruns 寫入點在分配區塊尾端之...