AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

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

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

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

前言

大家好,我是程序員田螺。今天我們一起來學習IO模型。在本文開始前呢,先問問大家?guī)讉€問題哈~K0h28資訊網(wǎng)——每日最新資訊28at.com

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

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

圖片圖片K0h28資訊網(wǎng)——每日最新資訊28at.com

什么是IO呢?

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

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

計算機角度的IO

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

圖片圖片K0h28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

操作系統(tǒng)的IO

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

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

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

我們應用程序是跑在用戶空間的,它不存在實質(zhì)的IO過程,真正的IO是在操作系統(tǒng)執(zhí)行的。即應用程序的IO操作分為兩種動作:IO調(diào)用和IO執(zhí)行。IO調(diào)用是由進程(應用程序的運行態(tài))發(fā)起,而IO執(zhí)行是操作系統(tǒng)內(nèi)核的工作。此時所說的IO是應用程序?qū)Σ僮飨到y(tǒng)IO功能的一次觸發(fā),即IO調(diào)用。K0h28資訊網(wǎng)——每日最新資訊28at.com

操作系統(tǒng)的一次IO過程

應用程序發(fā)起的一次IO操作包含兩個階段:K0h28資訊網(wǎng)——每日最新資訊28at.com

  • IO調(diào)用:應用程序進程向操作系統(tǒng)內(nèi)核發(fā)起調(diào)用。
  • IO執(zhí)行:操作系統(tǒng)內(nèi)核完成IO操作。

操作系統(tǒng)內(nèi)核完成IO操作還包括兩個過程:K0h28資訊網(wǎng)——每日最新資訊28at.com

  • 準備數(shù)據(jù)階段:內(nèi)核等待I/O設備準備好數(shù)據(jù)
  • 拷貝數(shù)據(jù)階段:將數(shù)據(jù)從內(nèi)核緩沖區(qū)拷貝到用戶進程緩沖區(qū)

圖片圖片K0h28資訊網(wǎng)——每日最新資訊28at.com

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

  • 應用程序進程向操作系統(tǒng)發(fā)起IO調(diào)用請求
  • 操作系統(tǒng)準備數(shù)據(jù),把IO外部設備的數(shù)據(jù),加載到內(nèi)核緩沖區(qū)
  • 操作系統(tǒng)拷貝數(shù)據(jù),即將內(nèi)核緩沖區(qū)的數(shù)據(jù),拷貝到用戶進程緩沖區(qū)

阻塞IO模型

我們已經(jīng)知道IO是什么啦,那什么是阻塞IO呢?K0h28資訊網(wǎng)——每日最新資訊28at.com

假設應用程序的進程發(fā)起IO調(diào)用,但是如果內(nèi)核的數(shù)據(jù)還沒準備好的話,那應用程序進程就一直在阻塞等待,一直等到內(nèi)核數(shù)據(jù)準備好了,從內(nèi)核拷貝到用戶空間,才返回成功提示,此次IO操作,稱之為阻塞IO。K0h28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片K0h28資訊網(wǎng)——每日最新資訊28at.com

  • 阻塞IO比較經(jīng)典的應用就是阻塞socket、Java BIO。
  • 阻塞IO的缺點就是:如果內(nèi)核數(shù)據(jù)一直沒準備好,那用戶進程將一直阻塞,浪費性能,可以使用非阻塞IO優(yōu)化。

非阻塞IO模型

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

圖片圖片K0h28資訊網(wǎng)——每日最新資訊28at.com

非阻塞IO的流程如下:K0h28資訊網(wǎng)——每日最新資訊28at.com

  • 應用進程向操作系統(tǒng)內(nèi)核,發(fā)起recvfrom讀取數(shù)據(jù)。
  • 操作系統(tǒng)內(nèi)核數(shù)據(jù)沒有準備好,立即返回EWOULDBLOCK錯誤碼。
  • 應用程序進程輪詢調(diào)用,繼續(xù)向操作系統(tǒng)內(nèi)核發(fā)起recvfrom讀取數(shù)據(jù)。
  • 操作系統(tǒng)內(nèi)核數(shù)據(jù)準備好了,從內(nèi)核緩沖區(qū)拷貝到用戶空間。
  • 完成調(diào)用,返回成功提示。

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

IO多路復用模型

既然NIO無效的輪詢會導致CPU資源消耗,我們等到內(nèi)核數(shù)據(jù)準備好了,主動通知應用進程再去進行系統(tǒng)調(diào)用,那不就好了嘛?K0h28資訊網(wǎng)——每日最新資訊28at.com

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

IO復用模型核心思路:系統(tǒng)給我們提供一類函數(shù)(如我們耳濡目染的select、poll、epoll函數(shù)),它們可以同時監(jiān)控多個fd的操作,任何一個返回內(nèi)核數(shù)據(jù)就緒,應用進程再發(fā)起recvfrom系統(tǒng)調(diào)用。K0h28資訊網(wǎng)——每日最新資訊28at.com

