1. 程式人生 > >網路I/O模型--5種常見的網路I/O模型

網路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