色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

深入了解IO模型的內部玄機

汽車玩家 ? 來源:今日頭條 ? 作者:咔咔侃技術 ? 2020-05-03 09:38 ? 次閱讀

1. 引言

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

簡而言之,對于I/O的認知,不能僅僅停留在字面上認識,了解內部玄機,才能深刻理解I/O,才能看清I/O相關問題的本質。

2. I/O 的定義

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

2.1. 計算機視角

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

用戶通過操作系統才能完成對計算機的操作。計算機啟動時,第一個啟動的程序是操作系統的內核,它將負責計算機的資源管理和進程的調度。換句話說:操作系統負責從輸入設備讀取數據并將數據寫入到輸出設備。

所以I/O之于計算機,有兩層意思:

I/O設備

對I/O設備的數據讀寫

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

2.2. 程序視角

應用程序作為一個文件保存在磁盤中,只有加載到內存到成為一個進程才能運行。應用程序運行在計算機內存中,必然會涉及到數據交換,比如讀寫磁盤文件,訪問數據庫,調用遠程API等等。但我們編寫的程序并不能像操作系統內核一樣直接進行I/O操作。

因為為了確保操作系統的安全穩定運行,操作系統啟動后,將會開啟保護模式:將內存分為內核空間(內核對應進程所在內存空間)和用戶空間,進行內存隔離。我們構建的程序將運行在用戶空間,用戶空間無法操作內核空間,也就意味著用戶空間的程序不能直接訪問由內核管理的I/O,比如:硬盤、網卡等。

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

所以I/O之于應用程序來說,強調的通過向內核發起系統調用完成對I/O的間接訪問。換句話說應用程序發起的一次IO操作實際包含兩個階段:

IO調用階段:應用程序進程向內核發起系統調用

IO執行階段:內核執行IO操作并返回

2.1. 準備數據階段:內核等待I/O設備準備好數據
2.2. 拷貝數據階段:將數據從內核緩沖區拷貝到用戶空間緩沖區

怎么理解準備數據階段呢?對于寫請求:等待系統調用的完整請求數據,并寫入內核緩沖區;對于讀請求:等待系統調用的完整請求數據;(若請求數據不存在于內核緩沖區)則將外圍設備的數據讀入到內核緩沖區。

深入了解IO模型的內部玄機

而應用程序進程在發起IO調用至內核執行IO返回之前,應用程序進程/線程所處狀態,就是我們下面要討論的第二個話題阻塞IO與非阻塞IO。

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

應用程序中進程在發起IO調用后至內核執行IO操作返回結果之前,若發起系統調用的線程一直處于等待狀態,則此次IO操作為阻塞IO。阻塞IO簡稱BIO,Blocking IO。其處理流程如下圖所示:

深入了解IO模型的內部玄機

從上圖可知當用戶進程發起IO系統調用后,內核從準備數據到拷貝數據到用戶空間的兩個階段期間用戶調用線程選擇阻塞等待數據返回。

因此BIO帶來了一個問題:如果內核數據需要耗時很久才能準備好,那么用戶進程將被阻塞,浪費性能。為了提升應用的性能,雖然可以通過多線程來提升性能,但線程的創建依然會借助系統調用,同時多線程會導致頻繁的線程上下文的切換,同樣會影響性能。所以要想解決BIO帶來的問題,我們就得看到問題的本質,那就是阻塞二字。

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

那解決方案自然也容易想到,將阻塞變為非阻塞,那就是用戶進程在發起系統調用時指定為非阻塞,內核接收到請求后,就會立即返回,然后用戶進程通過輪詢的方式來拉取處理結果。也就是如下圖所示:

深入了解IO模型的內部玄機

應用程序中進程在發起IO調用后至內核執行IO操作返回結果之前,若發起系統調用的線程不會等待而是立即返回,則此次IO操作為非阻塞IO模型。非阻塞IO簡稱NIO,Non-Blocking IO。

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

5. IO模型之IO多路復用

