99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

深入了解IO模型的內(nèi)部玄機(jī)

汽車玩家 ? 來源:今日頭條 ? 作者:咔咔侃技術(shù) ? 2020-05-03 09:38 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1. 引言

同步異步I/O,阻塞非阻塞I/O是程序員老生常談的話題了,也是自己一直以來懵懵懂懂的一個(gè)話題。比如:何為同步異步?何為阻塞與非阻塞?二者的區(qū)別在哪里?阻塞在何處?為什么會有多種IO模型,分別用來解決問題?常用的框架采用的是何種I/O模型?各種IO模型的優(yōu)劣勢在哪里,適用于何種應(yīng)用場景?

簡而言之,對于I/O的認(rèn)知,不能僅僅停留在字面上認(rèn)識,了解內(nèi)部玄機(jī),才能深刻理解I/O,才能看清I/O相關(guān)問題的本質(zhì)。

2. I/O 的定義

I/O 的全稱是Input/Output。雖常談及I/O,但想必你也一時(shí)不能給出一個(gè)完整的定義。搜索了谷歌,發(fā)現(xiàn)也盡是些冗長的論述。要想理清I/O這個(gè)概念,我們需要從不同的視角去理解它。

2.1. 計(jì)算機(jī)視角

馮?諾伊曼計(jì)算機(jī)的基本思想中有提到計(jì)算機(jī)硬件組成應(yīng)為五大部分:控制器,運(yùn)算器,存儲器,輸入和輸出。其中輸入是指將數(shù)據(jù)輸入到計(jì)算機(jī)的設(shè)備,比如鍵盤鼠標(biāo);輸出是指從計(jì)算機(jī)中獲取數(shù)據(jù)的設(shè)備,比如顯示器;以及既是輸入又是輸出設(shè)備,硬盤,網(wǎng)卡等。

用戶通過操作系統(tǒng)才能完成對計(jì)算機(jī)的操作。計(jì)算機(jī)啟動時(shí),第一個(gè)啟動的程序是操作系統(tǒng)的內(nèi)核,它將負(fù)責(zé)計(jì)算機(jī)的資源管理和進(jìn)程的調(diào)度。換句話說:操作系統(tǒng)負(fù)責(zé)從輸入設(shè)備讀取數(shù)據(jù)并將數(shù)據(jù)寫入到輸出設(shè)備。

所以I/O之于計(jì)算機(jī),有兩層意思:

I/O設(shè)備

對I/O設(shè)備的數(shù)據(jù)讀寫

對于一次I/O操作,必然涉及2個(gè)參與方,一個(gè)輸入端,一個(gè)輸出端,而又根據(jù)參與雙方的設(shè)備類型,我們又可以分為磁盤I/O,網(wǎng)絡(luò)I/O(一次網(wǎng)絡(luò)的請求響應(yīng),網(wǎng)卡)等。

2.2. 程序視角

應(yīng)用程序作為一個(gè)文件保存在磁盤中,只有加載到內(nèi)存到成為一個(gè)進(jìn)程才能運(yùn)行。應(yīng)用程序運(yùn)行在計(jì)算機(jī)內(nèi)存中,必然會涉及到數(shù)據(jù)交換,比如讀寫磁盤文件,訪問數(shù)據(jù)庫,調(diào)用遠(yuǎn)程API等等。但我們編寫的程序并不能像操作系統(tǒng)內(nèi)核一樣直接進(jìn)行I/O操作。

因?yàn)闉榱舜_保操作系統(tǒng)的安全穩(wěn)定運(yùn)行,操作系統(tǒng)啟動后,將會開啟保護(hù)模式:將內(nèi)存分為內(nèi)核空間(內(nèi)核對應(yīng)進(jìn)程所在內(nèi)存空間)和用戶空間,進(jìn)行內(nèi)存隔離。我們構(gòu)建的程序?qū)⑦\(yùn)行在用戶空間,用戶空間無法操作內(nèi)核空間,也就意味著用戶空間的程序不能直接訪問由內(nèi)核管理的I/O,比如:硬盤、網(wǎng)卡等。

但操作系統(tǒng)向外提供API,其由各種類型的系統(tǒng)調(diào)用(System Call)組成,以提供安全的訪問控制。所以應(yīng)用程序要想訪問內(nèi)核管理的I/O,必須通過調(diào)用內(nèi)核提供的系統(tǒng)調(diào)用(system call)進(jìn)行間接訪問。

