日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

看一遍就理解:IO模型詳解

來源: 責編: 時間:2024-03-26 09:35:23 173觀看
導讀前言大家好,我是程序員田螺。今天我們一起來學習IO模型。在本文開始前呢,先問問大家幾個問題哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步異步IO?什么是IO多路復用?select/epoll跟IO模型有什么關系?有幾種經典IO模型呢?BIO、

前言

大家好,我是程序員田螺。今天我們一起來學習IO模型。在本文開始前呢,先問問大家幾個問題哈~FLd28資訊網——每日最新資訊28at.com

什么是IO呢?什么是阻塞非阻塞IO?什么是同步異步IO?什么是IO多路復用?select/epoll跟IO模型有什么關系?有幾種經典IO模型呢?BIO、NIO、AIO到底有什么區別的?FLd28資訊網——每日最新資訊28at.com

如果這些問題,你都能很好答上的話,那恭喜你,你對IO的掌握已經很棒啦!那你跟田螺哥一起看完這篇文章,再復習一下,加深印象吧~如果你對這些問題模棱兩可的話,那也沒關系,看完這篇文章,就理解啦!FLd28資訊網——每日最新資訊28at.com

圖片圖片FLd28資訊網——每日最新資訊28at.com

什么是IO呢?

IO,英文全稱是Input/Output,翻譯過來就是輸入/輸出。平時我們聽得挺多,就是什么磁盤IO,網絡IO。那IO到底是什么呢?是不是有種懵懵懂懂的感覺呀,好像大概知道它是什么,又好像說不清楚。FLd28資訊網——每日最新資訊28at.com

IO,即輸入/輸出,到底誰是輸入?誰是輸出呢?IO如果脫離了主體,就會讓人疑惑。FLd28資訊網——每日最新資訊28at.com

計算機角度的IO

我們常說的輸入輸出,比較直觀的意思就是計算機的輸入輸出,計算機就是主體。大家是否還記得,大學學計算機組成原理的時候,有個馮.諾依曼結構,它將計算機分成分為5個部分:運算器、控制器、存儲器、輸入設備、輸出設備。FLd28資訊網——每日最新資訊28at.com

圖片圖片FLd28資訊網——每日最新資訊28at.com

輸入設備是向計算機輸入數據和信息的設備,鍵盤,鼠標都屬于輸入設備;輸出設備是計算機硬件系統的終端設備,用于接收計算機數據的輸出顯示,一般顯示器、打印機屬于輸出設備。FLd28資訊網——每日最新資訊28at.com

例如你在鼠標鍵盤敲幾下,它就會把你的指令數據,傳給主機,主機通過運算后,把返回的數據信息,輸出到顯示器。FLd28資訊網——每日最新資訊28at.com

鼠標、顯示器這只是直觀表面的輸入輸出,回到計算機架構來說,涉及計算機核心與其他設備間數據遷移的過程,就是IO。如磁盤IO,就是從磁盤讀取數據到內存,這算一次輸入,對應的,將內存中的數據寫入磁盤,就算輸出。這就是IO的本質。FLd28資訊網——每日最新資訊28at.com

操作系統的IO

我們要將內存中的數據寫入到磁盤的話,主體會是什么呢?主體可能是一個應用程序,比如一個Java進程(假設網絡傳來二進制流,一個Java進程可以把它寫入到磁盤)。FLd28資訊網——每日最新資訊28at.com

操作系統負責計算機的資源管理和進程的調度。我們電腦上跑著的應用程序,其實是需要經過操作系統,才能做一些特殊操作,如磁盤文件讀寫、內存的讀寫等等。因為這些都是比較危險的操作,不可以由應用程序亂來,只能交給底層操作系統來。也就是說,你的應用程序要把數據寫入磁盤,只能通過調用操作系統開放出來的API來操作。FLd28資訊網——每日最新資訊28at.com

  • 什么是用戶空間?什么是內核空間?
  • 以32位操作系統為例,它為每一個進程都分配了4G(2的32次方)的內存空間。這4G可訪問的內存空間分為二部分,一部分是用戶空間,一部分是內核空間。內核空間是操作系統內核訪問的區域,是受保護的內存空間,而用戶空間是用戶應用程序訪問的內存區域。

