1. 程式人生 > >Linux 工作佇列和等待佇列的區別

Linux 工作佇列和等待佇列的區別

work queue是一種bottom half,中斷處理的後半程,強調的是動態的概念,即work是重點,而queue是其次。

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操作時,它都會非常有用