所以I/O之于應(yīng)用程序來說,強(qiáng)調(diào)的通過向內(nèi)核發(fā)起系統(tǒng)調(diào)用完成對I/O的間接訪問。換句話說應(yīng)用程序發(fā)起的一次IO操作實(shí)際包含兩個(gè)階段:

IO調(diào)用階段:應(yīng)用程序進(jìn)程向內(nèi)核發(fā)起系統(tǒng)調(diào)用

IO執(zhí)行階段:內(nèi)核執(zhí)行IO操作并返回

2.1. 準(zhǔn)備數(shù)據(jù)階段:內(nèi)核等待I/O設(shè)備準(zhǔn)備好數(shù)據(jù)
2.2. 拷貝數(shù)據(jù)階段:將數(shù)據(jù)從內(nèi)核緩沖區(qū)拷貝到用戶空間緩沖區(qū)

怎么理解準(zhǔn)備數(shù)據(jù)階段呢?對于寫請求:等待系統(tǒng)調(diào)用的完整請求數(shù)據(jù),并寫入內(nèi)核緩沖區(qū);對于讀請求:等待系統(tǒng)調(diào)用的完整請求數(shù)據(jù);(若請求數(shù)據(jù)不存在于內(nèi)核緩沖區(qū))則將外圍設(shè)備的數(shù)據(jù)讀入到內(nèi)核緩沖區(qū)。

深入了解IO模型的內(nèi)部玄機(jī)

而應(yīng)用程序進(jìn)程在發(fā)起IO調(diào)用至內(nèi)核執(zhí)行IO返回之前,應(yīng)用程序進(jìn)程/線程所處狀態(tài),就是我們下面要討論的第二個(gè)話題阻塞IO與非阻塞IO。

3. IO 模型之阻塞I/O(BIO)

應(yīng)用程序中進(jìn)程在發(fā)起IO調(diào)用后至內(nèi)核執(zhí)行IO操作返回結(jié)果之前,若發(fā)起系統(tǒng)調(diào)用的線程一直處于等待狀態(tài),則此次IO操作為阻塞IO。阻塞IO簡稱BIO,Blocking IO。其處理流程如下圖所示:

深入了解IO模型的內(nèi)部玄機(jī)

從上圖可知當(dāng)用戶進(jìn)程發(fā)起IO系統(tǒng)調(diào)用后,內(nèi)核從準(zhǔn)備數(shù)據(jù)到拷貝數(shù)據(jù)到用戶空間的兩個(gè)階段期間用戶調(diào)用線程選擇阻塞等待數(shù)據(jù)返回。

因此BIO帶來了一個(gè)問題:如果內(nèi)核數(shù)據(jù)需要耗時(shí)很久才能準(zhǔn)備好,那么用戶進(jìn)程將被阻塞,浪費(fèi)性能。為了提升應(yīng)用的性能,雖然可以通過多線程來提升性能,但線程的創(chuàng)建依然會借助系統(tǒng)調(diào)用,同時(shí)多線程會導(dǎo)致頻繁的線程上下文的切換,同樣會影響性能。所以要想解決BIO帶來的問題,我們就得看到問題的本質(zhì),那就是阻塞二字。

4. IO 模型之非阻塞I/O(NIO)

那解決方案自然也容易想到,將阻塞變?yōu)榉亲枞?,那就是用戶進(jìn)程在發(fā)起系統(tǒng)調(diào)用時(shí)指定為非阻塞,內(nèi)核接收到請求后,就會立即返回,然后用戶進(jìn)程通過輪詢的方式來拉取處理結(jié)果。也就是如下圖所示:

深入了解IO模型的內(nèi)部玄機(jī)

應(yīng)用程序中進(jìn)程在發(fā)起IO調(diào)用后至內(nèi)核執(zhí)行IO操作返回結(jié)果之前,若發(fā)起系統(tǒng)調(diào)用的線程不會等待而是立即返回,則此次IO操作為非阻塞IO模型。非阻塞IO簡稱NIO,Non-Blocking IO。

然而,非阻塞IO雖然相對于阻塞IO大幅提升了性能,但依舊不是完美的解決方案,其依然存在性能問題,也就是頻繁的輪詢導(dǎo)致頻繁的系統(tǒng)調(diào)用,會耗費(fèi)大量的CPU資源。比如當(dāng)并發(fā)很高時(shí),假設(shè)有1000個(gè)并發(fā),那么單位時(shí)間循環(huán)內(nèi)將會有1000次系統(tǒng)調(diào)用去輪詢執(zhí)行結(jié)果,而實(shí)際上可能只有2個(gè)請求結(jié)果執(zhí)行完畢,這就會有998次無效的系統(tǒng)調(diào)用,造成嚴(yán)重的性能浪費(fèi)。有問題就要解決,那NIO問題的本質(zhì)就是頻繁輪詢導(dǎo)致的無效系統(tǒng)調(diào)用。

