I/O

我們知道,內核有緩衝區。假設有兩個進程A,B,進程B想讀進程A寫入的東西(即進程A做寫操作,B做讀操作)。進程A需要先寫入到內核緩衝區中,然後B從內核緩衝區中讀取,如圖:

進程

進程B會監聽內核緩衝區的變化

I/O事件的阻塞與同步
當內核緩衝區爲空的時候,進程B會阻塞住
當A往內核緩衝區寫入時,內核緩衝區就不是空狀態了,這時候就會喚醒進程B
如果緩衝區滿了,但是進程B沒有被喚醒,就會通知進程A,告訴A不要再寫入數據了,也就是進程A被阻塞
當進程B被喚醒後,B就從緩衝區讀取數據,由於B在讀數據,緩衝區就不會是滿的狀態了,這時候就會通知A繼續寫數據,也就是進程A被喚醒
如果進程A還沒有喚醒,而緩衝區被B讀完了(緩衝區爲空),這時候就會阻塞進程B
阻塞I/O的缺點
在阻塞I/O情況下,一個線程只能處理一個流的I/O事件。也就是說,如果想處理多個流的I/O事件,就必須使用多進程(fork),或者多線程——效率太低

發佈了40 篇原創文章 · 獲贊 0 · 訪問量 9943
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章