2012年6月26日 星期二

裝置驅動中的阻塞和同步機制

阻塞呼叫是指呼叫結果傳回之前,會暫停目前的執行緒。;非阻塞,指在無法立刻得到結果之前,該函數不會阻塞目前的執行緒,而會立刻傳回。
而物件是否處於阻塞模式和函數是不是阻塞呼叫有很強的相關性,但並非一一對應。在具阻塞物件是可以用非阻塞的呼叫方式,像是透過一定的API去輪詢狀態,在適時去呼叫阻塞函數,就可以避免阻塞。


等侍佇列機制

使程式暫時進入睡眠,當等侍訊號來時,便喚醒等侍佇列中處理程序來繼續執行。
等侍佇列(wait queue)。
在阻塞裝置的驅動時,可以使用等侍佇列來實現。而且除此外還可以用於中斷處理'、程序同步'定時等。
image
等待佇列的使用
//定義和初始化等待列頭

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)

沒有留言:

張貼留言