IO多路復用之select

應用進程通過調(diào)用select函數(shù),可以同時監(jiān)控多個fd,在select函數(shù)監(jiān)控的fd中,只要有任何一個數(shù)據(jù)狀態(tài)準備就緒了,select函數(shù)就會返回可讀狀態(tài),這時應用進程再發(fā)起recvfrom請求去讀取數(shù)據(jù)。K0h28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片K0h28資訊網(wǎng)——每日最新資訊28at.com

非阻塞IO模型(NIO)中,需要N(N>=1)次輪詢系統(tǒng)調(diào)用,然而借助select的IO多路復用模型,只需要發(fā)起一次詢問就夠了,大大優(yōu)化了性能。K0h28資訊網(wǎng)——每日最新資訊28at.com

但是呢,select有幾個缺點:K0h28資訊網(wǎng)——每日最新資訊28at.com

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

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

因此經(jīng)典的多路復用模型epoll誕生。K0h28資訊網(wǎng)——每日最新資訊28at.com

IO多路復用之epoll

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

圖片圖片K0h28資訊網(wǎng)——每日最新資訊28at.com

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

我們一起來總結(jié)一下select、poll、epoll的區(qū)別K0h28資訊網(wǎng)——每日最新資訊28at.com


K0h28資訊網(wǎng)——每日最新資訊28at.com

select
K0h28資訊網(wǎng)——每日最新資訊28at.com

poll
K0h28資訊網(wǎng)——每日最新資訊28at.com

epoll
K0h28資訊網(wǎng)——每日最新資訊28at.com

底層數(shù)據(jù)結(jié)構(gòu)
K0h28資訊網(wǎng)——每日最新資訊28at.com

數(shù)組
K0h28資訊網(wǎng)——每日最新資訊28at.com

鏈表
K0h28資訊網(wǎng)——每日最新資訊28at.com

紅黑樹和雙鏈表
K0h28資訊網(wǎng)——每日最新資訊28at.com

獲取就緒的fd
K0h28資訊網(wǎng)——每日最新資訊28at.com

遍歷
K0h28資訊網(wǎng)——每日最新資訊28at.com

遍歷
K0h28資訊網(wǎng)——每日最新資訊28at.com

事件回調(diào)
K0h28資訊網(wǎng)——每日最新資訊28at.com

事件復雜度
K0h28資訊網(wǎng)——每日最新資訊28at.com

O(n)
K0h28資訊網(wǎng)——每日最新資訊28at.com

O(n)
K0h28資訊網(wǎng)——每日最新資訊28at.com

O(1)
K0h28資訊網(wǎng)——每日最新資訊28at.com

最大連接數(shù)
K0h28資訊網(wǎng)——每日最新資訊28at.com

1024
K0h28資訊網(wǎng)——每日最新資訊28at.com

無限制
K0h28資訊網(wǎng)——每日最新資訊28at.com

無限制
K0h28資訊網(wǎng)——每日最新資訊28at.com

fd數(shù)據(jù)拷貝
K0h28資訊網(wǎng)——每日最新資訊28at.com

每次調(diào)用select,需要將fd數(shù)據(jù)從用戶空間拷貝到內(nèi)核空間
K0h28資訊網(wǎng)——每日最新資訊28at.com

每次調(diào)用poll,需要將fd數(shù)據(jù)從用戶空間拷貝到內(nèi)核空間
K0h28資訊網(wǎng)——每日最新資訊28at.com

使用內(nèi)存映射(mmap),不需要從用戶空間頻繁拷貝fd數(shù)據(jù)到內(nèi)核空間
K0h28資訊網(wǎng)——每日最新資訊28at.com

epoll明顯優(yōu)化了IO的執(zhí)行效率,但在進程調(diào)用epoll_wait()時,仍然可能被阻塞。能不能醬紫:不用我老是去問你數(shù)據(jù)是否準備就緒,等我發(fā)出請求后,你數(shù)據(jù)準備好了通知我就行了,這就誕生了信號驅(qū)動IO模型。K0h28資訊網(wǎng)——每日最新資訊28at.com

IO模型之信號驅(qū)動模型

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

圖片圖片K0h28資訊網(wǎng)——每日最新資訊28at.com

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

IO 模型之異步IO(AIO)

前面講的BIO,NIO和信號驅(qū)動,在數(shù)據(jù)從內(nèi)核復制到應用緩沖的時候,都是阻塞的,因此都不算是真正的異步。AIO實現(xiàn)了IO全流程的非阻塞,就是應用進程發(fā)出系統(tǒng)調(diào)用后,是立即返回的,但是立即返回的不是處理結(jié)果,而是表示提交成功類似的意思。等內(nèi)核數(shù)據(jù)準備好,將數(shù)據(jù)拷貝到用戶進程緩沖區(qū),發(fā)送信號通知用戶進程IO操作執(zhí)行完畢。K0h28資訊網(wǎng)——每日最新資訊28at.com

