阻塞呼叫是指呼叫結果傳回之前,會暫停目前的執行緒。;非阻塞,指在無法立刻得到結果之前,該函數不會阻塞目前的執行緒,而會立刻傳回。
而物件是否處於阻塞模式和函數是不是阻塞呼叫有很強的相關性,但並非一一對應。在具阻塞物件是可以用非阻塞的呼叫方式,像是透過一定的API去輪詢狀態,在適時去呼叫阻塞函數,就可以避免阻塞。
等侍佇列(wait queue)。
在阻塞裝置的驅動時,可以使用等侍佇列來實現。而且除此外還可以用於中斷處理'、程序同步'定時等。
等待佇列的使用
喚醒等待佇列
(掃描8-5~8-10)
而物件是否處於阻塞模式和函數是不是阻塞呼叫有很強的相關性,但並非一一對應。在具阻塞物件是可以用非阻塞的呼叫方式,像是透過一定的API去輪詢狀態,在適時去呼叫阻塞函數,就可以避免阻塞。
等侍佇列機制
使程式暫時進入睡眠,當等侍訊號來時,便喚醒等侍佇列中處理程序來繼續執行。等侍佇列(wait queue)。
在阻塞裝置的驅動時,可以使用等侍佇列來實現。而且除此外還可以用於中斷處理'、程序同步'定時等。
等待佇列的使用
//定義和初始化等待列頭
struct wait_queue_head_t wait;
//初始化,使用前必須初始化 init_waitqueue_head()
#define DECLARE_WAIT_QUEUE_HEAD(name) \
wait_queue_head_t name=__WAIT_QUEUE_HEAD_INITIALIZER(name)
//定義等待佇列,並初始化一個名為name的等待佇列
#define DECLARE_WAITQUEUE(name,tsk) \
wait_queue_t name=__WAITQUEUE_INITIALIZER(name,tsk)
//增加'移除等待佇列
void add_wait_queue(wait_queue_head_t *q,wait_queue_head_t *wait);
void remove_wait_queue(wait_queue_head_t *q,wait_queue_head_t *wait);
//將wait佇列加(刪)到q佇列
//等待事件
#define wait_event(wq,condition)
//等待直到condition為true。其等待期間其process為TASK_UNINTERRUPTIBLE
#define wait_event_timeout(wq,condition,ret)
//當時間為負則立即傳回。若在時間內wake up(condition=true)則傳回剩下的時間.
//否則,等到時間到並傳回0
#define wait_event_interruptible(wq,condition,ret)
//process設為TASK_INTERRUPTIBLE狀態。若condition為true.則傳回0.
//若是由訊號來wake up則傳回-ERESTARTSYS
#define wait_event_interruptible_timeout(wq,condition,ret)
//
喚醒等待佇列
#define wake_up(x) __wake_up(x,TASK_NORMAL,1,NULL)
//可以喚醒TASK_INTERUPTIBLE和TASK_UNINTERUPTIBLE和wait_even/wait_even_timeout使用
#define wake_up_interruptible(x) __wake_up(x,TASK_INTERUPTIBLE,1,NULL)
//用於另二類
同步機制實驗
(掃描8-5~8-10)
沒有留言:
張貼留言