IO-同步,異步,阻塞,非阻塞

IO-同步,異步,阻塞,非阻塞
1.什麼是IO
數據在系統內核(kernel)和用戶進程之間的傳遞,稱爲IO。web

2.IO操做步驟
以read爲例,涉及兩個系統對象,調用IO的process(or thread),即用戶進程;另外一個爲系統內核(kernel)。
當用戶進程調用recvfrom操做時,會經歷兩個階段
1)等待數據準備
2)將數據從內核拷貝至進程中網絡

3.IO模型
根據用戶進程在IO操做時的狀態,能夠分爲5中IO類型:
blocking IO:阻塞IO
non-blocking IO:非阻塞IO
IO multiplexing:多Socket鏈接IO
signal driven IO:信號驅動IO
asynchronous IO:異步IO異步

signal driven IO實際中不多使用,在此不作介紹。socket

2.blocking IO:阻塞IO
當用戶進程調用recvfrom時,首先開始IO第一階段:kernel準備數據。
用戶進程會被阻塞。當kernel數據準備好之後,會將數據從kernel拷貝到用戶內存,而後kernel返回結果,用戶進程纔會解除block的狀態,從新運行起來。
blocking IO在IO執行的兩個階段都被block了。async

3.non-blocking IO:非阻塞IO
能夠設置socket使其變爲non-blocking。
當對一個non-blocking socket執行recvfrom操做時,流程以下:
用戶進程調用recvfrom,若是kernel數據尚未準備好,此時用戶進程不會被block。而是馬上返回一個error,從用戶進程角度看,它並無等待,而是馬上獲得了一個結果。
用戶進程判斷是一個error時,它就知道數據尚未準備好,因而再次發送read操做。
一旦kernel中的數據準備好,而且再次收到了用戶進程的system call,那麼它立刻將數據拷貝到用戶內存,而後kernel返回結果。
non-blocking IO在數據準備階段,沒有被block,而是不斷的輪詢kernel數據是否準備好;在數據拷貝階段,用戶進程被block,直到kernel拷貝結束,返回結果,用戶進程纔會解除block的狀態。函數

4.IO multiplexing:多Socket鏈接IO
IO multiplexing的特色是單個用戶進程能夠同時處理多個網絡鏈接IO,它的原理是select/epoll這個function會不斷的輪詢所負責的全部socket,當某個socket有數據到達了,就通知用戶進程。
當用戶進程調用select時,整個進程會被block,當任何一個socket中的數據準備好了,select就會返回。這時用戶進程再調用read操做,將數據從kernel拷貝到用戶進程。咱們能夠看出,IO multiplexing和blocking IO的流程相似,不一樣的是,IO multiplexing須要兩個system call(select和recvfrom),而blocking IO只調用了一個system call(recvfrom)。select的優點在於它能夠同時處理多個socket鏈接。因此若是鏈接數不高的話,使用select/epoll的web server不必定比multi-threading+blocking IO的web server性能更好,select/epoll的優點在於可以處理更多的鏈接。
IO multiplexing中,每個socket通常設置爲non-blocking的,可是用戶進程一直是被select函數block的。性能

5.asynchronous IO
用戶進程發起read操做後,馬上返回能夠去作其餘的事情了。
此時,從kernel角度看,當它收到一個asynchronous read後,首先他馬上返回,因此不會對用戶進程產生任何block,而後,kernel等待數據準備完成,而後將數據拷貝到用戶內存,當這一切完成以後,kernel會給用戶進程發送一個signal告訴用戶進程read操做完成了。server

6.四種IO模型的區別
blocking和non-blocking,synchronous IO和asynchronous IO的區別。
blocking和non-blocking的區別很明顯,blocking會一致阻塞,non-blocking在數據沒準備徹底時會馬上返回。
synchronous同步IO指的是在IO操做時會阻塞用戶進程;asynchronous含義相反。
能夠看出blocking,non-blocking,IO multiplexing都是synchronous IO;而asynchronous不會對用戶進程產生任何阻塞。對象

7.網上有一個比較形象的例子來講明這四種IO Model
有A,B,C,D四我的在釣魚:
A用的是最老式的魚竿,因此呢,得一直守着,等到魚上鉤了再拉桿;
B的魚竿有個功能,可以顯示是否有魚上鉤,因此呢,B就和旁邊的MM聊天,隔會再看看有沒有魚上鉤,有的話就迅速拉桿;
C用的魚竿和B差很少,但他想了一個好辦法,就是同時放好幾根魚竿,而後守在旁邊,一旦有顯示說魚上鉤了,它就將對應的魚竿拉起來;
D是個有錢人,乾脆僱了一我的幫他釣魚,一旦那我的把魚釣上來了,就給D發個短信。進程

相關文章
相關標籤/搜索