5. IO模型之IO多路復(fù)用

解決NIO的思路就是降解無效的系統(tǒng)調(diào)用,如何降解呢?我們一起來看看以下幾種IO多路復(fù)用的解決思路。

5.1. IO多路復(fù)用之select/poll

Select是內(nèi)核提供的系統(tǒng)調(diào)用,它支持一次查詢多個(gè)系統(tǒng)調(diào)用的可用狀態(tài),當(dāng)任意一個(gè)結(jié)果狀態(tài)可用時(shí)就會返回,用戶進(jìn)程再發(fā)起一次系統(tǒng)調(diào)用進(jìn)行數(shù)據(jù)讀取。換句話說,就是NIO中N次的系統(tǒng)調(diào)用,借助Select,只需要發(fā)起一次系統(tǒng)調(diào)用就夠了。其IO流程如下所示:

深入了解IO模型的內(nèi)部玄機(jī)

但是,select有一個(gè)限制,就是存在連接數(shù)限制,針對于此,又提出了poll。其與select相比,主要是解決了連接限制。

select/epoll 雖然解決了NIO重復(fù)無效系統(tǒng)調(diào)用用的問題,但同時(shí)又引入了新的問題。問題是:

用戶空間和內(nèi)核空間之間,大量的數(shù)據(jù)拷貝

內(nèi)核循環(huán)遍歷IO狀態(tài),浪費(fèi)CPU時(shí)間

換句話說,select/poll雖然減少了用戶進(jìn)程的發(fā)起的系統(tǒng)調(diào)用,但內(nèi)核的工作量只增不減。在高并發(fā)的情況下,內(nèi)核的性能問題依舊。所以select/poll的問題本質(zhì)是:內(nèi)核存在無效的循環(huán)遍歷。

5.2. IO多路復(fù)用之epoll

針對select/pool引入的問題,我們把解決問題的思路轉(zhuǎn)回到內(nèi)核上,如何減少內(nèi)核重復(fù)無效的循環(huán)遍歷呢?變主動為被動,基于事件驅(qū)動來實(shí)現(xiàn)。其流程圖如下所示:

深入了解IO模型的內(nèi)部玄機(jī)

epoll相較于select/poll,多了兩次系統(tǒng)調(diào)用,其中epoll_create建立與內(nèi)核的連接,epoll_ctl注冊事件,epoll_wait阻塞用戶進(jìn)程,等待IO事件。

深入了解IO模型的內(nèi)部玄機(jī)

epoll,已經(jīng)大大優(yōu)化了IO的執(zhí)行效率,但在IO執(zhí)行的第一階段:數(shù)據(jù)準(zhǔn)備階段都還是被阻塞的。所以這是一個(gè)可以繼續(xù)優(yōu)化的點(diǎn)。

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

信號驅(qū)動IO與BIO和NIO最大的區(qū)別就在于,在IO執(zhí)行的數(shù)據(jù)準(zhǔn)備階段,不會阻塞用戶進(jìn)程。如下圖所示:當(dāng)用戶進(jìn)程需要等待數(shù)據(jù)的時(shí)候,會向內(nèi)核發(fā)送一個(gè)信號,告訴內(nèi)核我要什么數(shù)據(jù),然后用戶進(jìn)程就繼續(xù)做別的事情去了,而當(dāng)內(nèi)核中的數(shù)據(jù)準(zhǔn)備好之后,內(nèi)核立馬發(fā)給用戶進(jìn)程一個(gè)信號,說”數(shù)據(jù)準(zhǔn)備好了,快來查收“,用戶進(jìn)程收到信號之后,立馬調(diào)用recvfrom,去查收數(shù)據(jù)。

深入了解IO模型的內(nèi)部玄機(jī)

乍一看,信號驅(qū)動式I/O模型有種異步操作的感覺,但是在IO執(zhí)行的第二階段,也就是將數(shù)據(jù)從內(nèi)核空間復(fù)制到用戶空間這個(gè)階段,用戶進(jìn)程還是被阻塞的。

綜上,你會發(fā)現(xiàn),不管是BIO還是NIO還是SIGIO,它們最終都會被阻塞在IO執(zhí)行的第二階段。那如果能將IO執(zhí)行的第二階段變成非阻塞,那就完美了。

7. IO 模型之異步IO(AIO)

