Linux 工作佇列和等待佇列的區別
wait queue是一種「任務佇列」,可以把一些程序放在上面睡眠等待某個事件,強調靜態多一些,重點在queue上,即它就是一個queue,這個queue如何排程,什麼時候排程並不重要。
對這2個容易混淆的佇列做簡單概念上的區別,怎麼用?
等待佇列在核心中有很多用途,尤其適合用於中斷處理,程序同步及定時。我們在這裡只說,
程序經常必須等待某些事件的發生。例如,等待一個磁碟操作的終止,等待釋放系統資源,或者
等待時間經過固定的間隔。
等待佇列實現了在事件上的條件等待,希望等待特定事件的程序把自己放進合適的等待佇列,並
放棄控制權。因此。等待隊列表示一組睡眠的程序,當某一條件為真時,由核心喚醒它們。
等待佇列由迴圈連結串列實現,其元素包括指向程序描述符的指標。每個等待佇列都有一個等待佇列頭,
等待佇列頭是一個型別為wait_queue_head_t的資料結構。
等待佇列連結串列的每個元素代表一個睡眠程序,該程序等待某一事件的發生,它的描述符地址存放在
task欄位中
然而,要喚醒等待佇列中所有的程序有時並不方便。例如,如果兩個或多個程序在等待互斥訪問某
一個要釋放的資源,僅喚醒等待佇列中一個才有意義。這個程序佔有資源,而其他程序繼續睡眠
可以用DECLARE_WAIT_QUEUE_HEAD(name)巨集定義一個新的等待佇列,該巨集靜態地宣告和初始化名為
name的等待佇列頭變數。 init_waitqueue_head()函式用於初始化已動態分配的wait queue head變數
等待佇列可以通過DECLARE_WAITQUEUE()靜態建立,也可以用init_waitqueue_head()動態建立。程序把
自己放入等待佇列並設定成不可執行狀態。
工作佇列,workqueue,它允許核心程式碼來請求在將來某個時間呼叫一個函式。用來處理不是很緊急事件
的回撥方式處理方法.
工作佇列的作用就是把工作推後,交由一個核心執行緒去執行,更直接的說就是如果您寫了一個函式,而您
現在不想馬上執行它,您想在將來某個時刻去執行它,那您用工作佇列準沒錯
如果需要用一個可以重新排程的實體來執行你的下半部處理,也應該使用工作佇列。它是唯一能在程序上
下文執行的下半部實現的機制,也只有它才可以睡眠。這意味著在需要獲得大量的記憶體時、在需要獲取信
號量時,在需要執行阻塞式的I/O操作時,它都會非常有用