天天看點

五種IO模型:阻塞/非阻塞/複用/信号驅動/異步IO模型1. IO基本概念2. 五種IO模型3. 同步IO和異步IO4. 模式精細講解: MSG_DONTWAIT 、 MSG_WAITALL參考:

五種IO模型:阻塞/非阻塞/複用/信号驅動/異步IO模型

  • 1. IO基本概念
    • 1.1 IO概念
    • 1.2 IO的兩個階段
      • 1.2.1 IO的兩個階段-例子說明
    • 1.2 IO種類
  • 2. 五種IO模型
    • 2.1 阻塞IO模型
      • 2.1.1 舉例子說明:阻塞IO模型
      • 2.1.2 阻塞IO模型
      • 2.1.3 典型應用和特點:
    • 2.2 非阻塞IO模型
      • 2.2.1 舉例子說明:非阻塞IO模型
      • 2.2.2 非阻塞IO模型
      • 2.2.3 典型應用和特點:
    • 2.3 IO複用模型
      • 2.3.1 舉例子說明:IO複用模型
      • 2.3.2 IO複用模型
      • 2.3.3 典型應用和特點:
    • 2.4 信号驅動的IO模型
      • 2.4.1 舉例子說明:信号驅動的IO模型
      • 2.4.2 信号驅動的IO模型
      • 2.4.3 典型應用和特點:
    • 2.5 異步IO模型
      • 2.5.1 舉例子說明:異步IO模型
      • 2.5.2 異步IO模型
      • 2.5.3 典型應用和特點:
  • 3. 同步IO和異步IO
    • 3.1 同步IO:導緻請求程序阻塞,直到I/O操作完成。
    • 3.2 異步IO:不導緻請求程序阻塞。
  • 4. 模式精細講解: MSG_DONTWAIT 、 MSG_WAITALL
  • 參考:

1. IO基本概念

1.1 IO概念

IO (Input/Output,輸入/輸出)即資料的讀取(接收)或寫入(發送)操作

1.2 IO的兩個階段

LINUX中程序無法直接操作I/O裝置(硬碟,列印機,顯示器等),其必須通過系統調用請求kernel來協助完成I/O動作;核心會為每個I/O裝置維護一個緩沖區。

是以,通常使用者程序中的一個完整IO分為兩階段:使用者程序空間<–>核心空間、核心空間<–>裝置空間(磁盤、網絡等)。

1.2.1 IO的兩個階段-例子說明

  1. 核心會為每個I/O裝置維護一個緩沖區。
  2. 對于一個輸入操作來說,程序IO系統調用後,核心會先看緩沖區中有沒有相應的緩存資料,沒有的話再到裝置中讀取,

    因為裝置IO一般速度較慢,需要等待;核心緩沖區有資料則直接複制到程序空間。

  3. 是以,對于一個網絡輸入操作通常包括兩個不同階段:

(1)等待網絡資料到達網卡→讀取到核心緩沖區,資料準備好;

(2)從核心緩沖區複制資料到程序空間。

1.2 IO種類

IO有記憶體IO、網絡IO和磁盤IO三種,通常我們說的IO指的是後兩者。

2. 五種IO模型

五種IO模型包括:阻塞IO模型、非阻塞IO模型、IO複用模型、信号驅動的IO模型、異步IO模型。其中,前四個被稱為同步IO。

2.1 阻塞IO模型

2.1.1 舉例子說明:阻塞IO模型

假設你正在和美女微信聊天,消息發過去後,等待她回複。在等的時候不做其他的事情,十分專心。直到她回複了,你才安心做其他事情。

2.1.2 阻塞IO模型

程序發起IO系統調用後,程序被阻塞,轉到核心空間處理,整個IO處理完畢後傳回程序。操作成功則程序擷取到資料。

2.1.3 典型應用和特點:

  1. 阻塞socket
  2. 特點:

    程序阻塞挂起不消耗CPU資源,及時響應每個操作;

    實作難度低、開發應用較容易;

    适用并發量小的網絡應用開發;

  3. 缺點:

    不适用并發量大的應用:因為一個請求IO會阻塞程序,是以,得為每請求配置設定一個處理程序(線程)以及時響應,系統開銷大。

2.2 非阻塞IO模型

2.2.1 舉例子說明:非阻塞IO模型

假設你正在和美女微信聊天,消息發過去後,等待她回複。在等的時候你可以做其他事情,去燒水,洗衣服等。

你做其他事情的時候,每個一會就看看手機,看她是否發消息過來了。

