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

 

阻塞與非阻塞html

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

  非阻塞就是即便對方不能立刻完成請求,雙方之間也有信息的溝通。網絡

同步與異步異步

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

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

異步和事件驅動(multi IO)性能

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

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

 

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

  • 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

相關文章
相關標籤/搜索