我們應用程序是跑在用戶空間的,它不存在實質的IO過程,真正的IO是在操作系統執行的。即應用程序的IO操作分為兩種動作:IO調用和IO執行。IO調用是由進程(應用程序的運行態)發起,而IO執行是操作系統內核的工作。此時所說的IO是應用程序對操作系統IO功能的一次觸發,即IO調用。FLd28資訊網——每日最新資訊28at.com

操作系統的一次IO過程

應用程序發起的一次IO操作包含兩個階段:FLd28資訊網——每日最新資訊28at.com

  • IO調用:應用程序進程向操作系統內核發起調用。
  • IO執行:操作系統內核完成IO操作。

操作系統內核完成IO操作還包括兩個過程:FLd28資訊網——每日最新資訊28at.com

  • 準備數據階段:內核等待I/O設備準備好數據
  • 拷貝數據階段:將數據從內核緩沖區拷貝到用戶進程緩沖區

圖片圖片FLd28資訊網——每日最新資訊28at.com

其實IO就是把進程的內部數據轉移到外部設備,或者把外部設備的數據遷移到進程內部。外部設備一般指硬盤、socket通訊的網卡。一個完整的IO過程包括以下幾個步驟:FLd28資訊網——每日最新資訊28at.com

  • 應用程序進程向操作系統發起IO調用請求
  • 操作系統準備數據,把IO外部設備的數據,加載到內核緩沖區
  • 操作系統拷貝數據,即將內核緩沖區的數據,拷貝到用戶進程緩沖區

阻塞IO模型

我們已經知道IO是什么啦,那什么是阻塞IO呢?FLd28資訊網——每日最新資訊28at.com

假設應用程序的進程發起IO調用,但是如果內核的數據還沒準備好的話,那應用程序進程就一直在阻塞等待,一直等到內核數據準備好了,從內核拷貝到用戶空間,才返回成功提示,此次IO操作,稱之為阻塞IO。FLd28資訊網——每日最新資訊28at.com

圖片圖片FLd28資訊網——每日最新資訊28at.com

  • 阻塞IO比較經典的應用就是阻塞socket、Java BIO。
  • 阻塞IO的缺點就是:如果內核數據一直沒準備好,那用戶進程將一直阻塞,浪費性能,可以使用非阻塞IO優化。

非阻塞IO模型

如果內核數據還沒準備好,可以先返回錯誤信息給用戶進程,讓它不需要等待,而是通過輪詢的方式再來請求。這就是非阻塞IO,流程圖如下:FLd28資訊網——每日最新資訊28at.com

圖片圖片FLd28資訊網——每日最新資訊28at.com

非阻塞IO的流程如下:FLd28資訊網——每日最新資訊28at.com

  • 應用進程向操作系統內核,發起recvfrom讀取數據。
  • 操作系統內核數據沒有準備好,立即返回EWOULDBLOCK錯誤碼。
  • 應用程序進程輪詢調用,繼續向操作系統內核發起recvfrom讀取數據。
  • 操作系統內核數據準備好了,從內核緩沖區拷貝到用戶空間。
  • 完成調用,返回成功提示。

非阻塞IO模型,簡稱NIO,Non-Blocking IO。它相對于阻塞IO,雖然大幅提升了性能,但是它依然存在性能問題,即頻繁的輪詢,導致頻繁的系統調用,同樣會消耗大量的CPU資源。可以考慮IO復用模型,去解決這個問題。FLd28資訊網——每日最新資訊28at.com

IO多路復用模型

既然NIO無效的輪詢會導致CPU資源消耗,我們等到內核數據準備好了,主動通知應用進程再去進行系統調用,那不就好了嘛?FLd28資訊網——每日最新資訊28at.com

在這之前,我們先來復習下,什么是文件描述符fd(File Descriptor),它是計算機科學中的一個術語,形式上是一個非負整數。當程序打開一個現有文件或者創建一個新文件時,內核向進程返回一個文件描述符。FLd28資訊網——每日最新資訊28at.com

