操作系統 ------ 五種IO模型

阻塞IO:一個IO請求操作,準備階段和復制階段都會阻塞應用程序,直到操作完全完成

非阻塞IO:一個IO操作請求,先判斷準備階段是否完成,如果未完成立即返回,否則,進入復制階段,在這個復制階段是阻塞的,直到操作完全完成

同步IO:同步IO包含阻塞IO和非阻塞IO,所以這里的同步指的是IO操作請求的完全完成。不論是阻塞還是非阻塞IO在復制階段都是阻塞的。

異步IO:一個IO操作請求就立刻返回,直到準備階段與復制階段都完成了,內核才通知應用程序。這時候應用程序可以直接操作用戶系統了

IO有兩個階段:數據準備+數據讀寫,這兩個操作完成了一個完整的IO操作

IO=等待+拷貝

一、五種I/O模式

阻塞和非阻塞都是同步IO

1.阻塞式IO模式

我們默認情況下,所有套接字都是阻塞的。

輸入操作流程通常包括兩個不同階段:

(1)等待數據準備好

(2)從內核向進程復制數據

? ? ? ? 對于一個套接字上的輸入操作,第一步通常涉及等待數據從網絡中到達。當所有等待分組到達時,他被復制到內核中的緩沖區。第二步就是把數據從內核緩沖區復制到應用程序緩沖區。接下來以阻塞套接字的recvfrom的調用圖來說明阻塞。

????????在調用recvfrom一直到從recvfrom返回這段時間是阻塞的,當recvfrom正常返回時,我們的進程繼續操作 。

2.非阻塞IO模型

????????非阻塞的read,指的是在數據到達前,即數據還未到達網卡,或者到達網卡還沒有拷貝到內核緩沖區之前,這個階段是非阻塞的。當數據到達內核緩沖區,調用read函數仍然是阻塞的,需要等待數據從內核緩沖區拷貝到用戶緩沖區,才能返回。

????????開始對recvfrom三次調用,由于系統沒有收到網絡數據,所以內核馬上返回EWOULDBLOCK的錯誤。當第四次調用recvfrom函數,一個數據報已經到了,內核將它拷貝到我們的應用程序的緩沖區中,然后recvfrom正常返回,我們就可以對接受到的數據進行處理。

3.I/O多路復用

? ? ? ? 此模型用到select和poll函數,這兩個函數也會使進程阻塞,select先阻塞,有活動套接字才返回,但是和阻塞I/O不同的是,這兩個函數可以同時阻塞多個I/O操作,而且可以同時對多個讀操作,多個寫操作的I/O函數進行檢測,直到有數據可讀或可寫(就是監聽多個socket)。select被調用后,進程會被阻塞,內核監視所有select負責的socket,當有任何一個socket的數據準備好了,select就會返回套接字可讀,調用recvfrom處理數據。

4.信號驅動I/O模式

SIGIO:文件描述符準備就緒,可以開始進行輸入/輸出操作

