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

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

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

多路IO復(fù)用模型和異步IO模型介紹

麥辣雞腿堡 ? 來源:盼盼編程 ? 作者:盼盼編程 ? 2023-10-08 17:21 ? 次閱讀

多路 IO 復(fù)用模型

多路 IO 復(fù)用,有時(shí)也稱為事件驅(qū)動(dòng) IO。它的基本原理就是有個(gè)函數(shù)會(huì)不斷地輪詢所負(fù)責(zé)的所有 socket ,當(dāng)某個(gè) socket有數(shù)據(jù)到達(dá)了,就通知用戶進(jìn)程。IO 復(fù)用模型的流程如圖:

圖片

當(dāng)用戶進(jìn)程調(diào)用了 select ,那么整個(gè)進(jìn)程會(huì)被阻塞,而同時(shí),內(nèi)核會(huì) “監(jiān)視” 所有 select 負(fù)責(zé)的 socket ,當(dāng)任何一個(gè) socket中的數(shù)據(jù)準(zhǔn)備好了, select 就會(huì)返回。這個(gè)時(shí)候用戶進(jìn)程再調(diào)用 read 操作,將數(shù)據(jù)從內(nèi)核拷貝到用戶進(jìn)程。

這個(gè)模型和阻塞 IO 的模型其實(shí)并沒有太大的不同,事實(shí)上還更差一些 因?yàn)檫@里需要使用兩個(gè)系統(tǒng)調(diào)用,而阻塞 IO 只調(diào)用了一個(gè)系統(tǒng)調(diào)用recvfrom,用 select 的優(yōu)勢在于它可以同時(shí)處理多個(gè)連接。

如果處理的連接數(shù)不是很高的話,使用 select/epoll Web server 定比使用多線程的阻塞 IO Web server性能更好,可能延遲還更大;select/poll 的優(yōu)勢并不是對于單個(gè)連接能處理得更快,而是在于能處理更多的連接。

異步 IO 模型

圖片

上面是異步 IO 模型。

用戶進(jìn)程發(fā)起 read 操作之后,立刻就可以開始去做其他的事;而另一方面,從內(nèi)核的角度,當(dāng)它收到一個(gè)異步的 read請求操作之后,首先會(huì)立刻返回,所以不會(huì)對用戶進(jìn)程產(chǎn)生任何阻塞。

然后,內(nèi)核會(huì)等待數(shù)據(jù)準(zhǔn)備完成,然后將數(shù)據(jù)拷貝到用戶內(nèi)存中,當(dāng)這一切都完成之后,內(nèi)核會(huì)給用戶進(jìn)程發(fā)送一個(gè)信號,返回 read 操作已完成的信息。

調(diào)用阻塞 IO 一直阻塞住對應(yīng)的進(jìn)程直到操作完成,而非阻塞 IO 在內(nèi)核還在準(zhǔn)備數(shù)據(jù)的情況下會(huì)立刻返回。兩者的區(qū)別就在于同步 IO 進(jìn)行 IO操作時(shí)會(huì)阻塞進(jìn)程。

非阻塞 IO 在執(zhí)行 recvfrom 這個(gè)系統(tǒng)調(diào)用的時(shí)候,如果內(nèi)核的數(shù)據(jù)沒有準(zhǔn)備好,這時(shí)候不會(huì)阻塞進(jìn)程。但是當(dāng)內(nèi)核中數(shù)據(jù)準(zhǔn)備好時(shí),recvfrom會(huì)將數(shù)據(jù)從內(nèi)核拷貝到用戶內(nèi)存中,這個(gè)時(shí)候進(jìn)程則被阻塞。

而異步 IO 則不 樣,當(dāng)進(jìn)程發(fā)起 IO 操作之后,就直接返回,直到內(nèi)核發(fā)送一個(gè)信號,告訴進(jìn)程 IO
已完成,則在這整個(gè)過程中,進(jìn)程完全沒有被阻塞。

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

    關(guān)注

    0

    文章

    431

    瀏覽量

    39023
  • 驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    12

    文章

    1814

    瀏覽量

    85064
  • 網(wǎng)絡(luò)
    +關(guān)注

    關(guān)注

    14

    文章

    7449

    瀏覽量

    88472
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3081

    瀏覽量

    48593