IO復用模型核心思路:系統給我們提供一類函數(如我們耳濡目染的select、poll、epoll函數),它們可以同時監控多個fd的操作,任何一個返回內核數據就緒,應用進程再發起recvfrom系統調用。FLd28資訊網——每日最新資訊28at.com

IO多路復用之select

應用進程通過調用select函數,可以同時監控多個fd,在select函數監控的fd中,只要有任何一個數據狀態準備就緒了,select函數就會返回可讀狀態,這時應用進程再發起recvfrom請求去讀取數據。FLd28資訊網——每日最新資訊28at.com

圖片圖片FLd28資訊網——每日最新資訊28at.com

非阻塞IO模型(NIO)中,需要N(N>=1)次輪詢系統調用,然而借助select的IO多路復用模型,只需要發起一次詢問就夠了,大大優化了性能。FLd28資訊網——每日最新資訊28at.com

但是呢,select有幾個缺點:FLd28資訊網——每日最新資訊28at.com

  • 監聽的IO最大連接數有限,在Linux系統上一般為1024。
  • select函數返回后,是通過遍歷fdset,找到就緒的描述符fd。(僅知道有I/O事件發生,卻不知是哪幾個流,所以遍歷所有流)

因為存在連接數限制,所以后來又提出了poll。與select相比,poll解決了連接數限制問題。但是呢,select和poll一樣,還是需要通過遍歷文件描述符來獲取已經就緒的socket。如果同時連接的大量客戶端,在一時刻可能只有極少處于就緒狀態,伴隨著監視的描述符數量的增長,效率也會線性下降。FLd28資訊網——每日最新資訊28at.com

因此經典的多路復用模型epoll誕生。FLd28資訊網——每日最新資訊28at.com

IO多路復用之epoll

為了解決select/poll存在的問題,多路復用模型epoll誕生,它采用事件驅動來實現,流程圖如下:FLd28資訊網——每日最新資訊28at.com

圖片圖片FLd28資訊網——每日最新資訊28at.com

epoll先通過epoll_ctl()來注冊一個fd(文件描述符),一旦基于某個fd就緒時,內核會采用回調機制,迅速激活這個fd,當進程調用epoll_wait()時便得到通知。這里去掉了遍歷文件描述符的坑爹操作,而是采用監聽事件回調的機制。這就是epoll的亮點。FLd28資訊網——每日最新資訊28at.com

我們一起來總結一下select、poll、epoll的區別FLd28資訊網——每日最新資訊28at.com


FLd28資訊網——每日最新資訊28at.com

select
FLd28資訊網——每日最新資訊28at.com

poll
FLd28資訊網——每日最新資訊28at.com

epoll
FLd28資訊網——每日最新資訊28at.com

底層數據結構
FLd28資訊網——每日最新資訊28at.com

數組
FLd28資訊網——每日最新資訊28at.com

鏈表
FLd28資訊網——每日最新資訊28at.com

紅黑樹和雙鏈表
FLd28資訊網——每日最新資訊28at.com

獲取就緒的fd
FLd28資訊網——每日最新資訊28at.com

遍歷
FLd28資訊網——每日最新資訊28at.com

遍歷
FLd28資訊網——每日最新資訊28at.com

事件回調
FLd28資訊網——每日最新資訊28at.com

事件復雜度
FLd28資訊網——每日最新資訊28at.com

O(n)
FLd28資訊網——每日最新資訊28at.com

O(n)
FLd28資訊網——每日最新資訊28at.com

O(1)
FLd28資訊網——每日最新資訊28at.com

最大連接數
FLd28資訊網——每日最新資訊28at.com

1024
FLd28資訊網——每日最新資訊28at.com

無限制
FLd28資訊網——每日最新資訊28at.com

無限制
FLd28資訊網——每日最新資訊28at.com

fd數據拷貝
FLd28資訊網——每日最新資訊28at.com

每次調用select,需要將fd數據從用戶空間拷貝到內核空間
FLd28資訊網——每日最新資訊28at.com

每次調用poll,需要將fd數據從用戶空間拷貝到內核空間
FLd28資訊網——每日最新資訊28at.com