首先我們允許套機口進行信號驅動I/O,進程運行并且不阻塞,當數據準備好時,進程收到一個SIGIO信號,可以在信號處理函數中調用I/O操作函數處理數據。瞬間準備好讀取時,內核就會為進程產生一個SIGIO信號,隨后調用recvfrom讀取數據報,并且通知主循環數據已經準備好待處理,也可以立即通知主循環,讓它讀取數據報。(免去了select的阻塞與輪詢,當有活躍套接字時,由注冊的handler處理

信號驅動I/O優勢:

????????用戶進程在等待數據時,并不會被阻塞。

信號驅動I/O缺點:

  1. 在大量IO事件發生時,可能會由于處理不過來,而導致信號隊列溢出
  2. 對于UDP來講,信號驅動IO是有用的。可是,對于TCP來說由于區分信號成本問題,故不太適合
  3. 信號驅動IO可以說為異步,但是異步的又不徹底。在等待數據階段是異步的,但是將數據從內核拷貝到用戶空間,用戶進程是阻塞的,同步的。

5.異步I/O模式

? ? ? ? 工作模式:進程告訴內核啟動某個操作,并讓內核在整個操作(包括將數據從內核拷貝到用戶空間)完成后通知我們。

參考:五種IO模型-CSDN博客?

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

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

相關文章

service和endpoints是如何關聯的?

在Kubernetes中,Service 和 Endpoints 是兩個密切關聯的對象,它們共同實現了服務發現和負載均衡的功能。以下是它們之間的關聯和工作原理: 1. Service 的定義 Service 是一種抽象,定義了一組邏輯上相關的 Pod,以及用…

程序化廣告行業(78/89):多因素交織下的行業剖析與展望

程序化廣告行業(78/89):多因素交織下的行業剖析與展望 在程序化廣告這片充滿活力又不斷變化的領域,持續學習和知識共享是我們緊跟潮流、實現突破的關鍵。一直以來,我都渴望能與大家一同探索這個行業的奧秘&#xff0c…

數智化重構供應商管理

當供應鏈韌性成為核心競爭力,你的供應商管理還在 “摸著石頭過河” 嗎? 在傳統模式下,供應商管理高度依賴人工經驗與紙質流程: 入庫篩選如“大海撈針”:供應商資質審核停留在Excel表格比對,資質造假、歷史…

網絡互連與互聯網

1.在路由表中找不到目標網絡時使用默認路由,默認路由通常指本地網關的地址。 2.OSPF最主要的特征是使用分布式鏈路狀態協議,而RIP使用的是距離向量協議。 3.OSPF使用鏈路狀態公告LSA擴散路由信息 4.內部網關路由協議IGRP是一種動態距離矢量路由協議&a…

Raymarching Textures In Depth

本節課最主要的就是學會hlsl中使用紋理采樣 float4 color Texture2DSample(Texobj, TexobjSampler, uv); return color; 課程中的代碼(沒有這張圖我就沒做) 課程代碼產生深度的原因是uv偏移,黑色區域會不斷向左偏移,直到找到白色…

【MQTT-協議原理】

MQTT-協議原理 ■ MQTT-協議原理■ MQTT-服務器 稱為"消息代理"(Broker)■ MQTT協議中的訂閱、主題、會話■ 一、訂閱(Subscription)■ 二、會話(Session)■ 三、主題名(Topic Name&a…

docker容器安裝的可道云掛接宿主機的硬盤目錄:解決群暉 威聯通 飛牛云等nas的硬盤掛接問題

基于Docker部署可道云(KodCloud)時,通過掛載宿主機其他磁盤目錄可實現高效、安全的數據管理。具體而言,使用綁定掛載(Bind Mounts)將宿主機目錄(如/data/disk2)映射到容器內的可道云…

go語言內存泄漏的常見形式

go語言內存泄漏 子字符串導致的內存泄漏 使用自動垃圾回收的語言進行編程時,通常我們無需擔心內存泄漏的問題,因為運行時會定期回收未使用的內存。但是如果你以為這樣就完事大吉了,哪里就大錯特措了。 因為,雖然go中并未對字符串…

es6學習02-let命令和const命令

一、let命令 1.let塊級作用域: let關鍵字 VS var關鍵字 2.for循環計數器很適合let命令 var:整個for循環中一直都是同一個i在做1,最后輸出的就是10; let:每循環一次都是多一個i的賦值,最后輸出是可以調出…

MySQL深分頁問題

在項目中有一個數據導出的需求,原來的實現方式也比較簡單,根據查詢條件分頁查所有的數據,然后轉成csv的格式一行一行寫進文件存儲中。 實際上線之后,發現出現了慢查詢,具體的sql如下: select * from tabl…

前端面試寶典---創建對象的配置

Object.create 對整個對象的多個屬性值進行配置 創建對象 不可更改屬性值 // 創建對象 不可更改屬性值 let obj Object.create({}, {name: {value: lisi,writable: false,},age: {value: 20,writable: true,} })console.log(初始化obj, obj) obj.name wangwu console.log(…

數據結構:C語言版嚴蔚敏和解析介紹,附pdf

《數據結構:C語言版(第2版)》嚴蔚敏李冬梅吳偉民.pdf 《數據結構:C語言版》嚴蔚敏,李冬梅.pdf 《數據結構C語言第2版習題解析與實驗指導》李冬梅.pdf 「《數據結構:C語言版(第2版 )》…

深入理解 v-for 指令及其使用方法

在 Vue.js 中,v-for 是用于渲染列表的核心指令,它允許你通過循環渲染數據源中的每一項。通過 v-for,你可以輕松地將數組、對象或其他可迭代的數據渲染成 HTML 元素。本文將詳細介紹 v-for 的基本用法、常見的應用場景、最佳實踐及性能優化&am…

VIRT, RES,SHR之間的關系

VIRT、RES 和 SHR 是進程內存使用的三個關鍵指標,它們之間的關系反映了進程的內存分配和使用情況。以下是它們的定義和關系: VIRT(虛擬內存):表示進程分配的虛擬內存總量,包括所有代碼、數據、共享庫、堆棧…

2025屆藍橋杯JavaB組個人題解(暫時不全,沒題目)

2025 屆藍橋杯 Java B 組題解 第一次參加藍橋杯,輸入輸出都用的BufferedReader和PrintWriter,怕輸入輸出不對或者內存超限,也怕出現小錯誤運行不了的,比如Main打成Mian什么的,但還是希望能拿省一,這里給出自…

在Vue項目的引入meting-js音樂播放器插件

開源項目:https://github.com/swzaaaaaaa/NBlog 1、開源項目中音樂播放插件的使用流程 步驟1:下載meting-js相關文件 在MetingJS官方倉庫或其他可靠的CDN獲取meting-js的JavaScript文件以及相關依賴(如APlayer的文件)。將它們下…

HTML應用指南:利用GET請求獲取全國漢堡王門店位置信息

在當今快節奏的都市生活中,餐飲品牌的門店布局不僅反映了其市場策略,更折射出消費者對便捷、品質和品牌認同的追求。漢堡王(Burger King)作為全球知名的西式快餐品牌之一,在中國市場同樣占據重要地位。自進入中國市場以…

使用 Function 來編寫策略模式:優雅而高效的設計模式實踐

引言:為什么選擇策略模式? 策略模式(Strategy Pattern)是行為設計模式中的經典之一,它允許我們定義一系列的算法或操作,并使得它們可以互換使用。策略模式的關鍵思想是將算法的實現與使用它們的上下文分離…

Windows 系統中安裝 Git 并配置 GitHub 賬戶

由于電腦重裝系統,重新配置了git. 以下是在 Windows 系統中安裝 Git 并配置 GitHub 賬戶的詳細步驟: 1. 安裝 Git 訪問 Git 官網下載頁面下載 Windows 版本的 Git 安裝程序運行安裝程序,使用默認選項即可 2. 配置 Git 用戶信息 打開命令…

MergeX亮相GTC2025:開啟全球廣告流量交易新篇章

全球流量盛宴GTC2025深圳啟幕,共探出海新藍海 2025年4月24日至25日,GTC2025全球流量大會將在深圳福田會展中心9號館隆重召開。作為跨境出海領域內規模最大、資源最豐富、產業鏈最完備的年度盛會,此次大會將匯聚眾多行業精英,共同探…