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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

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

3天內不再提示

簡單說一下阻塞IO、非阻塞IO、IO復用的區(qū)別?

Linux愛好者 ? 來源:Linux愛好者 ? 2024-03-04 15:14 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

在《Unix網絡編程》一書中提到了五種IO模型,分別是:阻塞IO、非阻塞IO、IO復用、信號驅動IO以及異步IO。本篇文章主要介紹IO的基本概念以及阻塞IO、非阻塞IO、IO復用三種模型,供大家參考學習。

一、什么是IO

計算機視角理解IO:

對于計算機而言,任何涉及到計算機核心(CPU和內存)與其他設備間的數據轉移的過程就是IO。IO對于計算機而言有兩層意思:

IO 設備:比如我們最常見的打印機、鼠標、鍵盤。

對IO設備的數據讀寫。

程序視角理解IO:

現代操作系統將空間劃分為用戶空間和內核空間。

用戶空間:非內核應用程序則運行在用戶空間。用戶空間中的代碼運行在較低的特權級別上,不能直接訪問內核空間和硬件設備。

內核空間:操作系統的核心,是操作系統工作的基礎,它負責管理系統的進程、內存、設備驅動程序、文件和網絡系統,決定著系統的性能和穩(wěn)定性。

569dc566-d9de-11ee-a297-92fbcf53809c.png

操作系統為了能夠正常平穩(wěn)地運行下去,它是不會允許應用程序隨意訪問計算機硬件部分,如內存、硬盤、網卡,應用程序必須通過操作系統提供的API來訪問,以達到安全的訪問控制。

總結:IO對于應用程序而言,強調的是通過向內核發(fā)起系統調用完成對I/O的間接訪問。

應用程序發(fā)起一次IO訪問分為兩個階段:

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

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

數據準備階段:內核等待IO設備準備好數據

數據拷貝階段:將數據從內核緩沖區(qū)拷貝到用戶空間緩沖區(qū)

56a516cc-d9de-11ee-a297-92fbcf53809c.png

二、阻塞IO模型

阻塞I/O模型是最常見的IO模型,其流程圖如下所示。

56b1b71a-d9de-11ee-a297-92fbcf53809c.png

應用程序發(fā)起一個系統調用(recvform),這個時候應用程序會一直阻塞下去,直到內核把數據準備好,并將其從內核復制到用戶空間,復制完成后返回成功提示,這個時候應用程序才會繼續(xù)處理數據。

優(yōu)點:模型簡單,實現難度低,適用于并發(fā)量較小的應用開發(fā)。

缺點:IO調用階段和IO執(zhí)行階段都會阻塞。

典型的阻塞I/0模型的例子為data=socket.read(),如果內核數據沒有準備就緒,Socket線程就會一直阻塞在read()中等待內核數據就緒。

生活場景:某天,你跟你女朋友去奶茶店買奶茶,點完奶茶后后,由于你們不知道奶茶什么時候才能做好,所以你們就只能一直等著,其他什么事情也不能干。

三、非阻塞 IO模型

在非阻塞IO模型中,應用進程需要不斷詢問內核數據是否就緒,在內核數據還未就緒時,應用進程還可以做其他事情。

56b53cfa-d9de-11ee-a297-92fbcf53809c.png

從上圖可以看出, 非阻塞IO模型需要應用進程不斷地主動詢問內核數據是否已準備好了。

優(yōu)點:模型簡單,實現難度低;與阻塞IO模型對比,它在等待數據報的過程中,進程并沒有阻塞,它可以做其他的事情。

缺點:輪詢發(fā)送 recvform,消耗CPU 資源。

生活場景:你和你女朋友去奶茶店買奶茶,吸取了上一次的教訓,點完奶茶后順便去逛了逛商場。由于你們擔心會錯過取餐,所以你們就每隔一段時間就來問下服務員,你們的奶茶做好了沒有,來來回回好多回,若干次后,終于問到奶茶已經準備好了,然后你們就開心的喝了起來。

四、IO復用模型

非阻塞IO模型需要進程不斷地輪詢發(fā)起recvform系統調用,就會有很多的線程不斷調用recvfrom 請求數據,先不說服務器能不能扛得住這么多線程,就算扛得住那么很明顯這種方式是不是太浪費資源了,線程是我們操作系統的寶貴資源,大量的線程用來去讀取數據了,那么就意味著能做其它事情的線程就會少。

例如:你是奶茶店的服務員,每個人點好奶茶后,每隔幾分鐘就來問你一次好了沒有,隨著問的人越來越多,你可能會開始懷疑人生。那么有沒有什么好的解決辦法呢?

答案:不需要所有進程輪詢來發(fā)起recvform來查詢數據是否已經準備好了,而是有人幫忙來詢問,這個幫忙的人就是select。

IO復用模型如下所示:

56ca0220-d9de-11ee-a297-92fbcf53809c.png

