從Linux驅動角度說阻塞/非阻塞與異步/同步


緣起
正在讀《Linux設備驅動開發詳解》,遇到了自己被自己搞糊塗的概念:阻塞/非阻塞和同步/異步,覺得有必要停下來好好理解一下概念(一直以為阻塞與同步在概念上是一樣的,非阻塞就是異步),然后再向前走。這說明,扎實的基礎對工作和學習的意義。

正文
首先看看這幾個概念在Linux設備驅動這個大背景下是如何描述的,不能說定義,因為我沒有找到正式一些的定義。
一、阻塞:在執行設備操作時,若不能獲得資源,則掛起進程直到滿足可操作的條件后再進行操作。被掛起的進程進入休眠狀態,被從調度器的運行隊列中移走,直到等待的條件被滿足。
注:上面的描述摘自書中8.1節。下面提出我自己的疑問與解釋。上述描述的主要對象是進程,這個要強調一下,不是線程也不是socket1.“若不能獲得資源”,造成這個結果的可能原因是,這個資源在臨界區並且正在被其他進程所占用(可以參考上一章Linux中並發控制訪問的手段:原子操作、中斷屏蔽、自旋鎖和信號量)。
2.什么是掛起。就像描述中所說,掛起是操作系統將此進程從調度器的運行隊列中(內存中)移走。移到哪里去呢?移動到磁盤(或稱為外存)上的掛起隊列(suspend queue)中。而當操作系統覺得條件滿足時,就把此進程從外存移入內存,這個過程又叫做激活(activate)。
3.自己簡單的理解:阻塞就是操作系統將進程掛起了,而進程也睡眠了。
實現的方法是等待隊列(wait queue)

二、非阻塞:與阻塞的區別在於,遇到不能進行設備操作時,它並不掛起,而是有兩個選擇:一個是放棄,另一個是不停的查詢,直到可以進行操作為止。
注:不停的查詢就是輪詢,用select()和poll()來實現。

三、異步:一旦設備准備就緒,它會主動通知應用程序(那個進程)。這個過程又被稱為“信號驅動的異步I/O”。
信號:軟件層面上對中斷機制的模擬。一個進程收到一個信號與處理器收到一個中斷請求,效果上應該是一樣的。
注:Linux2.6提供了專門的異步I/OAIO。

四、同步:這個詞在不同的語境中有不同的解釋,下面我試圖在幾個方面來說明。
1.百科中對同步的物理學解釋:synchronous;sync;synchronism;synchronization 指兩個或兩個以上隨時間變化的量在變化過程中保持一定的相對關系。
2.多線程或多進程的同步:當兩個或以上的進程(或線程)需要訪問同一資源時,它們需要某種順序來確保該資源(此時可以稱為臨界區資源)某一時刻只能被一個進程(或線程)使用的方式。
3.通信(信息傳輸)方面的同步與異步:通信雙方必須先建立同步,即雙方的時鍾要調整到同一個頻率。收發雙方不停地發送和接收連續的同步比特流(按照一定的順序)。而異步通信,發送的數據的順序是任意的。
4.socket編程上的同步和異步:我個人認為同步與阻塞,異步與非阻塞表達的意思相同。

參考:
《Linux設備驅動開發詳解》(第2版)
操作系統:精髓與設計原理(原書第6版)

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com