Linux阻塞和非阻塞

2021-08-03 12:23:09 字數 1558 閱讀 6870

阻塞(休眠)呼叫是沒有獲得資源則掛起程序,被掛起的程序進入休眠狀態,呼叫的函式只有在得到結果之後才返回,程序繼續。

非阻塞(休眠)是不能進行裝置操作時不掛起,或返回,或反覆查詢,直到可以進行操作為止,被呼叫的函式不會阻塞當前程序,而會立刻返回。

因為阻塞的程序會進入休眠狀態,因此,必須確保有乙個地方能夠喚醒休眠的程序。喚醒程序的地方

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

使用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 程序就...