多個進程的IO注冊到一個復用器(select)上,select 會監(jiān)聽所有注冊進來的IO。如果內核的數據報沒有準備好,調用select 的進程將會被阻塞,而當任一IO在內核緩沖區(qū)中有數據,select調用就會返回可讀條件,然后進程再進行recvform系統調用,內核將數據拷貝到用戶空間,注意這個過程是阻塞的。

注意:IO 復用模型在第一個階段和第二個階段其實都有阻塞,第一個階段阻塞于 select 調用,第二個階段阻塞于數據復制。

優(yōu)點:適用于高并發(fā)應用程序。

缺點:模型復雜,實現、開發(fā)難度較大。

生活場景:如果每個人都過一會就來問一下奶茶好了沒有,奶茶店的壓力也太大了。于是奶茶店想到了一個辦法,找一個中間人(select)擋在奶茶店前面,顧客(應用進程)詢問那個中間人奶茶好了沒有(對應多個進程的IO注冊到一個復用器(select)上),如果沒有好就讓顧客等待(應用進程阻塞于 select 調用)。中間人持續(xù)查看顧客的奶茶是否準備好,如果有一個人的奶茶準備好了就會去通知那個人可以取了(而當任一IO在內核緩沖區(qū)中有數據,select調用就會返回可讀條件,然后進程再進行recvform系統調用)。

56cdf966-d9de-11ee-a297-92fbcf53809c.png

總結

學習IO模型時,必須要把每個模型聯系起來看,比如阻塞IO模型會阻塞較長時間,而非阻塞IO在等待數據報的過程中,進程并沒有阻塞,它可以做其他的事情。IO復用模型可以很好的降低服務器的壓力,且在連接數眾多且消息體不大的情況下有很大的優(yōu)勢。


審核編輯:劉清

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

    關注

    19

    文章

    7673

    瀏覽量

    90931
  • 操作系統
    +關注

    關注

    37

    文章

    7168

    瀏覽量

    125769
  • 復用器
    +關注

    關注

    1

    文章

    773

    瀏覽量

    29082

原文標題:面試官:簡單說一下阻塞IO、非阻塞IO、IO復用的區(qū)別 ?

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    IO與NIO有何區(qū)別

    的是對基于Socket的網絡編程提供了阻塞編程模式。 IO NIO 面向流 面向緩沖 阻塞
    的頭像 發(fā)表于 09-25 11:00 ?1190次閱讀
    <b class='flag-5'>IO</b>與NIO有何<b class='flag-5'>區(qū)別</b>

    linuxIO模型詳解

      開門見山,Linux的如中IO模型:阻塞IO模型,阻塞
    發(fā)表于 10-09 16:12

    如何使用普通IO模擬串口實現阻塞全雙工通訊功能?

    如何使用普通IO模擬串口實現阻塞全雙工通訊功能?
    發(fā)表于 12-03 06:14

    veriolg中阻塞賦值與阻塞賦值區(qū)別

      在開始學到阻塞阻塞的時候,所被告知的兩者的區(qū)別就在于阻塞是串行的,
    發(fā)表于 09-16 09:34 ?4次下載

    《Linux設備驅動開發(fā)詳解》第8章、Linux設備驅動中的阻塞阻塞IO

    《Linux設備驅動開發(fā)詳解》第8章、Linux設備驅動中的阻塞阻塞IO
    發(fā)表于 10-27 11:35 ?9次下載
    《Linux設備驅動開發(fā)詳解》第8章、Linux設備驅動中的<b class='flag-5'>阻塞</b>與<b class='flag-5'>非</b><b class='flag-5'>阻塞</b><b class='flag-5'>IO</b>

    網絡IO套路分享

    轉自:我是程序員小賤-L的存在 1 阻塞阻塞--開胃菜 阻塞 我們知道在調用某個函數的時候無非就是兩種情況,要么馬上返回,然后根據返回值進行接下來的業(yè)務處理。當在使用
    的頭像 發(fā)表于 10-13 14:52 ?2151次閱讀
    網絡<b class='flag-5'>IO</b>套路分享

    深入分析同步阻塞網絡IO的內部實現詳解

    在網絡開發(fā)模型中,有種非常易于開發(fā)同學使用的方式,那就是同步阻塞的網絡 IO(在 Java 中習慣叫 BIO)。
    的頭像 發(fā)表于 04-03 14:10 ?2280次閱讀
    深入分析同步<b class='flag-5'>阻塞</b>網絡<b class='flag-5'>IO</b>的內部實現詳解

    網絡IO的弊端以及多路復用IO的優(yōu)勢

    為了講多路復用,當然還是要跟風,采用鞭尸的思路,先講講傳統的網絡 IO 的弊端,用拉踩的方式捧起多路復用 IO 的優(yōu)勢。 為了方便理解,以下所有代碼都是偽代碼,知道其表達的意思即可。
    的頭像 發(fā)表于 08-25 18:01 ?3328次閱讀
    網絡<b class='flag-5'>IO</b>的弊端以及多路<b class='flag-5'>復用</b><b class='flag-5'>IO</b>的優(yōu)勢

    文詳細了解五種IO模型

    五種IO模型包括:阻塞IO阻塞IOIO多路
    的頭像 發(fā)表于 02-14 14:38 ?6214次閱讀
    <b class='flag-5'>一</b>文詳細了解五種<b class='flag-5'>IO</b>模型

    簡要敘述分布式IO和遠程IO區(qū)別

    遠程IO與分布式IO區(qū)別是什么?讓很多人糊涂,到底什么是遠程IO,什么是分布式IO,網上包括各種聲音,連行內有經驗的老師們也可能把分布式
    的頭像 發(fā)表于 12-29 11:59 ?1.3w次閱讀
    簡要敘述分布式<b class='flag-5'>IO</b>和遠程<b class='flag-5'>IO</b>的<b class='flag-5'>區(qū)別</b>

    文了解阻塞賦值與阻塞賦值

    今天給大家普及一下阻塞賦值和阻塞賦值的相關知識
    的頭像 發(fā)表于 07-07 14:15 ?2655次閱讀
    <b class='flag-5'>一</b>文了解<b class='flag-5'>阻塞</b>賦值與<b class='flag-5'>非</b><b class='flag-5'>阻塞</b>賦值

    網絡IO模型:阻塞阻塞

    阻塞 IO 模型 在Linux ,默認情況所有的 socket 都是阻塞的,個典型的讀操作流程如圖所示。
    的頭像 發(fā)表于 10-08 17:16 ?1260次閱讀
    網絡<b class='flag-5'>IO</b>模型:<b class='flag-5'>阻塞</b>與<b class='flag-5'>非</b><b class='flag-5'>阻塞</b>

    多路IO復用模型和異步IO模型介紹

    多路 IO 復用模型 多路 IO 復用,有時也稱為事件驅動 IO。它的基本原理就是有個函數會不斷地輪詢所負責的所有 socket ,當某個
    的頭像 發(fā)表于 10-08 17:21 ?1137次閱讀
    多路<b class='flag-5'>IO</b><b class='flag-5'>復用</b>模型和異步<b class='flag-5'>IO</b>模型介紹

    信號驅動IO與異步IO區(qū)別

    , 是開始處理IO, 這個時候還是存在阻塞的,將數據從內核態(tài)拷貝進入到用戶態(tài)的過程至少是阻塞住的 (應用程序將數據從內核態(tài)拷貝到用戶態(tài)的過程是阻塞等待的, 和異步
    的頭像 發(fā)表于 11-08 15:32 ?1531次閱讀
    信號驅動<b class='flag-5'>IO</b>與異步<b class='flag-5'>IO</b>的<b class='flag-5'>區(qū)別</b>

    文解讀Linux 5種IO模型

    Linux里有五種IO模型:阻塞IO阻塞IO、多路復用
    的頭像 發(fā)表于 11-09 11:12 ?887次閱讀
    <b class='flag-5'>一</b>文解讀Linux 5種<b class='flag-5'>IO</b>模型
    主站蜘蛛池模板: 朋友的娇妻好爽好烫嗯 | 色综合欧美色综合七久久 | 樱花草在线观看影院 | 吃奶啃奶玩乳漫画 | 少妇的肉体AA片免费观看 | 久欠热视频精品首页 | 看黄色片子 | 日本一区二区三区在线观看网站 | 欧美精品色婷婷五月综合 | 长泽梓黑人初解禁bdd07 | 久久涩视频 | 女神被调教成了精盆 | 乌克兰16~18sex | 无码国产成人午夜在线观看不卡 | 51vv视频社区 | jizz69女士第一次 | 日日碰狠狠躁久久躁77777 | 国产午夜a理论毛片在线影院 | 囯产精品久久久久久久久免费蜜桃 | 国产专区青青在线视频 | 中文字幕乱码在线人视频 | 好男人午夜www视频在线观看 | 久久视频在线视频 | 成年人视频在线免费播放 | 在线播放国产视频 | 久久亚洲网站 | 97成人精品视频在线播放 | 成人国内精品久久久久影院 | 欧美video巨大粗暴18 | 国产SUV精品一区二区883 | 久久黄色网址 | a视频在线观看免费 | 秋霞在线看片无码免费 | 寂寞夜晚视频在线观看 | 粉嫩极品国产在线观看 | 日本68xxxxxxxxx老师| c了瑜伽老师嗷嗷叫一节课视频 | 久久成人免费大片 | 午夜伦理伦理片在线观 | 性色AV一区二区三区V视界影院 | 一级毛片皇帝 宫女 |

    電子發(fā)燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品