等待佇列 阻塞非阻塞

2022-03-19 04:28:28 字數 2794 閱讀 5640

阻塞

裝置驅動不阻塞,使用者想獲取裝置資源只能不停的查詢,這無謂的消耗cpu資源。而阻塞訪問,不能獲取資源的程序將進入休眠,它將cpu資源「禮讓」給其他程序

喚醒程序的地方最大可能發生在中斷裡面,因為硬體資源獲得的同時往往伴隨著乙個中斷

定義頭

wait_queue_head_t queue;
初始化頭

#define init_waitqueue_head(q)
定義

#define declare_waitqueue(name, tsk)
新增

extern

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

移除

extern

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

等待事件

#define wait_event(wq, condition)

#define wait_event_timeout(wq, condition, timeout)

#define wait_event_interruptible(wq, condition)

#define wait_event_interruptible_timeout(wq, condition, timeout)

wq:等待佇列

condition:必須滿足,否則繼續阻塞

interruptible:可以被訊號打斷

timeout:超時時間。不論condition是否滿足,均返回

wait_event

#define wait_event(wq, condition)                   \

do while (0)

#define __wait_event(wq, condition) \

do \

finish_wait(&wq, &__wait); \

} while (0)

喚醒

#define wake_up(x)

#define wake_up_interruptible(x)

wake_up和wait_event或wait_event_timeout成對使用,wake_up_interruptible和wait_event_interruptible或wait_event_interruptible_timeout成對使用

wake_up可喚醒處於task_interruptible和task_uninterruptible的程序,wake_up_interruptible只能喚醒處於task_interruptible的程序

在等待佇列上睡眠

extern

void sleep_on(wait_queue_head_t *q);

extern

long sleep_on_timeout(wait_queue_head_t *q,

signed

long timeout);

extern

void interruptible_sleep_on(wait_queue_head_t *q);

extern

long interruptible_sleep_on_timeout(wait_queue_head_t *q,

signed

long timeout);

一般不用,而是直接進行狀態切換

舉例

if (mutex_lock_interruptible(&ir->buf_lock))

return

-erestartsys;

declare_waitqueue(wait, current); //定義等待佇列

add_wait_queue(&ir->buf.wait_poll, &wait); //新增等待佇列

set_current_state(task_interruptible); //改變程序狀態

while (written < n)

if (signal_pending(current)) //因訊號喚醒

schedule(); //排程其他程序

set_current_state(task_interruptible);

} else

}remove_wait_queue(&ir->buf.wait_poll, &wait); //將等待佇列移出等待佇列頭

set_current_state(task_running); //改變程序狀態task_running

mutex_unlock(&ir->buf_lock);

Linux 裝置驅動阻塞 非阻塞IO 等待佇列

阻塞 顧名思義,就是指在執行裝置操作時若不能獲得資源則掛起操作,直到滿足可操作的條件後再進行操作,被掛起的程序進入休眠狀態,被從排程器的執行佇列移 走,直到等待的條件滿足。非阻塞 就是反過來,程序在不能進行裝置操作時並不掛起,它或者放棄,或者不停的查詢,直到可以進行位置。小王,明白了沒這兩個基本的概...

阻塞 非阻塞

阻塞和非阻塞指 的是在接收和傳送時是否等待動作完成才返回 舉例 阻塞 block 是指,你撥通某人 的 但是此人不在,於是你拿著 等他回來,其間不能再用 非阻塞 nonblock 是指,你撥通某人 的 但是此人不在,於是你結束通話 待會兒再打。至於到時候他回來沒有,只有打了 才知道。即所謂的 輪詢 ...

阻塞非阻塞

阻塞和非阻塞 阻塞 可用在assign語句和always語句中,表示只要源訊號發生變化,目標訊號就立刻完成賦值操作,在always塊中,結果與語句順序有關,在always塊中是順序關係 非阻塞 只能用在always語句中,表示該語句結束時完成賦值操作,結果與語句順序無關,並行關係 可以這樣理解 阻塞...