異步IO真正實(shí)現(xiàn)了IO全流程的非阻塞。用戶進(jìn)程發(fā)出系統(tǒng)調(diào)用后立即返回,內(nèi)核等待數(shù)據(jù)準(zhǔn)備完成,然后將數(shù)據(jù)拷貝到用戶進(jìn)程緩沖區(qū),然后發(fā)送信號告訴用戶進(jìn)程IO操作執(zhí)行完畢(與SIGIO相比,一個(gè)是發(fā)送信號告訴用戶進(jìn)程數(shù)據(jù)準(zhǔn)備完畢,一個(gè)是IO執(zhí)行完畢)。其流程如下:

深入了解IO模型的內(nèi)部玄機(jī)

所以,之所以稱為異步IO,取決于IO執(zhí)行的第二階段是否阻塞。因此前面講的BIO,NIO和SIGIO均為同步IO。

深入了解IO模型的內(nèi)部玄機(jī)

8. 總結(jié)

梳理完這些IO模型后,之前一直處于懵懂狀態(tài)的阻塞,非阻塞,同步異步IO,終于算是有個(gè)概念了。同時(shí)也糾正了自己一直以來的誤解,所以一路走來,愈發(fā)覺得返璞歸真的重要性,只有如此,才能在快速更迭的技術(shù)演進(jìn)中,以不變應(yīng)萬變。

