衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一文詳細了解五種IO模型

GReq_mcu168 ? 來源:嚕嚕呀? ? 作者:嚕嚕呀? ? 2022-02-14 14:38 ? 次閱讀

一、基本概念

五種IO模型包括:阻塞IO、非阻塞IO、IO多路復用、信號驅動IO、異步IO。

首先需要了解下系統調用的幾個函數和基本概念。

1.1 簡單介紹幾個系統調用函數

由于我對于C語言不熟悉,幾個系統函數參考了一些文章,如果錯誤歡迎指出!

recvfrom

Linux系統提供給用戶用于接收網絡IO的系統接口。從套接字上接收一個消息,可同時應用于面向連接和無連接的套接字。

如果此系統調用返回值<0,并且 errno為EWOULDBLOCK或EAGAIN(套接字已標記為非阻塞,而接收操作被阻塞或者接收超時 )時,連接正常,阻塞**接收數據(這很關鍵,前4種IO模型都設計此系統調用)。

select

select系統調用允許程序同時在多個底層文件描述符上,等待輸入的到達或輸出的完成。以數組形式存儲文件描述符,64位機器默認2048個。當有數據準備好時,無法感知具體是哪個流OK了,所以需要一個一個的遍歷,函數的時間復雜度為O(n)。

poll

以鏈表形式存儲文件描述符,沒有長度限制。本質與select相同,函數的時間復雜度也為O(n)。

epoll

是基于事件驅動的,如果某個流準備好了,會以事件通知,知道具體是哪個流,因此不需要遍歷,函數的時間復雜度為O(1)。

sigaction

用于設置對信號的處理方式,也可檢驗對某信號的預設處理方式。Linux使用SIGIO信號來實現IO異步通知機制。

1.2 同步&異步

同步和異步是針對應用程序和內核交互而言的,也可理解為被被調用者(操作系統)的角度來說。

同步是用戶進程觸發IO操作并等待或輪詢的去查看是否就緒,而異步是指用戶進程觸發IO操作以后便開始做自己的事情,而當IO操作已經完成的時候會得到IO完成的通知,需要CPU支持

1.3 阻塞&非阻塞

阻塞和非阻塞是針對于進程在訪問數據的時候,也可理解為調用者(程序)角度來說。根據IO操作的就緒狀態來采取的不同的方式。

阻塞方式下讀取或寫入方法將一直等待,而非阻塞方式下讀取或寫入方法會立即返回一個狀態值。

下午擼代碼餓了,好久沒吃KFC了,決定去整個全家桶 ,這一切都要從一個全家桶說起~

我跑去肯德基買全家桶,但是很不巧,輪到我時,全家桶賣完了,我只能等著新做一份 …

二、阻塞IO模型

學習過操作系統的知識后,可以知道:不管是網絡IO還是磁盤IO,對于讀操作而言,都是等到網絡的某個數據分組到達后/數據準備好后,將數據拷貝到內核空間的緩沖區中,再從內核空間拷貝到用戶空間的緩沖區。

此時我已饑渴難耐,全程盯著后廚,等待著一分一秒(別多想 ),終于全家桶做好了,在此期間雖然什么事也沒干,但是最后能吃到全家桶,我很幸福。

此處需要一個清新的腦回路,我就是程序,我想要全家桶,于是發起了系統調用,而后廚加工的過程就是在做數據準備和拷貝工作。全家桶最終到手,數據終于從內核空間拷貝到了用戶空間。

簡單看下執行流程:

一文詳細了解五種IO模型

接下來發揮看圖說話的專長了:阻塞IO的執行過程是進程進行系統調用,等待內核將數據準備好并復制到用戶態緩沖區后,進程放棄使用CPU并一直阻塞在此,直到數據準備好。

三、非阻塞IO模型

此時我每隔5分鐘詢問全家桶好了沒,在數次盤問后,終于出爐了。在每一次盤問之前,對于程序來說是非阻塞的,占用CPU資源,可以做其他事情。

每次應用程序詢問內核是否有數據準備好。如果就緒,就進行拷貝操作;如果未就緒,就不阻塞程序,內核直接返回未就緒的返回值,等待用戶程序下一個輪詢。

一文詳細了解五種IO模型

大致經歷兩個階段:

等待數據階段:未阻塞, 用戶進程需要盲等,不停的去輪詢內核。

數據復制階段:阻塞,此時進行數據復制。

在這兩個階段中,用戶進程只有在數據復制階段被阻塞了,而等待數據階段沒有阻塞,但是用戶進程需要盲等,不停地輪詢內核,看數據是否準備好。

四、IO多路復用模型

排了很長的隊,終于輪到我支付后,拿到了一張小票,上面有號次。當全家桶出爐后,會喊相應的號次來取。KFC營業員小姐姐打小票出號次的動作相當于操作系統多開了個線程,專門接收客戶端的連接。我只關注叫到的是不是我的號,因此程序還需在服務端注冊我想監聽的事件類型。

多路復用一般都是用于網絡IO,服務端與多個客戶端的建立連接。下面是神奇的多路復用執行過程:

一文詳細了解五種IO模型

相比于阻塞IO模型,多路復用只是多了一個select/poll/epoll函數。select函數會不斷地輪詢自己所負責的文件描述符/套接字的到達狀態,當某個套接字就緒時,就對這個套接字進行處理。select負責輪詢等待,recvfrom負責拷貝。當用戶進程調用該select,select會監聽所有注冊好的IO,如果所有IO都沒注冊好,調用進程就阻塞。

對于客戶端來說,一般感受不到阻塞,因為請求來了,可以用放到線程池里執行;但對于執行select的操作系統而言,是阻塞的,需要阻塞地等待某個套接字變為可讀。

IO多路復用其實是阻塞在select,poll,epoll這類系統調用上的,復用的是執行select,poll,epoll的線程。

五、信號驅動IO模型

跑KFC嫌麻煩,剛好有個會員,直接點份外賣,美滋滋。當外賣送達時,會收到取餐電話(信號)。在收到取餐電話之前,我可以愉快地吃雞或者學習。

當數據報準備好的時候,內核會向應用程序發送一個信號,進程對信號進行捕捉,并且調用信號處理函數來獲取數據報。

一文詳細了解五種IO模型

該模型也分為兩個階段:

數據準備階段:未阻塞,當數據準備完成之后,會主動的通知用戶進程數據已經準備完成,對用戶進程做一個回調。

數據拷貝階段:阻塞用戶進程,等待數據拷貝。

六、異步IO模型此時科技的發展已經超乎想象了,外賣機器人將全家桶自動送達并轉換成營養快速注入我的體內,同時還能得到口感的滿足。注入結束后,機器人會提醒我注入完畢。在這個期間我可以放心大膽的玩,甚至注射的時候也不需要停下來!

類比一下,就是用戶進程發起系統調用后,立刻就可以開始去做其他的事情,然后直到I/O數據準備好并復制完成后,內核會給用戶進程發送通知,告訴用戶進程操作已經完成了。

一文詳細了解五種IO模型

特點:

異步I/O執行的兩個階段都不會阻塞讀寫操作,由內核完成。

完成后內核將數據放到指定的緩沖區,通知應用程序來取。

七、Java中的BIO,NIO,AIO操作系統的IO模型是底層基石,Java對于IO的操作其實就是進一步的封裝。適配一些系統調用方法,讓我們玩地更爽。

BIO,NIO,AIO涉及相關實操代碼已收錄至我的github,歡迎star~

7.1 BIO--同步阻塞的編程方式

JDK1.4之前常用的編程方式。

實現過程:

首先在服務端啟動一個ServerSocket來監聽網絡請求,客戶端啟動Socket發起網絡請求,默認情況下ServerSocket會建立一個線程來處理此請求,如果服務端沒有線程可用,客戶端則會阻塞等待或遭到拒絕,并發效率比較低。

服務器實現的模式是一個連接一個線程,若有客戶端有連接請求服務端就需要啟動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷。當然,也可以通過線程池機制改善。

使用場景:

BIO適用于連接數目比較小且固定的架構,對服務器資源要求高,并發局限于應用中。

7.2 NIO--同步非阻塞的編程方式

7.2.1 NIO簡介

NIO 本身是基于事件驅動思想來完成的,當 socket 有流可讀或可寫入時,操作系統會相應地通知應用程序進行處理,應用再將流讀取到緩沖區或寫入操作系統。一個有效的請求對應一個線程,當連接沒有數據時,是沒有工作線程來處理的。

服務器實現模式為一個請求一個通道,即客戶端發送的連接請求都會注冊到多路復用器上,多路復用器輪詢到連接有 I/O 請求時才啟動一個線程進行處

