chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

3天內(nèi)不再提示

一文詳細了解五種IO模型

GReq_mcu168 ? 來源:嚕嚕呀? ? 作者:嚕嚕呀? ? 2022-02-14 14:38 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、基本概念

五種IO模型包括:阻塞IO、非阻塞IO、IO多路復(fù)用、信號驅(qū)動IO、異步IO。

首先需要了解下系統(tǒng)調(diào)用的幾個函數(shù)和基本概念。

1.1 簡單介紹幾個系統(tǒng)調(diào)用函數(shù)

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

recvfrom

Linux系統(tǒng)提供給用戶用于接收網(wǎng)絡(luò)IO的系統(tǒng)接口。從套接字上接收一個消息,可同時應(yīng)用于面向連接和無連接的套接字。

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

select

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

poll

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

epoll

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

sigaction

用于設(shè)置對信號的處理方式,也可檢驗對某信號的預(yù)設(shè)處理方式。Linux使用SIGIO信號來實現(xiàn)IO異步通知機制。

1.2 同步&異步

同步和異步是針對應(yīng)用程序和內(nèi)核交互而言的,也可理解為被被調(diào)用者(操作系統(tǒng))的角度來說。

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

1.3 阻塞&非阻塞

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

阻塞方式下讀取或?qū)懭敕椒▽⒁恢钡却?,而非阻塞方式下讀取或?qū)懭敕椒〞⒓捶祷匾粋€狀態(tài)值。

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

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

二、阻塞IO模型

學(xué)習過操作系統(tǒng)的知識后,可以知道:不管是網(wǎng)絡(luò)IO還是磁盤IO,對于讀操作而言,都是等到網(wǎng)絡(luò)的某個數(shù)據(jù)分組到達后/數(shù)據(jù)準備好后,將數(shù)據(jù)拷貝到內(nèi)核空間的緩沖區(qū)中,再從內(nèi)核空間拷貝到用戶空間的緩沖區(qū)。

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

此處需要一個清新的腦回路,我就是程序,我想要全家桶,于是發(fā)起了系統(tǒng)調(diào)用,而后廚加工的過程就是在做數(shù)據(jù)準備和拷貝工作。全家桶最終到手,數(shù)據(jù)終于從內(nèi)核空間拷貝到了用戶空間。

簡單看下執(zhí)行流程:

一文詳細了解五種IO模型

接下來發(fā)揮看圖說話的專長了:阻塞IO的執(zhí)行過程是進程進行系統(tǒng)調(diào)用,等待內(nèi)核將數(shù)據(jù)準備好并復(fù)制到用戶態(tài)緩沖區(qū)后,進程放棄使用CPU并一直阻塞在此,直到數(shù)據(jù)準備好。

三、非阻塞IO模型

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

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

一文詳細了解五種IO模型

大致經(jīng)歷兩個階段:

等待數(shù)據(jù)階段:未阻塞, 用戶進程需要盲等,不停的去輪詢內(nèi)核。

數(shù)據(jù)復(fù)制階段:阻塞,此時進行數(shù)據(jù)復(fù)制。

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

四、IO多路復(fù)用模型

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

多路復(fù)用一般都是用于網(wǎng)絡(luò)IO,服務(wù)端與多個客戶端的建立連接。下面是神奇的多路復(fù)用執(zhí)行過程:

一文詳細了解五種IO模型

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

對于客戶端來說,一般感受不到阻塞,因為請求來了,可以用放到線程池里執(zhí)行;但對于執(zhí)行select的操作系統(tǒng)而言,是阻塞的,需要阻塞地等待某個套接字變?yōu)榭勺x。

IO多路復(fù)用其實是阻塞在select,poll,epoll這類系統(tǒng)調(diào)用上的,復(fù)用的是執(zhí)行select,poll,epoll的線程。

五、信號驅(qū)動IO模型

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

當數(shù)據(jù)報準備好的時候,內(nèi)核會向應(yīng)用程序發(fā)送一個信號,進程對信號進行捕捉,并且調(diào)用信號處理函數(shù)來獲取數(shù)據(jù)報。

一文詳細了解五種IO模型

該模型也分為兩個階段:

數(shù)據(jù)準備階段:未阻塞,當數(shù)據(jù)準備完成之后,會主動的通知用戶進程數(shù)據(jù)已經(jīng)準備完成,對用戶進程做一個回調(diào)。

數(shù)據(jù)拷貝階段:阻塞用戶進程,等待數(shù)據(jù)拷貝。

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

類比一下,就是用戶進程發(fā)起系統(tǒng)調(diào)用后,立刻就可以開始去做其他的事情,然后直到I/O數(shù)據(jù)準備好并復(fù)制完成后,內(nèi)核會給用戶進程發(fā)送通知,告訴用戶進程操作已經(jīng)完成了。

一文詳細了解五種IO模型

特點:

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

完成后內(nèi)核將數(shù)據(jù)放到指定的緩沖區(qū),通知應(yīng)用程序來取。

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

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

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

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

實現(xiàn)過程:

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

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

使用場景:

BIO適用于連接數(shù)目比較小且固定的架構(gòu),對服務(wù)器資源要求高,并發(fā)局限于應(yīng)用中。

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

7.2.1 NIO簡介

NIO 本身是基于事件驅(qū)動思想來完成的,當 socket 有流可讀或可寫入時,操作系統(tǒng)會相應(yīng)地通知應(yīng)用程序進行處理,應(yīng)用再將流讀取到緩沖區(qū)或?qū)懭氩僮飨到y(tǒng)。一個有效的請求對應(yīng)一個線程,當連接沒有數(shù)據(jù)時,是沒有工作線程來處理的。

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

使用場景:

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

7.2.2 NIO中的幾種重要角色

