網絡I/O模型--5種常見的網絡I/O模型


 

阻塞與非阻塞

  阻塞就是卡在那兒什么也不做,雙方之間也沒有信息溝通。

  非阻塞就是即使對方不能馬上完成請求,雙方之間也有信息的溝通。

同步與異步

  同步就是一件事件只由一個過程處理完成,不論阻塞與非阻塞,最后完成這個事情的都是同一個過程

  異步就是一件事由兩個過程完成,前面一個過程通知,后面一個過程接受返回的結果。

異步和事件驅動(multi IO)

  異步是指數據准備好並且已經拷貝到用戶空間,在通知用戶來取數據

       事件驅動理解為准備好數據了但是沒有拷貝到用戶空間,這個時候去通知用戶,用戶再去取數據,經過拷貝過程取得數據。 

 

5種常見的網絡I/O模型

  • blocking I/O  -- 阻塞類型的I/O
  • nonblocking I/O -- 非阻塞類型的I/O
  •  I/O Multiplexing -- 多路復用型I/O 
  •  Signal-Driven I/O -- 信號驅動型I/O
  •  Asynchronous I/O -- 異步I/O 

   

 

 

1. blocking I/O  -- 阻塞類型的I/O

  流程圖如下:

    

  linux下socket默認是阻塞的,阻塞模式在准備數據和拷貝數據兩個過程都是阻塞的,在這期間客戶端一直卡着,雙方也沒有數據交流。

2.nonblocking I/O -- 非阻塞類型的I/O

  流程圖:

    

 

     linux下使用fcntl方法將socket設置為非阻塞模式 

    flags = fcntl(sockfd, F_GETFL, 0);                        //獲取文件的flags值。

              fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);   //設置成非阻塞模式;

  非阻塞模式下,如果數據還沒有准備好,服務端會返回error,客戶端根據這個error判斷后,再次發起recv,直到數據准備好,這個過程雖然客戶端也在這里卡着了,但是這期間一直和服務有着信息交換。

 

3.I/O Multiplexing -- 多路復用型I/O

  流程圖:

       

 

  多路復用型IO,有的也稱為事件驅動型IO,常用select,poll,epoll來處理多個IO連接狀態。當某個IO連接的數據准備好了,select返回,通知用戶進行read操作,這種IO的好處是一次可以監聽多個連接,壞處是要兩次調用,兩次返回,單個連接和非阻塞IO沒有多大的性能提升。

    在多路復用模型中,對於每一個socket,一般都設置成為non-blocking,但是,如上圖所示,整個用戶的process其實是一直被block的。只不過process是被select這個函數block,而不是被socket IO給block。因此select()與非阻塞IO類似。

 

4.Signal-Driven I/O -- 信號驅動型I/O

  流程圖:

  

 

  首先我們允許套接口進行信號驅動I/O,並安裝一個信號處理函數,進程繼續運行並不阻塞。當數據准備好時,進程會收到一個SIGIO信號,可以在信號處理函數中調用I/O操作函數處理數據。

 

5.Asynchronous I/O -- 異步I/O

   流程圖:

    

  當一個異步過程調用發出后,調用者不能立刻得到結果。實際處理這個調用的部件在完成后,通過狀態、通知和回調來通知調用者的輸入輸出操作

  

 

 

參考資源:

  http://www.cnblogs.com/findumars/p/6361627.html

  https://www.cnblogs.com/kunhu/p/3624000.html

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM