91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

1. 引言

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

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

2. I/O 的定義

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

2.1. 計算機視角

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

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

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

I/O設備

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

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

2.2. 程序視角

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

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

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

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

IO調用階段:應用程序進程向內核發(fā)起系統(tǒng)調用

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5. IO模型之IO多路復用

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

5.1. IO多路復用之select/poll

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

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

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

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

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

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

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

5.2. IO多路復用之epoll

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

8. 總結

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

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

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

    關注

    19

    文章

    7817

    瀏覽量

    93295
  • 線程
    +關注

    關注

    0

    文章

    510

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    深入了解TPS2114A與TPS2115A:雙電源切換的理想選擇

    深入了解TPS2114A與TPS2115A:雙電源切換的理想選擇 在電子設備的設計過程中,電源管理一直是至關重要的一環(huán),尤其是在需要多個電源輸入的情況下,如何實現(xiàn)電源的無縫切換和有效保護,是工程師們
    的頭像 發(fā)表于 02-28 17:20 ?1067次閱讀

    深入了解LM25066I/A:全方位的系統(tǒng)電源管理與保護方案

    深入了解LM25066I/A:全方位的系統(tǒng)電源管理與保護方案 在當前復雜的電子系統(tǒng)中,高效且可靠的電源管理與保護至關重要。Texas Instruments的LM25066I和LM25066IA作為
    的頭像 發(fā)表于 02-28 11:20 ?174次閱讀

    深入了解LM70:高性能數(shù)字溫度傳感器的應用與特性

    深入了解LM70:高性能數(shù)字溫度傳感器的應用與特性 在電子設備的設計中,溫度監(jiān)測是一個至關重要的環(huán)節(jié)。今天,我們就來詳細探討一款來自德州儀器(TI)的溫度傳感器——LM70。 文件下載
    的頭像 發(fā)表于 02-26 11:45 ?266次閱讀

    深入了解MAX14748 USB Type-C充電器:特性、應用與設計要點

    深入了解MAX14748 USB Type-C充電器:特性、應用與設計要點 引言 在當今的電子設備領域,USB Type-C接口憑借其高速數(shù)據(jù)傳輸和強大的電力傳輸能力,正逐漸成為主流。而與之相匹配
    的頭像 發(fā)表于 02-24 11:30 ?326次閱讀

    深入了解Renesas E1/E20 Emulator:從規(guī)范到應用

    深入了解Renesas E1/E20 Emulator:從規(guī)范到應用 引言 在微控制器(MCU)的開發(fā)過程中,調試工具起著至關重要的作用。Renesas的E1/E20 Emulator就是一款強大
    的頭像 發(fā)表于 02-10 15:25 ?204次閱讀

    深入了解 LM4881 雙聲道 200mW 耳機放大器:特性、參數(shù)與應用設計

    深入了解 LM4881 雙聲道 200mW 耳機放大器:特性、參數(shù)與應用設計 在電子設備日新月異的今天,音頻放大器作為眾多設備中不可或缺的一部分,其性能和特點對整個系統(tǒng)的音效體驗起著至關重要的作用
    的頭像 發(fā)表于 02-04 16:50 ?683次閱讀

    深入了解SN74LVC1G66單雙邊模擬開關

    深入了解SN74LVC1G66單雙邊模擬開關 在電子設計領域,模擬開關是一種常見且關鍵的元件,它在信號路由、切換等方面發(fā)揮著重要作用。今天我們就來詳細探討一下德州儀器(TI)的SN74LVC1G66
    的頭像 發(fā)表于 01-16 10:35 ?482次閱讀

    深入了解LM5111:高性能雙路柵極驅動器的技術剖析

    深入了解LM5111:高性能雙路柵極驅動器的技術剖析 在電子工程師的日常工作中,選擇合適的柵極驅動器至關重要。它直接影響著電路的性能和穩(wěn)定性。今天,我們就來深入探討一款性能卓越的雙路柵極驅動器
    的頭像 發(fā)表于 01-11 18:00 ?1135次閱讀

    深入了解LMG1020:高性能低側GaN和MOSFET驅動器

    深入了解LMG1020:高性能低側GaN和MOSFET驅動器 在電子設計領域,對于高速應用的需求不斷增長,高性能的驅動器至關重要。今天,我們來詳細探討一下德州儀器(TI)的LMG1020驅動器,看看
    的頭像 發(fā)表于 01-08 16:20 ?407次閱讀

    深入了解WE - BPF多層芯片帶通濾波器:從規(guī)格到應用注意事項

    深入了解WE-BPF多層芯片帶通濾波器:從規(guī)格到應用注意事項 在電子設備的設計過程中,濾波器是不可或缺的重要組件,它能夠對信號進行篩選和處理,保證設備正常運行。今天我們就來詳細探討Würth
    的頭像 發(fā)表于 01-07 18:10 ?772次閱讀

    深入了解 S32K312EVB-Q172 開發(fā)板:硬件特性與使用指南

    深入了解 S32K312EVB-Q172 開發(fā)板:硬件特性與使用指南 在嵌入式開發(fā)領域,一款優(yōu)秀的開發(fā)板能夠極大地提升開發(fā)效率和項目的成功率。NXP 的 S32K312EVB-Q172 開發(fā)板就是
    的頭像 發(fā)表于 12-25 09:30 ?300次閱讀

    深入了解SRF7038A系列共模扼流圈

    深入了解SRF7038A系列共模扼流圈 在電子設計的領域中,共模扼流圈是解決電磁干擾(EMI)問題的關鍵元件之一。今天,我們就來詳細探討一下BOURNS的SRF7038A系列共模扼流圈,看看它有
    的頭像 發(fā)表于 12-22 14:10 ?418次閱讀

    深入了解X-ray自動設備的核心優(yōu)勢與應用領域

    。面對復雜多變的工業(yè)環(huán)境和嚴格的品質標準,企業(yè)如何借助自動化X射線檢測設備優(yōu)化生產(chǎn)流程、提升檢測準確度?本文將圍繞X-ray自動設備的核心優(yōu)勢與應用領域展開詳盡解讀,幫助您深入了解該技術帶來的變革與價值。無論您是工廠質量管
    的頭像 發(fā)表于 11-04 14:34 ?297次閱讀

    深入了解X-ray無損探傷技術的優(yōu)勢與應用領域

    的優(yōu)勢和實際應用領域了解不夠。本文將深入探討X-ray無損探傷技術的獨特優(yōu)勢及其廣泛的應用場景,幫助企業(yè)做出更明智的決策,提升自我品牌的信任度。 什么是X-ray無損探傷技術? X-ray無損探傷技術,顧名思義,是利用X射線對材料內部
    的頭像 發(fā)表于 09-16 14:59 ?851次閱讀

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

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