有緩沖區(qū)Buffer,通道Channel,多路復(fù)用器Selector。

7.2.2.1 Buffer

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

緩沖區(qū)實際上是一個數(shù)組,并提供了對數(shù)據(jù)的結(jié)構(gòu)化訪問以及維護讀寫位置等信息。

Buffer的應(yīng)用固定邏輯

相關(guān)的代碼我會更新至github~

寫操作順序

clear()

put() -> 寫操作

flip() ->重置游標

SocketChannel.write(buffer); ->將緩存數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)的另一端

clear()

讀操作順序

clear()

SocketChannel.read(buffer); ->從網(wǎng)絡(luò)中讀取數(shù)據(jù)

buffer.flip()

buffer.get() ->讀取數(shù)據(jù)

buffer.clear()

7.2.2.2 Channel

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

7.2.2.3 Selector

多路復(fù)用器,用于注冊通道。客戶端發(fā)送的連接請求都會注冊到多路復(fù)用器上,多路復(fù)用器輪詢到連接有I/O請求時才啟動一個線程進行處理

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

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

使用場景

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

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

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

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

審核編輯:湯梓紅

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

    關(guān)注

    88

    文章

    11575

    瀏覽量

    216605
  • C語言
    +關(guān)注

    關(guān)注

    183

    文章

    7634

    瀏覽量

    143880
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4400

    瀏覽量

    66345

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    讀懂大模型常見的10個核心概念

    這些常見的專業(yè)術(shù)語,你又了解多少?這篇文章將幫助你快速掌握AI行業(yè)常見的核心概念。1、大模型型號每個大模型都有其獨特的設(shè)計和功能,有些大模型可能在語言理解方面表現(xiàn)出
    的頭像 發(fā)表于 09-22 17:02 ?979次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b>讀懂大<b class='flag-5'>模型</b>常見的10個核心概念

    詳解Advanced IO wizard異步模式

    7nm Versal系列相對于16nm Ultrascale plus系列,IO做了升級,U+系列的HPIO在Versal升級為XPIO。Versal系列每個XPIO bank包含54個IO管腳
    的頭像 發(fā)表于 07-11 09:52 ?967次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b>詳解Advanced <b class='flag-5'>IO</b> wizard異步模式

    寧暢與與百度心大模型展開深度技術(shù)合作

    與部署。 憑借覆蓋訓(xùn)練、推理、微調(diào)全流程的AI?服務(wù)器產(chǎn)品矩陣,寧暢幫助企業(yè)在大模型時代鍵打通算力與應(yīng)用“任督二脈”,顯著縮短模型落地周期。 在已啟動的深度技術(shù)合作中,雙方將基于
    的頭像 發(fā)表于 07-07 16:26 ?468次閱讀

    黑芝麻智能與心大模型技術(shù)合作升級

    近日,心大模型正式開源,黑芝麻智能即日起快速啟動與心大模型技術(shù)合作。
    的頭像 發(fā)表于 07-04 17:24 ?828次閱讀
    黑芝麻智能與<b class='flag-5'>文</b>心大<b class='flag-5'>模型</b>技術(shù)合作升級

    龍芯中科與心系列模型開展深度技術(shù)合作

    ? ? ? ? ? 6月30日,心4.5系列模型正式開源。龍芯中科在心大模型開源首日啟動技術(shù)合作,雙方將共同推進國產(chǎn)算力基礎(chǔ)設(shè)施與大模型
    的頭像 發(fā)表于 07-02 16:53 ?980次閱讀

    PDM產(chǎn)品數(shù)據(jù)管理是什么?詳細了解三品PDM系統(tǒng)

    在當今競爭激烈的商業(yè)環(huán)境中,企業(yè)為了提升自身的競爭力,不斷尋求各種方法來優(yōu)化產(chǎn)品開發(fā)流程、提高生產(chǎn)效率以及降低成本。PDM(產(chǎn)品數(shù)據(jù)管理)系統(tǒng)作為一種強大的工具,正在逐漸成為企業(yè)實現(xiàn)這些目標的關(guān)鍵。
    的頭像 發(fā)表于 03-25 14:01 ?679次閱讀

    AI算法托管平臺是什么

    AI算法托管平臺是一種提供AI模型運行、管理和優(yōu)化等服務(wù)的云端或邊緣計算平臺。下面,AI部落小編帶您詳細了解AI算法托管平臺。
    的頭像 發(fā)表于 03-06 10:22 ?683次閱讀

    百度下心大模型正式開源

    隨著心大模型的迭代升級和成本不斷下降,言將于4月1日0時起全面免費,所有PC端和APP端用戶均可體驗心系列最新
    的頭像 發(fā)表于 02-17 13:44 ?709次閱讀

    百度搜索與心智能體平臺接入DeepSeek及心大模型深度搜索

    近日,百度搜索與心智能體平臺聯(lián)合宣布了項重要更新:將全面接入DeepSeek及心大模型最新的深度搜索功能。這更新將為用戶和開發(fā)者帶來
    的頭像 發(fā)表于 02-17 09:14 ?848次閱讀

    詳解視覺語言模型

    視覺語言模型(VLM)是一種多模態(tài)、生成式 AI 模型,能夠理解和處理視頻、圖像和文本。
    的頭像 發(fā)表于 02-12 11:13 ?2697次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b>詳解視覺語言<b class='flag-5'>模型</b>

    說清楚什么是AI大模型

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

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

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

    常見的PCB表面處理技術(shù)

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

    理解多模態(tài)大語言模型——下

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

    解讀Linux 5IO模型

    Linux里有IO模型:阻塞IO、非阻塞IO、多路復(fù)用I
    的頭像 發(fā)表于 11-09 11:12 ?1154次閱讀
    <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>