在軟體開發中任務經常由於某種條件沒有得到滿足而不得不進入睡眠狀態,然後等待條件得到滿足的時候再繼續執行,進入執行狀態。這種需求需要等待佇列機制的支援。linux
中提供了等待佇列的機制,該機制在核心中應用很廣泛。
在linux
核心中使用等待佇列的過程很簡單,首先定義乙個wait_queue_head
,然後如果乙個task
想等待某種事件,那麼呼叫wait_event
(等待佇列,事件)就可以了。
等待佇列應用廣泛,但是核心實現卻十分簡單。其涉及到兩個比較重要的資料結構:
1)__wait_queue_head
,該結構描述了等待佇列的鏈頭,其包含乙個鍊錶和乙個原子鎖,結構定義如下:
struct__wait_queue_head ;
2)__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
)步驟,如果確認條件滿足,退出等待事件函式。
序號程式設計介面
使用說明
1wait_event
這是乙個巨集,讓當前任務處於等待事件狀態。輸入引數如下:
@wq:等待佇列
@conditions
:等待條件
2wait_event_timeout
功能與wait_event
類似,多了乙個超時機制。引數中多了一項超時時間。
3wait_event_interruptible
這是乙個巨集,與前兩個巨集相比,該巨集定義的等待能夠被訊息喚醒。如果被訊息喚醒,那麼返回-erestartsys
。輸入引數如下:
@wq:等待佇列
@condition
:等待條件
@rt:返回值
4wait_event_interruptible_timeout
與(3)相比,多了超時機制
5wake_up
喚醒等待佇列中的乙個任務
6wake_up_all
喚醒等待佇列中的所有任務
Linux中等待佇列機制分析
linux中等待佇列機制分析 在軟體開發中任務經常由於某種條件沒有得到滿足而不得不進入睡眠狀態,然後等待條件得到滿足的時候再繼續執行,進入執行狀態。這種需求需要等待佇列機制的支援。linux 中提供了等待佇列的機制,該機制在核心中應用很廣泛。在linux 核心中使用等待佇列的過程很簡單,首先定義乙個...
Linux等待佇列機制
1.linux核心等待佇列機制 1.1.概念 明確 等待分為忙等待和休眠等待 等待 期望某個事件發生 事件 比如按鍵有操作,串列埠有資料,網路有資料 明確 阻塞一般是指休眠等待 明確 程序的狀態 1.程序的準備就緒狀態 task ready 2.程序的執行狀態 task running 3.程序的休...
Linux中等待佇列的實現
linux中等待佇列的實現 在軟體開發中任務經常由於某種條件沒有得到滿足而不得不進入睡眠狀態,然後等待條件得到滿足的時候再繼續執行,進入執行狀態。這種需求需要等待佇列機制的支援。linux 中提供了等待佇列的機制,該機制在核心中應用很廣泛。在linux 核心中使用等待佇列的過程很簡單,首先定義乙個 ...