解決NIO的思路就是降解無效的系統調用,如何降解呢?我們一起來看看以下幾種IO多路復用的解決思路。

5.1. IO多路復用之select/poll

Select是內核提供的系統調用,它支持一次查詢多個系統調用的可用狀態,當任意一個結果狀態可用時就會返回,用戶進程再發起一次系統調用進行數據讀取。換句話說,就是NIO中N次的系統調用,借助Select,只需要發起一次系統調用就夠了。其IO流程如下所示:

深入了解IO模型的內部玄機

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

select/epoll 雖然解決了NIO重復無效系統調用用的問題,但同時又引入了新的問題。問題是:

用戶空間和內核空間之間,大量的數據拷貝

內核循環遍歷IO狀態,浪費CPU時間

換句話說,select/poll雖然減少了用戶進程的發起的系統調用,但內核的工作量只增不減。在高并發的情況下,內核的性能問題依舊。所以select/poll的問題本質是:內核存在無效的循環遍歷。

5.2. IO多路復用之epoll

針對select/pool引入的問題,我們把解決問題的思路轉回到內核上,如何減少內核重復無效的循環遍歷呢?變主動為被動,基于事件驅動來實現。其流程圖如下所示:

深入了解IO模型的內部玄機

epoll相較于select/poll,多了兩次系統調用,其中epoll_create建立與內核的連接,epoll_ctl注冊事件,epoll_wait阻塞用戶進程,等待IO事件。

深入了解IO模型的內部玄機

epoll,已經大大優化了IO的執行效率,但在IO執行的第一階段:數據準備階段都還是被阻塞的。所以這是一個可以繼續優化的點。

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

信號驅動IO與BIO和NIO最大的區別就在于,在IO執行的數據準備階段,不會阻塞用戶進程。如下圖所示:當用戶進程需要等待數據的時候,會向內核發送一個信號,告訴內核我要什么數據,然后用戶進程就繼續做別的事情去了,而當內核中的數據準備好之后,內核立馬發給用戶進程一個信號,說”數據準備好了,快來查收“,用戶進程收到信號之后,立馬調用recvfrom,去查收數據。

深入了解IO模型的內部玄機

乍一看,信號驅動式I/O模型有種異步操作的感覺,但是在IO執行的第二階段,也就是將數據從內核空間復制到用戶空間這個階段,用戶進程還是被阻塞的。

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

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

異步IO真正實現了IO全流程的非阻塞。用戶進程發出系統調用后立即返回,內核等待數據準備完成,然后將數據拷貝到用戶進程緩沖區,然后發送信號告訴用戶進程IO操作執行完畢(與SIGIO相比,一個是發送信號告訴用戶進程數據準備完畢,一個是IO執行完畢)。其流程如下:

深入了解IO模型的內部玄機

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

深入了解IO模型的內部玄機

8. 總結

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

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

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

    關注

    19

    文章

    7530

    瀏覽量

    88417
  • 線程
    +關注

    關注

    0

    文章

    505

    瀏覽量

    19720