流程如下:K0h28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片K0h28資訊網(wǎng)——每日最新資訊28at.com

異步IO的優(yōu)化思路很簡單,只需要向內(nèi)核發(fā)送一次請求,就可以完成數(shù)據(jù)狀態(tài)詢問和數(shù)據(jù)拷貝的所有操作,并且不用阻塞等待結(jié)果。日常開發(fā)中,有類似思想的業(yè)務場景:K0h28資訊網(wǎng)——每日最新資訊28at.com

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

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

圖片圖片K0h28資訊網(wǎng)——每日最新資訊28at.com

IO模型
K0h28資訊網(wǎng)——每日最新資訊28at.com


K0h28資訊網(wǎng)——每日最新資訊28at.com

阻塞I/O模型
K0h28資訊網(wǎng)——每日最新資訊28at.com

同步阻塞
K0h28資訊網(wǎng)——每日最新資訊28at.com

非阻塞I/O模型
K0h28資訊網(wǎng)——每日最新資訊28at.com

同步非阻塞
K0h28資訊網(wǎng)——每日最新資訊28at.com

I/O多路復用模型
K0h28資訊網(wǎng)——每日最新資訊28at.com

同步阻塞
K0h28資訊網(wǎng)——每日最新資訊28at.com

信號驅(qū)動I/O模型
K0h28資訊網(wǎng)——每日最新資訊28at.com

同步非阻塞
K0h28資訊網(wǎng)——每日最新資訊28at.com

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

異步非阻塞
K0h28資訊網(wǎng)——每日最新資訊28at.com

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

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

一個經(jīng)典生活的例子:K0h28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

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

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

標簽:
  • 熱門焦點
  • K60至尊版狂暴引擎2.0加持:超177萬跑分斬獲性能第一

    Redmi的后性能時代戰(zhàn)略發(fā)布會今天下午如期舉辦,在本次發(fā)布會上,Redmi公布了多項關于和聯(lián)發(fā)科的深度合作,以及新機K60 Ultra在軟件和硬件方面的特性,例如:“K60 至尊版,雙芯旗艦
  • JavaScript 混淆及反混淆代碼工具

    介紹在我們開始學習反混淆之前,我們首先要了解一下代碼混淆。如果不了解代碼是如何混淆的,我們可能無法成功對代碼進行反混淆,尤其是使用自定義混淆器對其進行混淆時。什么是混
  • Automa-通過連接塊來自動化你的瀏覽器

    1、前言通過瀏覽器插件可實現(xiàn)自動化腳本的錄制與編寫,具有代表性的工具就是:Selenium IDE、Katalon Recorder,對于簡單的業(yè)務來說可快速實現(xiàn)自動化的上手工作。Selenium IDEKat
  • JavaScript學習 -AES加密算法

    引言在當今數(shù)字化時代,前端應用程序扮演著重要角色,用戶的敏感數(shù)據(jù)經(jīng)常在前端進行加密和解密操作。然而,這樣的操作在網(wǎng)絡傳輸和存儲中可能會受到惡意攻擊的威脅。為了確保數(shù)據(jù)
  • 年輕人的“職場羞恥感”,無處不在

    作者:馮曉亭 陶 淘 李 欣 張 琳 馬舒葉來源:燃次元“人在職場,應該選擇什么樣的著裝?”近日,在網(wǎng)絡上,一個與著裝相關的帖子引發(fā)關注,在該帖子里,一位在高級寫字樓亞洲金
  • 重估百度丨大模型,能撐起百度的“今天”嗎?

    自象限原創(chuàng) 作者|程心 羅輯2023年之前,對于自己的“今天”,百度也很迷茫。“新業(yè)務到 2022 年底還是 0,希望 2023 年出來一個 1。”這是2022年底,李彥宏
  • 小米汽車電池信息疑似曝光:容量101kWh,支持800V高壓快充

    7月14日消息,今日一名博主在社交媒體發(fā)布了一張疑似小米汽車電池信息的照片,顯示該電池包正是寧德時代麒麟電池,容量為101kWh,電壓為726.7V,可以預測小
  • 英特爾Xe HPG游戲顯卡:擁有512EU,單風扇版本

    據(jù)10 月 30 日外媒 TheVerge 消息報道,英特爾 Xe HPG Arc Alchemist 的正面實被曝光,不僅擁有 512 EU 版顯卡,還擁有 128EU 的單風扇版本。另外,這款顯卡 PCB
  • 北京:科技教育體驗基地開始登記

      北京“科技館之城”科技教育體驗基地登記和認證工作日前啟動。首批北京科技教育體驗基地擬于2023年全國科普日期間掛牌,后續(xù)還將開展常態(tài)化登記。  北京科技教育體驗基
Top