IO模型 :阻塞IO、非阻塞IO、信號驅動IO、異步IO、多路復用IO

文章目錄

  • IO模型
  • 阻塞IO
  • 非阻塞IO
  • 信號驅動IO
  • 多路復用IO
  • 異步IO


IO模型

根據各自的特性不同,IO模型被分為阻塞IO、非阻塞IO、信號驅動IO、異步IO、多路復用IO五類。

最主要的兩個區別就是阻塞與非阻塞,同步與異步。

阻塞與非阻塞

阻塞與非阻塞最主要的區別就是程序在等待調用結果時的狀態。

  • 阻塞: 為了完成一個功能發起調用,如果不具備完成功能的條件,則調用會一直等待
  • 非阻塞: 為了完成一個功能發起調用,如果不具備完成功能的條件,則立即報錯返回

同步與異步

并發模型和I/O模型都有同步/異步的概念:

  • 并發模式中兩者最主要的區別就是功能完成的流程是否是順序化的,

  • I/O模型中兩者最主要的區別是注冊的是就緒事件還是完成事件,完成I/O操作的是用戶程序自身還是內核系統

  • 同步: 功能完成的流程是順序化的。注冊就緒事件,讀寫事件由自身完成。

  • 異步: 功能完成的流程是不確定的,注冊完成事件,讀寫事件由內核完成。


下列五種IO模型,從前往后處理的效率逐漸增加,對資源的利用也增加充分,但是流程也越來越復雜。

阻塞IO

發起IO調用,如果不具備IO條件,則一直等待直到條件就緒。以 recvfrom 為例:(recvfrom:UDP數據的讀寫函數)
在這里插入圖片描述

  • 優點: 流程以及代碼實現都非常簡單,任務順序操作。
  • 缺點: 任務處理效率較低,無法充分利用資源。

非阻塞IO

發起一個IO調用,如果不具備IO條件,則立即報錯返回(無需等待),繼續執行其他命令。通過一個循環來不斷發起IO請求,直到條件就緒。

在這里插入圖片描述

  • 優點: 與阻塞IO相比較來說,利用了等待的時間去做了其他的事情,對資源的利用更加充分
  • 缺點: 與阻塞IO對比,IO調用需要循環發起,流程更加復雜。 并且如果IO條件就緒了,也要等待同一個調用上一輪循環結束后進入當前循環,才能進行處理,這就導致了 IO 不夠實時

非阻塞IO可以通過 fcntl函數 設置描述符狀態來實現:

void SetNoBlock(int fd) 
{int flag = fcntl(fd, F_GETFL, 0);flag |= O_NONBLOCK;fcntl(fd, F_SETFL, flag);
}

信號驅動IO

自定義一個IO就緒的信號,當IO就緒時就發出這個信號。在沒有收到信號時,可以繼續處理其他事情,一旦收到信號,就會中斷當前操作,來優先處理IO事件。程序沒有阻塞階段。
在這里插入圖片描述

  • 優點: 相較于非阻塞IO,仍具有資源利用更加充分的優勢;并且信號到來后就直接強行中斷進行處理,更加實時
  • 缺點: 因為需要自定義信號,又要有主控流程也要有信號處理流程,并且還需要考慮信號是否可靠導致的事件丟失情況,流程會更加的復雜。

多路復用IO

用于對大量的IO事件進行監控,能夠讓用戶只針對就緒了指定事件(可讀、可寫、異常) 的IO進行操作。只針對就緒的描述符進行操作,避免了阻塞,并且提高了效率。

值得一提的是,I/O復用函數對I/O本身的讀寫操作是阻塞的,他們能提高程序效率的原因在于具有同時監聽多個I/O事件的能力。

Linux 下,操作系統提供了三種模型:select模型poll模型epoll模型
在這里插入圖片描述


異步IO

IO處理的順序不確定,整個IO的過程(等待 + 數據拷貝)由操作系統來完成而并非用戶。程序沒有阻塞階段。