使用內存映射(mmap),不需要從用戶空間頻繁拷貝fd數據到內核空間
FLd28資訊網——每日最新資訊28at.com

epoll明顯優化了IO的執行效率,但在進程調用epoll_wait()時,仍然可能被阻塞。能不能醬紫:不用我老是去問你數據是否準備就緒,等我發出請求后,你數據準備好了通知我就行了,這就誕生了信號驅動IO模型。FLd28資訊網——每日最新資訊28at.com

IO模型之信號驅動模型

信號驅動IO不再用主動詢問的方式去確認數據是否就緒,而是向內核發送一個信號(調用sigaction的時候建立一個SIGIO的信號),然后應用用戶進程可以去做別的事,不用阻塞。當內核數據準備好后,再通過SIGIO信號通知應用進程,數據準備好后的可讀狀態。應用用戶進程收到信號之后,立即調用recvfrom,去讀取數據。FLd28資訊網——每日最新資訊28at.com

圖片圖片FLd28資訊網——每日最新資訊28at.com

信號驅動IO模型,在應用進程發出信號后,是立即返回的,不會阻塞進程。它已經有異步操作的感覺了。但是你細看上面的流程圖,發現數據復制到應用緩沖的時候,應用進程還是阻塞的。回過頭來看下,不管是BIO,還是NIO,還是信號驅動,在數據從內核復制到應用緩沖的時候,都是阻塞的。還有沒有優化方案呢?AIO(真正的異步IO)!FLd28資訊網——每日最新資訊28at.com

IO 模型之異步IO(AIO)

前面講的BIO,NIO和信號驅動,在數據從內核復制到應用緩沖的時候,都是阻塞的,因此都不算是真正的異步。AIO實現了IO全流程的非阻塞,就是應用進程發出系統調用后,是立即返回的,但是立即返回的不是處理結果,而是表示提交成功類似的意思。等內核數據準備好,將數據拷貝到用戶進程緩沖區,發送信號通知用戶進程IO操作執行完畢。FLd28資訊網——每日最新資訊28at.com

流程如下:FLd28資訊網——每日最新資訊28at.com

圖片圖片FLd28資訊網——每日最新資訊28at.com

異步IO的優化思路很簡單,只需要向內核發送一次請求,就可以完成數據狀態詢問和數據拷貝的所有操作,并且不用阻塞等待結果。日常開發中,有類似思想的業務場景:FLd28資訊網——每日最新資訊28at.com

比如發起一筆批量轉賬,但是批量轉賬處理比較耗時,這時候后端可以先告知前端轉賬提交成功,等到結果處理完,再通知前端結果即可。FLd28資訊網——每日最新資訊28at.com

阻塞、非阻塞、同步、異步IO劃分

圖片圖片FLd28資訊網——每日最新資訊28at.com

IO模型
FLd28資訊網——每日最新資訊28at.com


FLd28資訊網——每日最新資訊28at.com

阻塞I/O模型
FLd28資訊網——每日最新資訊28at.com

同步阻塞
FLd28資訊網——每日最新資訊28at.com

非阻塞I/O模型
FLd28資訊網——每日最新資訊28at.com

同步非阻塞
FLd28資訊網——每日最新資訊28at.com

I/O多路復用模型
FLd28資訊網——每日最新資訊28at.com

同步阻塞
FLd28資訊網——每日最新資訊28at.com

信號驅動I/O模型
FLd28資訊網——每日最新資訊28at.com

同步非阻塞
FLd28資訊網——每日最新資訊28at.com

異步IO(AIO)模型
FLd28資訊網——每日最新資訊28at.com

異步非阻塞
FLd28資訊網——每日最新資訊28at.com

一個通俗例子讀懂BIO、NIO、AIO

  • 同步阻塞(blocking-IO)簡稱BIO
  • 同步非阻塞(non-blocking-IO)簡稱NIO
  • 異步非阻塞(asynchronous-non-blocking-IO)簡稱AIO

