等待佇列頭init waitqueue head

2021-06-14 02:26:23 字數 1636 閱讀 1207

多個執行緒在等待同一件事件的發生時會進入睡眠狀態,等待事件發生時,它們又會被喚醒從而結束休眠。在被喚醒的過程中,首先需要能夠找到這些程序,而這些等待的程序由乙個稱為等待佇列的資料結構維護著。

等待佇列就是乙個程序鍊錶,其中包含了所有等待某個特定事件的程序。

乙個等待佇列通過乙個「等待佇列頭(wait_queue_head)" 的資料結構管理,它的型別被定義為 wait_queue_head_t , 在 include/linux/wait.h 中可以找到:

複製**

typedef struct __wait_queue_head wait_queue_head_t;

__wait_queue_head 定義為:

struct__wait_queue_head

;

list_head 定義為:

structlist_head;

因為等待佇列是由中斷處理程式和主要核心函式所修改,因此必須對其雙向鍊錶進行保護以免對其同時訪問,這是通過等待佇列頭中的 spinlock 自旋鎖達到的。

靜態初始化乙個等待佇列頭使用下面的巨集:

declare_wait_queue_head (name);

其中的引數 name 是你任意給定的乙個字串。declare_wait_queue_head  定義為:

#define declare_wait_queue_head(name) \

wait_queue_head_t name = __wait_queue_head_initializer(name)

而 __wait_queue_head_initializer 定義為:

#define __wait_queue_head_initializer(name) }

動態初始化方法為:

wait_queue_head_t my_queue;

init_waitqueue_head (&my_queue);

init_waitqueue_head 定義為:

voidinit_waitqueue_head(wait_queue_head_t*q)

spin_lock_init() 函式用來初始化等待佇列頭中的自旋鎖變數。

init_list_head 定義為:

staticinlinevoidinit_list_head(structlist_head

*list)

linux 等待佇列

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

linux 等待佇列

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

Linux 等待佇列

在閱讀tun驅動時看到,有一些類似 add wait queue 的函式,這些函式正是執行等待佇列的相關操作,要說等待佇列還得從核心程序排程說起,核心排程系統內程序,分配時間片,但是有些程序如從網絡卡中讀資料,在 網絡卡有資料到達之前程序處於阻塞狀態,如果此時給相應程序分配時間片做排程,無疑是浪費系...