Linux等待佇列

2021-06-27 09:19:47 字數 2215 閱讀 7907

等待佇列主要用於:當任務(程序)由於某個條件得不到滿足時,為避免不必要的輪詢,使得程序在等待期間進入睡眠狀態,直到等待的條件得到滿足時由核心喚醒,進入執行狀態。

等待佇列是基於雙迴圈鍊錶

structlist_head

來實現的,與程序排程機制緊密結合,能夠用於實現核心的非同步事件通知機制。

struct __wait_queue

;typedef struct __wait_queue wait_queue_t;/*等待佇列項*/

struct __wait_queue_head

;typedef struct __wait_queue_head wait_queue_head_t;/*等待佇列頭*/

linux

等待佇列的實現思想:當乙個任務(程序)需要在某個等待佇列

wait_queue_head_t

上睡眠時,將自己的程序控制塊資訊封裝到等待佇列項

wait_queue_t

中,然後掛載到

wait_queue_head_t

的鍊錶中,執行排程睡眠。當等待的某個事件發生後,另乙個任務(程序)會喚醒等待佇列

wait_queue_head_t

上的某個任務或所有任務,喚醒工作即是將等待佇列中的任務設定為可排程狀態,並且從佇列中刪除。

初始化等待佇列

void init_waitqueue_head(wait_queue_head_t *q);

2.2   

等待事件

#define __wait_event(wq, condition)\

do \

finish_wait(&wq, &__wait);\

} while (0)

#definewait_event(wq, condition)\

do while (0)

等待事件函式

描述

wait_event(wq,condition)

程序狀態被設定為

task_uninterruptible

,進入睡眠

wait_event_interruptible(wq, condition)

設程序為

task_interruptible

狀態,睡眠期間被訊號喚醒則返回

-erestartsys

錯誤碼wait_event_interruptible_exclusive(wq, condition)

睡眠的為互斥程序

wait_event_timeout(wq, condition, timeout)

超時返回0

wait_event_interruptible_timeout(wq, condition, timeout)

睡眠期間被訊號喚醒則返回

erestartsys

錯誤碼2.3 

喚醒等待程序

#definewake_up(x)

__wake_up(x, (unsigned int)(task_uninterruptible | task_interruptible), 1, null)

喚醒函式

描述

wake_up(x)

可喚醒程序狀態為

task_uninterruptible

和task_interruptible

的程序,與

wait_event

、wait_event_timeout

成對使用

wake_up_all(x)

喚醒所有等待的程序

wake_up_interruptible(x)

僅喚醒程序狀態為

task_interruptibl

的程序,與

wait_event_interruptible

、wait_event_interruptible_timeout

成對使用 

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 的函式,這些函式正是執行等待佇列的相關操作,要說等待佇列還得從核心程序排程說起,核心排程系統內程序,分配時間片,但是有些程序如從網絡卡中讀資料,在 網絡卡有資料到達之前程序處於阻塞狀態,如果此時給相應程序分配時間片做排程,無疑是浪費系...