收藏 人收藏

    評論

    相關推薦

    深入了解渦街流量計 原理及內部構造

    渦街流量計是一種常用的流量測量儀表,LUB系列渦街流量計的內部構造與原理密切相關,共同構成了其高精度、寬量程比和穩定運行的基礎。本文將深入介紹渦街流量計的原理及內部構造,以便更好地了解
    的頭像 發表于 01-06 15:17 ?103次閱讀

    如何為不同的電機選擇合適的驅動芯片?納芯微帶你深入了解

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

    電流倒灌揭秘:IO口損壞與系統故障的真相

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

    一文解讀Linux 5種IO模型

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

    深入了解光伏逆變器測試系統

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

    深入了解PCI轉XMC載板轉接卡

    電子發燒友網站提供《深入了解PCI轉XMC載板轉接卡.docx》資料免費下載
    發表于 09-06 14:35 ?0次下載

    深入了解 MEMS 振蕩器 溫度補償 MEMS 振蕩器 TC-MO

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

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

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

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

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

    小熊派官網正式上線 可深入了解小熊派的各款開發套件

    我們為每一款開發板打造一個開源社區,讓每一位開發者都能在這里找到歸屬感和靈感。通過官網對硬件、軟件、案例和教程的開源,大家可以深入了解小熊派的各款開發套件。
    的頭像 發表于 06-13 08:42 ?978次閱讀
    小熊派官網正式上線 可<b class='flag-5'>深入了解</b>小熊派的各款開發套件

    深入了解IEEE協會:設備MAC地址申請指南

    在數字化浪潮中,設備之間的通信變得日益頻繁和重要。而在這個通信網絡中,每一臺設備都需要一個獨特的身份標識來幫助大家有效識別設備信息,那就是MAC地址。本篇內容,英利檢測將帶大家深入了解IEEE協會
    的頭像 發表于 05-09 17:20 ?596次閱讀
    <b class='flag-5'>深入了解</b>IEEE協會:設備MAC地址申請指南

    拆解FPGA芯片,帶你深入了解其原理

    拆解FPGA芯片,帶你深入了解其原理 現場可編程門陣列(FPGA)可以實現任意數字邏輯,從微處理器到視頻生成器或加密礦機,一應俱全。FPGA由許多邏輯模塊組成,每個邏輯模塊通常由觸發器和邏輯功能
    發表于 04-17 11:07

    深入了解影響ZR執行器性能的關鍵因素

    深入了解影響ZR執行器性能的關鍵因素-速程精密 在工業自動化領域,ZR執行器作為關鍵的終端設備,其性能的穩定性對于整個自動化系統的運行至關重要。了解影響ZR執行器性能的因素有助于更好地維護和優化其
    的頭像 發表于 03-20 15:04 ?562次閱讀
    <b class='flag-5'>深入了解</b>影響ZR執行器性能的關鍵因素

    Stage 模型深入解讀

    設備的遷移和協同機制。本文為大家詳細介紹 Stage 模型。 一、Stage 模型概念 應用開發模型是運行在不同 OS 上的抽象結構。OS 通過這種抽象結構,把應用開發的基礎設施封裝在 OS
    的頭像 發表于 02-18 09:28 ?1227次閱讀
    Stage <b class='flag-5'>模型</b><b class='flag-5'>深入</b>解讀

    S參數:深入了解與實際應用

    以一個無源二端口網絡為例,深入介紹S參數。信號在傳輸過程中會產生入射波和反射波,既有進入端口的信號也有從端口中出來的信號。
    的頭像 發表于 01-23 11:20 ?1020次閱讀
    S參數:<b class='flag-5'>深入了解</b>與實際應用
    主站蜘蛛池模板: 四川老师边上网课边被啪视频| 国产精品av免费观看| 在线 中文字幕| 把英语老师强奷到舒服动态图| 国产免费人成在线视频有码| 九九夜夜妹子| 三级网站视频在线观看| 伊人最新网址| 国产精品久久久久婷婷五月色婷婷| 啦啦啦 中国 日本 高清 在线| 色姊姊真舒服| 999视频精品全部免费观看| 国产精品亚洲精品久久品| 男人网站在线观看| 一边亲着一面膜下奶韩剧免费| 国产成人精品123区免费视频| 免费在线看视频| 伊人久久大香线蕉电影院| 国产成人久久精品AV| 受被三个攻各种道具PLAY| 国产精品久久久久久久久LI无码| 午理论理影片被窝| 出租屋自拍贵在真实15P| 美女胸网站| 印度最猛性ⅹxxxxx| 久久综合狠狠综合狠狠| 999zyz色资源站在线观看| 热思思| av影音先锋影院男人站| 久久青草在线视频精品| 亚洲人成在线观看一区二区| 国产美女一区二区| 亚洲精品AV中文字幕在线| 国产精品一库二库三库| 亚洲精品91| 浪潮色诱AV久久久久久久| 伊人久久大线蕉香港三级| 男女牲交大战免费播放| 被黑人做的白浆直流| 老女人与小伙子露脸对白| 99久久免费国内精品|