本文綜合多方資料寫就,難免紕漏,但只有寫下來,才能得以指正。所以,煩請各位看官不吝賜教。

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

    關(guān)注

    19

    文章

    7658

    瀏覽量

    90741
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    508

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    Evo 2 AI模型可通過NVIDIA BioNeMo平臺使用

    Evo 2 是一個(gè)強(qiáng)大的新型 AI 模型,它基于亞馬遜云科技(AWS)上的 NVIDIA DGX Cloud 構(gòu)建而成,能夠幫助用戶深入了解不同物種的 DNA、RNA 和蛋白質(zhì)。
    的頭像 發(fā)表于 02-28 09:57 ?729次閱讀

    深入了解U8g2與LVGL圖形庫

    在單片機(jī)開發(fā)領(lǐng)域,圖形顯示功能變得越來越重要。無論是工業(yè)控制界面、智能家居設(shè)備,還是手持儀器儀表,都需要一個(gè)高效且易用的圖形庫來實(shí)現(xiàn)豐富的可視化效果。U8g2 和 LVGL 就是其中兩款備受關(guān)注的圖形庫,它們各有特點(diǎn),適用于不同的應(yīng)用場景。今天,我們就來深入了解這兩個(gè)圖形庫。
    的頭像 發(fā)表于 02-13 11:01 ?2068次閱讀

    深入了解 PCB 制造技術(shù):銑削

    了 PCB 銑削的復(fù)雜性、銑削工藝、其優(yōu)勢、挑戰(zhàn)和應(yīng)用。 了解 PCB 銑削 PCB 銑削涉及從覆銅板上機(jī)械去除材料,以創(chuàng)建電氣隔離并形成電路圖案。與使用化學(xué)溶液溶解不需要的銅的傳統(tǒng)蝕刻方法不同,銑削使用精確控制的銑削鉆頭來物理雕刻出所需的痕跡。該過程通
    的頭像 發(fā)表于 01-26 21:25 ?627次閱讀
    <b class='flag-5'>深入了解</b> PCB 制造技術(shù):銑削

    深入了解渦街流量計(jì) 原理及內(nèi)部構(gòu)造

    渦街流量計(jì)是一種常用的流量測量儀表,LUB系列渦街流量計(jì)的內(nèi)部構(gòu)造與原理密切相關(guān),共同構(gòu)成了其高精度、寬量程比和穩(wěn)定運(yùn)行的基礎(chǔ)。本文將深入介紹渦街流量計(jì)的原理及內(nèi)部構(gòu)造,以便更好地了解
    的頭像 發(fā)表于 01-06 15:17 ?925次閱讀

    如何為不同的電機(jī)選擇合適的驅(qū)動芯片?納芯微帶你深入了解!

    在現(xiàn)代生活中,電機(jī)廣泛使用在家電產(chǎn)品、汽車電子、工業(yè)控制等眾多應(yīng)用領(lǐng)域,每一個(gè)電機(jī)的運(yùn)轉(zhuǎn)都離不開合適的驅(qū)動芯片。納芯微提供豐富的電機(jī)驅(qū)動產(chǎn)品選擇,本期技術(shù)分享將重點(diǎn)介紹常見電機(jī)種類與感性負(fù)載應(yīng)用,幫助大家更深入了解如何選擇合適的電機(jī)驅(qū)動芯片。
    的頭像 發(fā)表于 12-23 09:58 ?1018次閱讀
    如何為不同的電機(jī)選擇合適的驅(qū)動芯片?納芯微帶你<b class='flag-5'>深入了解</b>!

    【「大模型啟示錄」閱讀體驗(yàn)】對大模型深入的認(rèn)知

    。興奮的是,大模型技術(shù)的發(fā)展為我們帶來了無限可能;不安的是,我意識到自己對這一領(lǐng)域的了解還遠(yuǎn)遠(yuǎn)不夠。我開始思考,作為一名學(xué)生,我如何能夠更好地利用這些技術(shù),以及在未來的職業(yè)生涯中,我如何能夠參與到這一變革中去。 學(xué)習(xí)之路仍然很漫長啊……
    發(fā)表于 12-20 15:46

    電流倒灌揭秘:IO口損壞與系統(tǒng)故障的真相

    導(dǎo)讀本期文章將繼續(xù)深入了解電流倒灌,分析嵌入式系統(tǒng)中IO口損壞和系統(tǒng)穩(wěn)定性問題的根本原因。在上期的工程筆記中,我們了解了電流倒灌并探討了電流倒灌可能導(dǎo)致的一系列問題,包括IO口損壞、系
    的頭像 發(fā)表于 12-11 11:38 ?1091次閱讀
    電流倒灌揭秘:<b class='flag-5'>IO</b>口損壞與系統(tǒng)故障的真相

    一文解讀Linux 5種IO模型

    Linux里有五種IO模型:阻塞IO、非阻塞IO、多路復(fù)用IO、信號驅(qū)動式IO和異步
    的頭像 發(fā)表于 11-09 11:12 ?845次閱讀
    一文解讀Linux 5種<b class='flag-5'>IO</b><b class='flag-5'>模型</b>

    深入了解光伏逆變器測試系統(tǒng)

    的交流電(AC)。隨著太陽能發(fā)電的廣泛應(yīng)用,確保光伏逆變器的可靠性和效率變得至關(guān)重要,這也使得光伏逆變器測試系統(tǒng)的作用愈發(fā)凸顯。 一、光伏逆變器的工作原理 要深入理解光伏逆變器測試系統(tǒng)的必要性,首先需要了解逆變器的
    的頭像 發(fā)表于 10-24 14:59 ?701次閱讀
    <b class='flag-5'>深入了解</b>光伏逆變器測試系統(tǒng)

    深入了解PCI轉(zhuǎn)XMC載板轉(zhuǎn)接卡

    電子發(fā)燒友網(wǎng)站提供《深入了解PCI轉(zhuǎn)XMC載板轉(zhuǎn)接卡.docx》資料免費(fèi)下載
    發(fā)表于 09-06 14:35 ?0次下載

    想要了解下大模型知識

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

    深入了解表面貼裝型晶體濾波器:DSF753S 2POLE、DSF753S 3POLE 和 DSF753S 4POLE

    深入了解表面貼裝型晶體濾波器:DSF753S 2POLE、DSF753S 3POLE 和 DSF753S 4POLE
    的頭像 發(fā)表于 07-31 11:05 ?859次閱讀
    <b class='flag-5'>深入了解</b>表面貼裝型晶體濾波器:DSF753S 2POLE、DSF753S 3POLE 和 DSF753S 4POLE

    深入了解 MEMS 振蕩器 溫度補(bǔ)償 MEMS 振蕩器 TC-MO

    深入了解 MEMS 振蕩器/溫度補(bǔ)償 MEMS 振蕩器(TC-MO)-μPower MO1534/MO1569/MO1576/MO8021
    的頭像 發(fā)表于 07-30 16:38 ?1060次閱讀
    <b class='flag-5'>深入了解</b> MEMS 振蕩器 溫度補(bǔ)償 MEMS 振蕩器 TC-MO

    深入了解表面貼裝晶體諧振器DSX1210A

    深入了解表面貼裝晶體諧振器DSX1210A
    的頭像 發(fā)表于 07-25 14:27 ?801次閱讀
    <b class='flag-5'>深入了解</b>表面貼裝晶體諧振器DSX1210A

    深入了解恒溫晶體振蕩器DC5032AS

    深入了解恒溫晶體振蕩器DC5032AS
    的頭像 發(fā)表于 07-25 10:37 ?611次閱讀
    <b class='flag-5'>深入了解</b>恒溫晶體振蕩器DC5032AS