使用場景:

NIO 方式適用于連接數目多且連接比較短(輕操作)的架構,比如聊天服務器,并發局限于應用中,編程復雜,JDK1.4 開始支持。

7.2.2 NIO中的幾種重要角色

有緩沖區Buffer,通道Channel,多路復用器Selector。

7.2.2.1 Buffer

在NIO庫中,所有數據都是用緩沖區(用戶空間緩沖區)處理的。在讀取數據時,它是直接讀到緩沖區中的;在寫入數據時,也是寫入到緩沖區中。任何時候訪問NIO中的數據,都是通過緩沖區進行操作。

緩沖區實際上是一個數組,并提供了對數據的結構化訪問以及維護讀寫位置等信息。

Buffer的應用固定邏輯

相關的代碼我會更新至github~

寫操作順序

clear()

put() -> 寫操作

flip() ->重置游標

SocketChannel.write(buffer); ->將緩存數據發送到網絡的另一端

clear()

讀操作順序

clear()

SocketChannel.read(buffer); ->從網絡中讀取數據

buffer.flip()

buffer.get() ->讀取數據

buffer.clear()

7.2.2.2 Channel

nio中對數據的讀取和寫入要通過Channel,它就像水管一樣,是一個通道。通道不同于流的地方就是通道是雙向的,可以用于讀、寫和同時讀寫操作。

7.2.2.3 Selector

多路復用器,用于注冊通道??蛻舳税l送的連接請求都會注冊到多路復用器上,多路復用器輪詢到連接有I/O請求時才啟動一個線程進行處理

7.3 AIO--異步非阻塞編程方式

進行讀寫操作時,只須直接調用api的read或write方法即可。一個有效請求對應一個線程,客戶端的IO請求都是OS先完成了再通知服務器應用去啟動線程進行處理。

使用場景

AIO方式使用于連接數目多且連接比較長(重操作)的架構,比如相冊服務器,充分調用OS參與并發操作,編程比較復雜,JDK1.7開始支持。

八、總結從效率上來說,可以簡單理解為阻塞IO<非阻塞IO<多路復用IO<信號驅動IO<異步IO。從同步和異步來說,只有異步IO模型是異步的,其他均為同步。

原文標題:一口氣說出5種IO模型的

文章出處:【微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11345

    瀏覽量

    210409
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137736
  • 函數
    +關注

    關注

    3

    文章

    4346

    瀏覽量

    62978

