linux中等待佇列的實現
在軟體開發中任務經常由於某種條件沒有得到滿足而不得不進入睡眠狀態,然後等待條件得到滿足的時候再繼續執行,進入執行狀態。這種需求需要等待佇列機制的支援。
linux
中提供了等待佇列的機制,該機制在核心中應用很廣泛。
在linux
核心中使用等待佇列的過程很簡單,首先定義乙個
wait_queue_head
,然後如果乙個
task
想等待某種事件,那麼呼叫
wait_event
(等待佇列,事件)就可以了。
等待佇列應用廣泛,但是核心實現卻十分簡單。其涉及到兩個比較重要的資料結構:
__wait_queue_head
,該結構描述了等待佇列的鏈頭,其包含乙個鍊錶和乙個原子鎖,結構定義如下:
struct __wait_queue_head ;
__wait_queue
,該結構是對乙個等待任務的抽象。每個等待任務都會抽象成乙個
wait_queue
,並且掛載到
wait_queue_head
上。該結構定義如下:
struct __wait_queue ;
linux
中等待佇列的實現思想如下圖所示,當乙個任務需要在某個
wait_queue_head
上睡眠時,將自己的程序控制塊資訊封裝到
wait_queue
中,然後掛載到
wait_queue
的鍊錶中,執行排程睡眠。當某些事件發生後,另乙個任務(程序)會喚醒
wait_queue_head
上的某個或者所有任務,喚醒工作也就是將等待佇列中的任務設定為可排程的狀態,並且從佇列中刪除。
使用等待佇列時首先需要定義乙個
wait_queue_head
,這可以通過
declare_wait_queue_head
巨集來完成,這是靜態定義的方法。該巨集會定義乙個
wait_queue_head
,並且初始化結構中的鎖以及等待佇列。當然,動態初始化的方法也很簡單,初始化一下鎖及佇列就可以了。
乙個任務需要等待某一事件的發生時,通常呼叫
wait_event
,該函式會定義乙個
wait_queue
,描述等待任務,並且用當前的程序描述塊初始化
wait_queue
,然後將
wait_queue
加入到wait_queue_head
中。函式實現流程說明如下:
1、用當前的程序描述塊(
pcb)初始化乙個
wait_queue
描述的等待任務。
2、在等待佇列鎖資源的保護下,將等待任務加入等待佇列。
3、判斷等待條件是否滿足,如果滿足,那麼將等待任務從佇列中移出,退出函式。
4、如果條件不滿足,那麼任務排程,將
cpu資源交與其它任務。
5、當睡眠任務被喚醒之後,需要重複(
2)、(
3)步驟,如果確認條件滿足,退出等待事件函式。
等待佇列程式設計介面
序號程式設計介面
使用說明
1 wait_event
這是乙個巨集,讓當前任務處於等待事件狀態。輸入引數如下:
@wq:等待佇列
@conditions
:等待條件
2 wait_event_timeout
功能與wait_event類似,多了乙個超時機制。引數中多了一項超時時間。
3 wait_event_interruptible
這是乙個巨集,與前兩個巨集相比,該巨集定義的等待能夠被訊息喚醒。如果被訊息喚醒,那麼返回- erestartsys。輸入引數如下:
@wq:等待佇列
@condition
:等待條件
@rt:返回值
4 wait_event_interruptible_timeout
與(3)相比,多了超時機制
linux中等待佇列的應用
linux核心裡的等待佇列機制在做驅動開發時用的非常多,多用來實現阻塞式訪問,下面簡單總結了等待佇列的四種用法,希望對讀者有所幫助。1.睡眠等待某個條件發生 條件為假時睡眠 睡眠方式 wait event,wait event interruptible 喚醒方式 wake up 喚醒時要檢測條件是...
Linux中等待佇列機制分析
linux中等待佇列機制分析 在軟體開發中任務經常由於某種條件沒有得到滿足而不得不進入睡眠狀態,然後等待條件得到滿足的時候再繼續執行,進入執行狀態。這種需求需要等待佇列機制的支援。linux 中提供了等待佇列的機制,該機制在核心中應用很廣泛。在linux 核心中使用等待佇列的過程很簡單,首先定義乙個...
Linux中等待佇列機制分析
在軟體開發中任務經常由於某種條件沒有得到滿足而不得不進入睡眠狀態,然後等待條件得到滿足的時候再繼續執行,進入執行狀態。這種需求需要等待佇列機制的支援。linux 中提供了等待佇列的機制,該機制在核心中應用很廣泛。在linux 核心中使用等待佇列的過程很簡單,首先定義乙個wait queue head...