你每次看手機都是一次輪詢的過程。

2.2.2 非阻塞IO模型

程序發起IO系統調用後,如果核心緩沖區沒有資料,需要到IO裝置中讀取,程序傳回一個錯誤而不會被阻塞;程序發起IO系統調用後,如果核心緩沖區有資料,核心就會把資料傳回程序。

2.2.3 典型應用和特點:

  1. 典型應用:socket是非阻塞的方式(設定為NONBLOCK)
  2. 特點:

    程序輪詢(重複)調用,消耗CPU的資源;

    實作難度低、開發應用相對阻塞IO模式較難;

    适用并發量較小、且不需要及時響應的網絡應用開發;

2.3 IO複用模型

2.3.1 舉例子說明:IO複用模型

假設你正在和很多,很多美女微信聊天(雖然不太好),消息發過去後,等待她,no 是她們回複。

你一次能看很多美女聊天框是否有哪個消息來了。如美女n消息來了,它會通過信号(頂頂頂)通知你。

增加了效率,減少了等待的時間。

2.3.2 IO複用模型

多個的程序的IO可以注冊到一個複用器(select/poll/epoll)上,然後用一個程序調用該select/poll/epoll, select/poll/epoll會監聽所有注冊進來的IO;

如果select沒有監聽的IO在核心緩沖區都沒有可讀資料,select調用程序會被阻塞;而當任一IO在核心緩沖區中有可資料時,select調用就會傳回;

而後select調用程序可以自己或通知另外的程序(注冊程序)來再次發起讀取IO,讀取核心中準備好的資料。

可以看到,多個程序注冊IO後,隻有另一個select調用程序被阻塞。

2.3.3 典型應用和特點:

  1. 典型應用:select、poll、epoll三種方案
  2. 特點:

    專一程序解決多個程序IO的阻塞問題,性能好

    實作、開發應用難度較大;

    适用高并發服務應用開發:一個程序(線程)響應多個請求

2.4 信号驅動的IO模型

2.4.1 舉例子說明:信号驅動的IO模型

假設你正在和美女微信聊天,消息發過去後,等待她回複。這時你不用傻等,把手機調整成響鈴,并且聲音最大就可以了。

微信消息來了,它會通過信号(頂頂頂)通知你,你就知道了。

2.4.2 信号驅動的IO模型

當程序發起一個IO操作,會向核心注冊一個信号處理函數,然後程序傳回不阻塞;

當核心資料就緒時會發送一個信号給程序,程序便在信号處理函數中調用IO讀取資料。

2.4.3 典型應用和特點:

特點:回調機制,實作、開發應用難度大;

2.5 異步IO模型

2.5.1 舉例子說明:異步IO模型

假設你正在和很多,很多美女微信聊天(雖然不太好),但是很多人聊天太耽誤事,你就雇傭了一個小白替你跟美女們聊天。

有美女同意一起約會就通知你,你強勢登場……balabala

2.5.2 異步IO模型

當程序發起一個IO操作,核心一方面去取資料報内容傳回,另一方面将程式控制權還給應用程序,應用程序繼續處理其他事情,是一種非阻塞的狀态。

當核心中有資料報就緒時,由核心将資料報拷貝到應用程式中,讓其處理。

2.5.3 典型應用和特點:

很少有Linux系統支援

  1. 典型應用:JAVA7 AIO、高性能伺服器應用
  2. 特點:

    不阻塞,資料一步到位

    需要作業系統的底層支援,LINUX 2.5 版本核心首現,2.6 版本産品的核心标準特性;

    實作、開發應用難度大;

    非常适合高性能高并發應用;

3. 同步IO和異步IO

3.1 同步IO:導緻請求程序阻塞,直到I/O操作完成。

使用者程序發出IO調用,去擷取IO裝置資料,雙方的資料要經過核心緩沖區同步,完全準備好後,再複制傳回到使用者程序。

而複制傳回到使用者程序會導緻請求程序阻塞,直到I/O操作完成。

3.2 異步IO:不導緻請求程序阻塞。

使用者程序發出IO調用,去擷取IO裝置資料,并不需要同步,核心直接複制到程序,整個過程不導緻請求程序阻塞。

4. 模式精細講解: MSG_DONTWAIT 、 MSG_WAITALL

參考:https://www.cnblogs.com/nufangrensheng/archive/2013/03/10/2952658.html

參考:

https://blog.csdn.net/tjiyu/article/details/52959418

https://blog.csdn.net/ZWE7616175/article/details/80591587

繼續閱讀