阻塞
裝置驅動不阻塞,使用者想獲取裝置資源只能不停的查詢,這無謂的消耗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:等待佇列wait_eventcondition:必須滿足,否則繼續阻塞
interruptible:可以被訊號打斷
timeout:超時時間。不論condition是否滿足,均返回
#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語句中,表示該語句結束時完成賦值操作,結果與語句順序無關,並行關係 可以這樣理解 阻塞...