阻塞(休眠)呼叫是沒有獲得資源則掛起程序,被掛起的程序進入休眠狀態,呼叫的函式只有在得到結果之後才返回,程序繼續。
非阻塞(休眠)是不能進行裝置操作時不掛起,或返回,或反覆查詢,直到可以進行操作為止,被呼叫的函式不會阻塞當前程序,而會立刻返回。
因為阻塞的程序會進入休眠狀態,因此,必須確保有乙個地方能夠喚醒休眠的程序。喚醒程序的地方
最大可能發生在中斷裡面,因為硬體資源獲得的同時往往伴隨著乙個中斷。
使用wait_event()函式使得程序睡眠;而在核心另一處有乙個對應的wake_up()函式被呼叫
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 的程序。
功能函式所在路徑kernel/include/linux/wait.h, kernel/kernel/sched.c, kernel/kernel/wait.c.
核心資料結構 等待佇列
struct __wait_queue_head ;
typedef struct__wait_queue_head wait_queue_head_t;
使用方法:
涉及標頭檔案kernel/include/linux/wait.h
#include
在資料結構體中定義
wait_queue_head_t xx
程序通過執行下面步驟將自己加入到乙個等待佇列中:
1) 呼叫declare_waitqueue
(wait, current)
定義和初始化乙個等待佇列頭 //代替wait_queue_head_t my_queue和init_waitqueue_head(&my_queue);
2) 呼叫add_wait_queue()把自己加入到等待佇列中。該佇列會在程序等待的條件滿足時喚醒它。在其他地方寫相關**,在事件發生時,對等的佇列執行wake_up()操作。
3) 將程序狀態變更為: task_interruptible or task_uninterruptible。
4) 如果狀態被置為task_interruptible ,則訊號喚醒程序。即為偽喚醒(喚醒不是因為事件的發生),因此檢查並處理訊號。
5) 檢查condition是否為真,為真則沒必要休眠,如果不為真,則呼叫scheduled()。
6) 當程序被喚醒的時候,它會再次檢查條件是否為真。真就退出迴圈,否則再次呼叫scheduled()並一直重複這步操作。
7) condition滿足後,程序將自己設定為task_running 並通過remove_wait_queue()退出。
sleep_on系列函式在linux**中已注釋不讓使用,將在**中剔除
阻塞和非阻塞
在 windows 下的 socket 程式設計有兩個程式設計模型,阻塞和非阻塞。有時,他們也被叫做同步 阻 塞 和非同步 非阻塞 在 unix 中只支援阻塞模型。阻塞 indy 使用阻塞 socket 呼叫。阻塞呼叫很像乙個檔案的讀寫。當你讀資料或者寫資料時,直 到操作完成,函式才會返回。不同的是...
阻塞和非阻塞
在 windows 下的 socket 程式設計有兩個程式設計模型,阻塞和非阻塞。有時,他們也被叫做同步 阻 塞 和非同步 非阻塞 在 unix 中只支援阻塞模型。阻塞 indy 使用阻塞 socket 呼叫。阻塞呼叫很像乙個檔案的讀寫。當你讀資料或者寫資料時,直 到操作完成,函式才會返回。不同的是...
Linux阻塞與非阻塞
1.阻塞 block 概念 指程序或執行緒在執行裝置操作或管道,或則網路時,不能獲取到資源就被掛起,直到滿足可操作的條件後在進行操作,被掛起的程序進入休眠狀態,從執行佇列移走,直到 等待的條件滿足才繼續執行。也就是執行到某些函式時必須等待某個事件發生函式才返回。2.非阻塞 non block 程序就...