unp筆記三 IO複用基礎概念

IO複用的使用場合

客戶端

客戶處理多個描述符(交互式輸入和網絡套接字),或者客戶處理多個套接字

服務器

服務器處理監聽套接字和已連接套接字,處理TCP和UDP,或者處理多個協議多個服務等

理解IO中的簡單例子,讀數據,兩個階段

1 等待數據準備好(數據從網絡中到達內核緩衝區)

2 從內核緩衝區嚮應用進程緩衝區複製數據

UNIX下的IO模型

阻塞式IO

進程調用recvfrom,從調用recvfrom開始到數據報到達,到被複制到應用進程緩衝區中,recvfrom才返回
當然中間要是發生錯誤(被信號中斷)也會返回

非阻塞式IO

進程把一個套接字設置成非阻塞是在通知內核:當請求的IO操作非得把本進程投入睡眠(阻塞起來)才能完成時,不要這樣做,而是馬上返回一個錯誤。
當把套接字設置成非阻塞時,調用recvfrom,在沒有數據可以返回時,內核立即返回一個EWOULDBLOCK。
當內核中的數據準備好時,將數據複製到用戶空間,這段時間是在recvfrom中要消耗的。
非阻塞IO往往消耗大量CPU。


IO複用

不要把IO複用看成神,其實它和阻塞IO還挺像的。select的優勢在於我們可以同時等待多個描述符就緒。阻塞式IO只能同一時刻等待一個描述符,如果我們在多線程中使用阻塞式IO,則與IO複用非常相似。
我們舉個往套接字上讀的例子:1、進程阻塞中select上,等待內核準備好數據,當套接字可讀,select返回
2、接着可以調用recvfrom,將數據從內核複製到用戶進程緩衝區

信號驅動式IO

首先開啓套接字的信號驅動式IO功能,安裝自己建立SIGIO的信號處理函數。系統調用立即返回,進程繼續工作,當數據準備好時,內核發送SIGIO信號給進程。在沒收到信號的這段時間,我們各忙各的。收到信號後,再調用讀寫函數。

異步IO

說了那麼久,現在才說異步IO,這麼說,剛剛寫的,以上的4中IO模型都不是異步IO,都是同步IO!
那樣的話,什麼才叫同步IO,什麼叫異步IO?
異步IO:在IO操作過程中,不導致進程阻塞
同步IO:導致進程阻塞,直至IO操作完成。
以上4中IO,在最終從內核複製數據到進程空間時,都是要調用讀寫函數,並且會導致進程阻塞在此複製過程中。
這麼說,異步IO就相當厲害了。所有事情完成後再通知進程,異步IO直接自己處理好2個階段。階段?什麼階段?看上面講的。。。。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章