在這里插入圖片描述

流程:

  1. 自定義一個IO完成信號
  2. 發起異步調用后返回,此時用戶可以繼續處理其他事情
  3. 系統進行IO事件的等待以及數據拷貝
  4. IO完成后通過信號通知進程IO
  • 優點: 對資源的利用最為充分, 以最高的效率進行任務的處理。
  • 缺點: 資源消耗較高, 流程最為復雜。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443723.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443723.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443723.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Tomcat服務器集群與負載均衡實現

一、前言 在單一的服務器上執行WEB應用程序有一些重大的問題,當網站成功建成并開始接受大量請求時,單一服務器終究無法滿足需要處理的負荷量,所以就有點顯得有點力不從心了。另外一個常見的問題是會產生單點故障,如果該服務器壞掉…

Linux服務器 | 事件處理模式:Reactor模式、Proactor模式

文章目錄Reactor模式Proactor模式同步I/O模型模擬Proactor模式兩者的優缺點ReactorProactor同步I/O模型通常用于實現 Reactor 模式,異步I/O模型通常用于實現 Proactor 模式。(不是絕對的,同步I/O也可模擬出 Proactor 模式) React…

Linux服務器 | 服務器模型與三個模塊、兩種并發模式:半同步/半異步、領導者/追隨者

文章目錄兩種服務器模型及三個模塊C/S模型P2P模型I/O處理單元、邏輯單元、存儲單元并發同步與異步半同步/半異步模式變體:半同步/半反應堆模式改進:高效的半同步/半異步模式領導者/追隨者模式組件 :句柄集、線程集、事件處理器工作流程兩種服…

香農信息熵之可憐的小豬

文章目錄題目解析香農熵公式樣例具體分析代碼題目 有 n 桶液體,其其中 正好 有一桶含有毒藥,其裝的都是水。它們從外觀看起來都一樣。為了弄清楚哪只水桶含有毒藥,你可以喂一些豬喝,通過觀察豬是否會死進行判斷,實驗對…

字符串匹配之KMP(KnuthMorrisPratt)算法(圖解)

文章目錄最長相等前后綴next數組概念代碼實現圖解GetNext中的回溯改進代碼實現代碼復雜度分析最長相等前后綴 給出一個字符串 ababa 前綴集合:{a, ab, aba, abab} 后綴集合:{a, ba, aba, baba} 相等前后綴 即上面用同樣顏色標識出來的集合元素&#…

linux下tomcat6.0與jdk安裝詳細步驟

安裝Tomcat6.0和JDK1.6 在linux系統上安裝tomcat和jdk應該說是我學習linux知識的第一課了,之前只 是聽說過,從沒接觸過,但我們公司項目都是部署在linux系統上的,那天上司突 然給我發了幾個文檔,讓我看一下&#xff…

Android入門(一) | Android Studio的配置與使用

文章目錄安裝配置Android Studio使用Android Studio模擬器更改Android SDK的路徑Hello World!安裝配置Android Studio 從這一步開始: 一直點 next 即可,直到存儲路徑的選擇上,可以放到非 C 盤,這里我放到 D 盤了&am…

Android 入門(四) | Intent 實現 Activity 切換

文章目錄Intent顯式 Intent定義兩個 xml 文件android:orientationmatch_parent 和 wrap_contentIntent函數定義兩個 Activity隱式 Intent更多隱式 Intent 的用法用隱式 Intent 打開系統瀏覽器自建 Activity 以響應打開網頁的 Intent向下一個活動傳遞數據返回數據給上一個活動In…

Android入門(二) | 項目目錄及主要文件作用分析

文章目錄項目目錄分析app目錄分析AndroidManifest.xml 分析MainActivity.kt 分析build.gradle 分析最外層目錄下的 build.gradleapp 目錄下的 build.gradle項目目錄分析 我們來看一下 src/main/res 下的一些文件: .gradle 和 .idea :這兩個目錄下放置…

