1. 程式人生 > >Netty 從零到一學習系列之番外篇

Netty 從零到一學習系列之番外篇

    要搞懂Netty首先需要了解什麼是非同步I/O?什麼是同步I/O?什麼是阻塞I/O?什麼是非阻塞I/O? 在《UNIX網路程式設計》一書中介紹了五種I/O模型。分別為:阻塞I/O模型、非阻塞I/O模型、I/O多路複用模型、訊號驅動I/O模型和非同步I/O模型。下面分別介紹以下這五種I/O模型

  一、I/O模型介紹

    場景描述:一次網路的資料讀取分為:資料準備資料讀取兩個階段。下面就以從網路讀取資料為例介紹以下這五種模式。

 1、阻塞I/O模型

          阻塞I/O模型是最常見的I/O模型。當用戶程序呼叫 recvfrom,此次呼叫直到資料到達且資料從核心複製到應用程序中的緩衝區中或者發生錯誤返回,再次期間應用程序一直等待。也就是使用者呼叫後在核心資料準備階段和資料讀取階段應用程序將一直阻塞。如下圖所示:

    2、非阻塞I/O模型

      非阻塞I/O模型就是當應用程式衝網路讀取資料時,如果核心中資料還未準備就緒,就會直接返回一個EWOUDBLOCK錯誤,一般是應用程式會迴圈查詢資料就緒狀態,如果核心中資料準備就緒,應用程式就會等待核心把就緒的資料拷貝到應用程式快取區中(此階段是同步的)。流程如下圖所示:

    3、I/O多路複用模型

        I/O多路複用模型就是應用程式把一個或者多個I/O讀取,註冊到一個select上,阻塞在select操作上,有select檢測資料的就緒狀態,當有一個或者多個數據就緒後就立即返回已就緒的I/O操作,有應用程式在進行資料的拷貝。一般在使用多路複用模型是都為把socket設定為非阻塞模式。直接有select檢測就緒狀態,不用應用程式自己迴圈的去查詢就緒狀態。多路複用的概念就緒有一個執行緒同時檢查多個應用程式的I/O就緒狀態。

    如下圖所示:

    4、訊號驅動I/O模型

       此模型首先開啟套介面訊號驅動I/O功能,並通過系統呼叫sigaction執行一個訊號處理函式(此係統呼叫立即返回,程序繼續工作,它是非阻塞的)。當資料準備就緒時,就為程序生成一個SIGIO訊號,通過訊號回撥通知應用程式呼叫recvfrom來讀取資料,並通知主迴圈函式處理資料。如下圖所示:

    5、非同步I/O模型

     使用者程序發起讀取操作之後,立刻就可以開始去做其它的事。而另一方面,從核心的角度,當它受到一個非同步讀取操作之後,首先它會立刻返回,所以不會對使用者程序產生任何阻塞。然後,核心會等待資料準備完成,然後將資料拷貝到使用者記憶體,當這一切都完成之後,核心會給使用者程序傳送一個signal,告訴它讀取操作完成了。所以這一切都要核心完成後包括資料準備就緒和資料拷貝。如下圖所示:

二、同步/非同步IO,阻塞/非阻塞IO

   上面介紹完了5中I/O模型,下面在回答一下同步I/O和非同步I/O的區別、阻塞I/O和非阻塞I/O的區別

1、阻塞/非阻塞IO

    根據個人理解首阻塞和非阻塞值得是在使用者程序呼叫核心時,如果核心中資料未準備就緒時,如果要去使用者程序等待資料準備就緒這表明是阻塞的,如果資料未準備就緒使用者程序不等待資料的就緒而是立即返回則說明是非阻塞的。

2、同步/非同步IO

 在說明同步I/O/非同步I/O的區別之前,需要先給出兩者的定義。Stevens給出的定義是這樣子的:
    A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes;
    An asynchronous I/O operation does not cause the requesting process to be blocked;

 根據Stevens的定義可知同步、非同步指的是I/O讀取環節,如果在讀取資料時使用者執行緒一直被阻塞,則說明是同步IO操作,如上邊介紹的阻塞I/O、非阻塞I/O和I/O多路複用都屬於同步IO操作。如果讀取資料時有核心完成,使用者執行緒沒有被阻塞,則說明屬於非同步IO操作。

綜上所述:阻塞、非阻塞值只得是資料準備階段,同步、非同步指的是IO讀取階段。

說明:在學習過程中主要參考了  《Netty實踐》、《Netty權威指南第二版》和網路部落格。寫此部落格主要是作為學習筆記,增強記憶。