收藏 人收藏

    評論

    相關(guān)推薦

    Linux驅(qū)動(dòng)開發(fā)之IO模型介紹

    在Linux驅(qū)動(dòng)開發(fā)中,應(yīng)用程序通過循環(huán)讀取或者中斷的方式都會(huì)使得CPU的占用率很高。本文介紹五種IO模型,可以用來優(yōu)化文件讀寫方式,降低CPU的使用率。
    發(fā)表于 07-29 09:03 ?792次閱讀

    Linux驅(qū)動(dòng)學(xué)習(xí)筆記:異步IO

    前幾篇介紹了幾種IO模型,今天介紹另一種IO模型——異步
    發(fā)表于 06-12 16:24 ?641次閱讀

    基于多路復(fù)用模型的Netty框架

    系統(tǒng)處理請求的能力。 有了NIO之后,一個(gè)線程即可處理多個(gè)連接事件,基于多路復(fù)用模型的Netty框架,不僅降低了使用NIO的復(fù)雜度, 優(yōu)點(diǎn) Netty是一款以java NIO為基礎(chǔ),基于事件驅(qū)動(dòng)模型支持
    的頭像 發(fā)表于 09-30 11:30 ?773次閱讀

    IO模型以及多路復(fù)用的總結(jié)及視頻資料

    于用戶態(tài)和內(nèi)核的地址空間之間,而無論這些文件描述符是否就緒。它的開銷隨著文件描述符數(shù)量的增加而線性增加?! ∷灾笥殖霈F(xiàn)了一個(gè)select和poll的增強(qiáng)版本epoll,此處就不做過多的介紹?! ?b class='flag-5'>io多路復(fù)用總結(jié)
    發(fā)表于 12-18 16:04

    淺析java的IO模型

    java IO初識與Linux網(wǎng)絡(luò)IO模型簡介
    發(fā)表于 08-05 06:28

    linux下的IO模型詳解

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

    IO多路復(fù)用的幾種實(shí)現(xiàn)機(jī)制的分析

    服務(wù)器端編程經(jīng)常需要構(gòu)造高性能的IO模型,常見的IO模型有四種:同步和異步的概念描述的是用戶線程與內(nèi)核的交互方式:同步是指用戶線程發(fā)起
    發(fā)表于 03-07 11:40 ?5712次閱讀
    <b class='flag-5'>IO</b><b class='flag-5'>多路復(fù)用</b>的幾種實(shí)現(xiàn)機(jī)制的分析

    網(wǎng)絡(luò)IO的弊端以及多路復(fù)用IO的優(yōu)勢

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

    一文詳細(xì)了解五種IO模型

    五種IO模型包括:阻塞IO、非阻塞IO、IO多路復(fù)用、信號驅(qū)動(dòng)
    的頭像 發(fā)表于 02-14 14:38 ?5852次閱讀
    一文詳細(xì)了解五種<b class='flag-5'>IO</b><b class='flag-5'>模型</b>

    介紹reactor的四種模型

    ,是一種框架,一個(gè)概念,所以reactor沒有一個(gè)固定的代碼,可以有很多變種,后續(xù)會(huì)介紹到。 reactor中的IO使用的是select,poll,epoll這些IO多路復(fù)用,使用
    的頭像 發(fā)表于 11-08 15:29 ?1656次閱讀
    <b class='flag-5'>介紹</b>reactor的四種<b class='flag-5'>模型</b>

    信號驅(qū)動(dòng)IO異步IO的區(qū)別

    一. 談信號驅(qū)動(dòng)IO (對比異步IO來看) 信號驅(qū)動(dòng)IO 對比 異步 IO進(jìn)行理解 信號驅(qū)動(dòng)
    的頭像 發(fā)表于 11-08 15:32 ?926次閱讀
    信號驅(qū)動(dòng)<b class='flag-5'>IO</b>與<b class='flag-5'>異步</b><b class='flag-5'>IO</b>的區(qū)別

    linux異步io框架iouring應(yīng)用

    完善的異步IO(網(wǎng)絡(luò)IO、磁盤IO)機(jī)制。 在網(wǎng)絡(luò)編程中,我們通常使用epoll IO多路復(fù)用
    的頭像 發(fā)表于 11-08 15:39 ?587次閱讀
    linux<b class='flag-5'>異步</b><b class='flag-5'>io</b>框架iouring應(yīng)用

    異步IO框架iouring介紹

    提供完善的異步IO(網(wǎng)絡(luò)IO、磁盤IO)機(jī)制。 在網(wǎng)絡(luò)編程中,我們通常使用epoll IO多路復(fù)用
    的頭像 發(fā)表于 11-09 09:30 ?1995次閱讀
    <b class='flag-5'>異步</b><b class='flag-5'>IO</b>框架iouring<b class='flag-5'>介紹</b>

    IO多路復(fù)用基本概念

    一、IO多路復(fù)用基本概念 select、poll、epoll都是IO多路復(fù)用的機(jī)制。IO多路復(fù)用
    的頭像 發(fā)表于 11-10 16:34 ?1251次閱讀
    <b class='flag-5'>IO</b><b class='flag-5'>多路復(fù)用</b>基本概念

    什么是io多路復(fù)用?IO多路復(fù)用的優(yōu)缺點(diǎn)

    IO多路復(fù)用是一種同步IO模型,它允許單個(gè)進(jìn)程/線程同時(shí)處理多個(gè)IO請求。具體來說,一個(gè)進(jìn)程/線程可以監(jiān)視多個(gè)文件句柄,一旦某個(gè)文件句柄就緒
    的頭像 發(fā)表于 01-18 15:48 ?1519次閱讀