Android入門(三) | Android 的日志工具 Logcat

文章目錄日志工具類 android.util.LogLogcat 中的過濾器日志工具類 android.util.Log Log 從屬日志工具類 android.util.Log ,該類提供了五個方法供我們打印日志: Log.v() :用于打印那些最為瑣碎的、意義最小的日志信息。對應級別 verbose&…

Android 客戶端與服務器交互方式

突然想到一個問題就是Android客戶端與服務器交互有幾種方式,因為在腦袋里想當然的就是webservices和json。要在Android手機客戶端與pc服務器交互,需要滿足下面幾種條件:跨平臺、傳輸數據格式標準、交互方便...。 為了與服務器通訊其實無非就…

Android入門(五) | Activity 的生命周期

文章目錄Activity 的狀態及生命周期實現管理生命周期FirstActivitySecondActivityDialogActivity運行結果舊活動被回收了還能返回嗎?Activity 的狀態及生命周期 Android 的應用程序運用 棧(Back Stack) 的思想來管理 Activity: …

Android入門(六) | Activity 的啟動模式 及 生產環境中關于 Activity 的小技巧

文章目錄Activity 的啟動模式standardsingleTopsingleTasksingleInstance技巧了解當前界面是哪個 Activity隨時隨地退出程序啟動活動的最佳寫法Activity 的啟動模式 standard:默認的啟動方式,每次啟動一個活動都會重新創建singleTop:如果該活…

Android入門(七) | 常用控件

文章目錄TextView 控件:文本信息Button 控件:按鈕EditText 控件:輸入框ImageView 控件:圖片ProgressBar 控件:進度條AlertDialog 控件:提示框ProgressDialog 控件:帶有進度條的提示框TextView 控…

Android入門(八) | 常用的界面布局 及 自定義控件

文章目錄LinearLayout :線性布局android:layout_gravity :控件的對齊方式android:layout_weight:權重RelativeLayout :相對布局相對于父布局進行定位相對于控件進行定位邊緣對齊FrameLayout :幀布局Percent &#xff1…

Android入門(九)| 滾動控件 ListView 與 RecyclerView

文章目錄ListView內置類型的簡單運用定制數據類型提升效率點擊事件RecyclerView布局管理器點擊事件ListView 內置類型的簡單運用 由于手機屏幕空間有限,能夠一次性在屏幕上顯示的內容不多,當我們的程序有大量數據需要顯示的時候就可以借助 ListView 來…

關于“三門問題”的一些想法

三門問題(Monty Hall problem)亦稱為蒙提霍爾問題、蒙特霍問題或蒙提霍爾悖論,大致出自美國的電視游戲節目Let’s Make a Deal。問題名字來自該節目的主持人蒙提霍爾(Monty Hall)。參賽者會看見三扇關閉了的門&#xf…

Android入門(10)| Fragment碎片詳解

文章目錄為什么要使用碎片(Fragment)實例布局文件FragmentActivity動態添加碎片布局文件FragmentActivity碎片通信Fragment布局文件Activity生命周期為什么要使用碎片(Fragment) 我們在手機上看新聞可能是這樣的: Re…

Android開發(1) | Fragment 的應用——新聞應用

文章目錄Item&#xff1a;標題子項布局文件Java代碼標題碎片布局文件Java代碼新聞內容碎片布局文件Java代碼新聞內容活動布局文件Java代碼首界面布局文件Java代碼Item&#xff1a;標題子項 布局文件 news_item.xml&#xff1a; <TextViewxmlns:android"http://schema…

Java Web整體異常處理

在實際的J2EE項目中&#xff0c;系統內部難免會出現一些異常&#xff0c;就如StrutsSpringHibernate項目&#xff1a;通常一個頁面請求到達后臺以后&#xff0c;首先是到action&#xff08;就是MVC中的controller&#xff09;&#xff0c;在action層會調用業務邏輯層service&am…