多個執行緒在等待同一件事件的發生時會進入睡眠狀態,等待事件發生時,它們又會被喚醒從而結束休眠。在被喚醒的過程中,首先需要能夠找到這些程序,而這些等待的程序由乙個稱為等待佇列的資料結構維護著。
等待佇列就是乙個程序鍊錶,其中包含了所有等待某個特定事件的程序。
乙個等待佇列通過乙個「等待佇列頭(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 的函式,這些函式正是執行等待佇列的相關操作,要說等待佇列還得從核心程序排程說起,核心排程系統內程序,分配時間片,但是有些程序如從網絡卡中讀資料,在 網絡卡有資料到達之前程序處於阻塞狀態,如果此時給相應程序分配時間片做排程,無疑是浪費系...