原文標題:一口氣說出5種IO模型的

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    說清楚什么是AI大模型

    生成能力強,部分版本支持多模態輸入(如圖像理解) 言 百度 針對中文優化,適合國內應用場景 LLa
    的頭像 發表于 01-02 09:53 ?577次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b>說清楚什么是AI大<b class='flag-5'>模型</b>

    詳細了解驍龍8至尊版強大的AI能力

    強大的AI性能加持下,可支持個性化的多模態AI助手,并為終端設備帶來全面煥新的AI影像和豐富有趣的AI游戲體驗。下面,就讓我們詳細了解驍龍8至尊版強大的AI能力。 全面升級的AI性能 早在第三代驍龍8移動平臺上,高通已將高性能AI注入整個
    的頭像 發表于 12-24 11:47 ?729次閱讀
    <b class='flag-5'>詳細了解</b>驍龍8至尊版強大的AI能力

    常見的PCB表面處理技術

    PCB(印刷電路板)的表面處理技術對于保證電路板的焊接性能、電氣連接可靠性以及耐腐蝕性具有重要意義,不同的表面處理技術適用于不同的應用場景和性能要求。本文將帶您詳細了解常見的PCB表面處理技術。
    的頭像 發表于 12-11 09:17 ?754次閱讀

    理解多模態大語言模型——下

    /understanding-multimodal-llms ? 《理解多模態大語言模型 - 上》介紹了什么是多模態大語言模型,以及構建多模態 LLM 有兩
    的頭像 發表于 12-03 15:18 ?203次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b>理解多模態大語言<b class='flag-5'>模型</b>——下

    解讀Linux 5IO模型

    Linux里有IO模型:阻塞IO、非阻塞IO、多路復用I
    的頭像 發表于 11-09 11:12 ?425次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b>解讀Linux 5<b class='flag-5'>種</b><b class='flag-5'>IO</b><b class='flag-5'>模型</b>

    晶閘管導通的情況

    晶閘管作為一種重要的電力電子器件,其導通狀態受多種因素影響。以下是晶閘管導通的詳細情況,每種情況都結合了晶閘管的工作原理、結構特性及外部條件進行闡述。
    的頭像 發表于 08-27 16:25 ?2687次閱讀

    【附實操視頻】聆思CSK6大模型開發板接入國內主流大模型(星火大模型、言、豆包、kimi、智譜glm、通義千問)

    輸出的結果進行語音合成實現端側播報。 目前已經接通言、豆包、kimi、智譜glm、通義千問等國內主流大模型,詳細模板和操作步驟可以參考附件文檔。
    發表于 08-22 10:12

    想要了解下大模型知識

    工作需要,想要了解下大模型算力建設知識。
    發表于 08-20 15:31

    了解MySQL索引機制

    的呢?起靜下心來,耐心看完這篇文章吧,干貨不啰嗦,相信你定會有所收獲。 、索引模型 模型也就是數據結構,常見的三
    的頭像 發表于 07-25 14:05 ?343次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>了解</b>MySQL索引機制

    體式IO與分布式IO:工業控制系統的兩架構

    受到青睞。然而,體式IO架構在小型系統中仍然有著廣泛的應用。了解這兩架構的特點和區別,有助于工程師和決策者為企業選擇最合適的工業控制系統解決方案。
    的頭像 發表于 07-17 16:12 ?1195次閱讀
    <b class='flag-5'>一</b>體式<b class='flag-5'>IO</b>與分布式<b class='flag-5'>IO</b>:工業控制系統的兩<b class='flag-5'>種</b>架構

    波特模型和swot分析的區別

    。。 、波特模型概述 波特模型(Porter's Five Forces Model)是由美國著名管理學家邁克爾·波特(Micha
    的頭像 發表于 07-05 14:39 ?4932次閱讀

    什么是波特模型,如何應用

    波特模型(Porter's Five Forces Model)是邁克爾·波特(Michael E. Porter)于1979年提出的,用于分析行業競爭狀況和企業競爭戰略的一種理論模型
    的頭像 發表于 07-05 14:36 ?2753次閱讀

    簡述使用波特模型的三個步驟

    企業了解行業的競爭環境,從而制定相應的競爭策略。以下是使用波特模型的三個步驟。 第步:識別行業 在使用波特
    的頭像 發表于 07-05 14:34 ?1057次閱讀

    帶你詳細了解工業電腦

    扇設計、承受振動和惡劣環境的能力、輕松配置、全面的I/O選項、延長生命周期、耐用的組件。了解如何為您的應用選擇工業電腦對提高設施的生產力和效率至關重要。詳細了解
    的頭像 發表于 06-12 14:24 ?487次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b>帶你<b class='flag-5'>詳細了解</b>工業電腦

    pcb應變測試有多重要?了解!

    pcb應變測試有多重要?了解!
    的頭像 發表于 02-24 16:26 ?1181次閱讀
    百家乐官网真人游戏网| 壹贰博百家乐官网娱乐城| 德州百家乐扑克桌| 大发888娱乐城健账号| 双峰县| 百家乐官网免费改单| 百家乐怎样出千| 金博士娱乐城优惠| 澳门百家乐官网是怎样赌| 打百家乐的介绍| 大发888游戏下载官网免费| 保单百家乐官网技巧| 艮山坤向 24山| 太阳城管理| 百家乐官网巴黎| 真人百家乐娱乐好玩| bet365提款| 电子百家乐官网作假| 总统百家乐的玩法技巧和规则 | 百家乐游戏机在哪有| 大发888娱乐城3403| 百家乐官网技巧-百家乐官网开户指定代理网址 | 六合彩资料| 百家乐官网游戏方法| 美女百家乐的玩法技巧和规则| 贵族娱乐城信誉| 百家乐官网又称什么| 大发888在线下载| 新锦江百家乐官网娱乐平台| 在线百家乐策略| 百家乐官网庄闲收益率| 真人百家乐什么平台| 真钱棋牌导航网| 网上百家乐的技巧| A8娱乐城官网| 做生意需要找风水先生吗| 星空棋牌舟山清墩| 百家乐官网庄闲对冲| 德州百家乐21点桌| 网上百家乐官网有人赢过吗| 百家乐平技巧|