一個經典生活的例子:FLd28資訊網——每日最新資訊28at.com

  • 小明去吃同仁四季的椰子雞,就這樣在那里排隊,等了一小時,然后才開始吃火鍋。(BIO)
  • 小紅也去同仁四季的椰子雞,她一看要等挺久的,于是去逛會商場,每次逛一下,就跑回來看看,是不是輪到她了。于是最后她既購了物,又吃上椰子雞了。(NIO)
  • 小華一樣,去吃椰子雞,由于他是高級會員,所以店長說,你去商場隨便逛會吧,等下有位置,我立馬打電話給你。于是小華不用干巴巴坐著等,也不用每過一會兒就跑回來看有沒有等到,最后也吃上了美味的椰子雞(AIO)

本文鏈接:http://www.www897cc.com/showinfo-26-79297-0.html看一遍就理解:IO模型詳解

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Spring Boot整合Camunda打造高效工作流程

下一篇: Tailwind CSS,值得2024年的你一試嗎?

標簽:
  • 熱門焦點
  • MIX Fold3包裝盒泄露 新機本月登場

    小米的全新折疊屏旗艦MIX Fold3將于本月發布,近日該機的真機包裝盒在網上泄露。從圖上來看,新的MIX Fold3包裝盒在外觀設計方面延續了之前的方案,變化不大,這也是目前小米旗艦
  • 讓我們一起聊聊文件的操作

    文件【1】文件是什么?文件是保存數據的地方,是數據源的一種,比如大家經常使用的word文檔、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存數據,它既可以保
  • 如何通過Python線程池實現異步編程?

    線程池的概念和基本原理線程池是一種并發處理機制,它可以在程序啟動時創建一組線程,并將它們置于等待任務的狀態。當任務到達時,線程池中的某個線程會被喚醒并執行任務,執行完任
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人員可能會涉及各種各樣的安全任務,包括但不限于:開發某些安全工具的插件,滿足自己特定的安全需求;自定義github搜索工具,快速查找所需的安全資料、漏洞poc、exp
  • Temu起訴SHEIN,跨境電商戰事升級

    來源 | 伯虎財經(bohuFN)作者 | 陳平安日前據外媒報道,拼多多旗下跨境電商平臺Temu正對競爭對手SHEIN提起新訴訟,訴狀稱Shein“利用市場支配力量強迫服裝廠商與之簽訂獨家
  • iQOO Neo8系列或定檔5月23日:首發天璣9200+ 安卓跑分王者

    去年10月,iQOO推出了iQOO Neo7系列機型,不僅搭載了天璣9000+,而且是同價位唯一一款天璣9000+直屏旗艦,一經上市便受到了用戶的廣泛關注。在時隔半年后,
  • 2022爆款:ROG魔霸6 冰川散熱系統持續護航

    喜逢開學季,各大商家開始推出自己的新產品,進行打折促銷活動。對于忠實的端游愛好者來說,能夠擁有一款夢寐以求的筆記本電腦是一件十分開心的事。但是現在的
  • 三翼鳥智能家居亮相電博會,讓用戶體驗更真實

    2021電博會在青島國際會展中心開幕中,三翼鳥直接把“家”搬到了現場,成為了展會的一大看點。這也是三翼鳥繼9月9日發布了行業首個一站式定制智慧家平臺后的
  • 世界人工智能大會國際日開幕式活動在世博展覽館開啟

    30日上午,世界人工智能大會國際日開幕式活動在世博展覽館開啟,聚集國際城市代表、重量級院士專家、國際創新企業代表,共同打造人工智能交流平臺。上海市副市
Top 主站蜘蛛池模板: 诸暨市| 吉首市| 毕节市| 宿州市| 石林| 南靖县| 琼海市| 成武县| 新丰县| 涪陵区| 张家港市| 江门市| 金湖县| 贵南县| 灌云县| 平乡县| 志丹县| 金阳县| 金乡县| 历史| 新干县| 巴林左旗| 高阳县| 栾川县| 富顺县| 金溪县| 锡林郭勒盟| 堆龙德庆县| 禹城市| 双城市| 监利县| 兖州市| 隆子县| 义马市| 和顺县| 康乐县| 台中市| 南汇区| 合山市| 岑巩县| 苗栗县|