Linux 等待佇列

2021-06-19 19:31:07 字數 1036 閱讀 6126

在閱讀tun驅動時看到,有一些類似 add_wait_queue 的函式,這些函式正是執行等待佇列的相關操作,要說等待佇列還得從核心程序排程說起,核心排程系統內程序,分配時間片,但是有些程序如從網絡卡中讀資料,在 網絡卡有資料到達之前程序處於阻塞狀態,如果此時給相應程序分配時間片做排程,無疑是浪費系統資源,所以系統內每個程序都有自己的狀態標誌 task->state,這些狀態定義於檔案 include/linux/sched.h

#define task_running            0

#define task_interruptible 1

#define task_uninterruptible 2

...

核心只會呼叫標誌是 task_running 的程序,如果需要等待資源,可以設定自己的程序標誌為 task_interruptible (可中斷)或者 task_uninterruptible (不可中斷),然後呼叫 schedule();放棄cpu,此程序就不會被核心排程了,但隨之而來的問題是,如果程序所需資源可以使用,如何喚醒程序呢,這就要依賴於等待佇列 了,程序在放棄控制權之前,把自己加入乙個佇列中,當所需條件滿足,其他程序便可wakeup該佇列,修改程序狀態為 task_running,等待程序便可順利往下執行了。

wait_queue_head_t ******_queue;

init_waitqueue_head(&******_queue);

declare_waitqueue (name, tsk);

void fastcall add_wait_queue(wait_queue_head_t * q, wait_queue_t * wait);

void fastcall remove_wait_queue(wait_queue_head_t * q, wait_queue_t * wait);

void wake_up(wait_queue_head_t * queue);

void wake_up_interruptible(wait_queue_head_t * queue);

linux 等待佇列

linux 核心的等待佇列是以雙迴圈鍊錶為基礎資料結構,與程序排程機制緊密結合,能夠用於實現核心的非同步事件通知機制。在這個鍊錶中,有兩種資料結構 等待佇列頭 wait queue head t 和等待佇列項 wait queue t 等待佇列頭和等待佇列項中都包含乙個 list head 型別的域...

linux 等待佇列

linux 核心的等待佇列是以雙迴圈鍊錶為基礎資料結構,與程序排程機制緊密結合,能夠用於實現核心的非同步事件通知機制。在這個鍊錶中,有兩種資料結構 等待佇列頭 wait queue head t 和等待佇列項 wait queue t 等待佇列頭和等待佇列項中都包含乙個 list head 型別的域...

Linux等待佇列

等待佇列主要用於 當任務 程序 由於某個條件得不到滿足時,為避免不必要的輪詢,使得程序在等待期間進入睡眠狀態,直到等待的條件得到滿足時由核心喚醒,進入執行狀態。等待佇列是基於雙迴圈鍊錶 structlist head 來實現的,與程序排程機制緊密結合,能夠用於實現核心的非同步事件通知機制。struc...