在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

Linux的5種IO模型

FPGA之家 ? 來(lái)源:FPGA之家 ? 作者:FPGA之家 ? 2022-08-12 09:22 ? 次閱讀

哈嘍,我是老吳,俺又來(lái)分享文章啦!

渾渾噩噩到了 30 歲,距離開滴滴還有 5 年的時(shí)間。

還有機(jī)會(huì)全身而退嗎?

哈哈!

30 而立,今年會(huì)是值得拼搏的一年,干它!

以下是正文:

一、Linux 的 5 種 IO 模型
二、如何使用信號(hào)驅(qū)動(dòng)式 I/O?
三、內(nèi)核何時(shí)會(huì)發(fā)送 "IO 就緒" 信號(hào)?
四、最簡(jiǎn)單的示例
五、擴(kuò)展知識(shí)

一、Linux 的 5 種 IO 模型

阻塞式 I/O:

系統(tǒng)調(diào)用可能因?yàn)闊o(wú)法立即完成而被操作系統(tǒng)掛起,直到等待的事件發(fā)生為止。

1ad5174c-19db-11ed-ba43-dac502259ad0.png

點(diǎn)擊查看大圖

非阻塞式 I/O (O_NONBLOCK):

系統(tǒng)調(diào)用則總是立即返回,而不管事件是否已經(jīng)發(fā)生。

1ae66bb4-19db-11ed-ba43-dac502259ad0.png

點(diǎn)擊查看大圖

I/O 復(fù)用 (select、poll、epoll):

通過 I/O 復(fù)用函數(shù)向內(nèi)核注冊(cè)一組事件,內(nèi)核通過 I/O 復(fù)用函數(shù)把其中就緒的事件通知給應(yīng)用程序。

1af9df32-19db-11ed-ba43-dac502259ad0.png

點(diǎn)擊查看大圖

信號(hào)驅(qū)動(dòng)式 I/O (SIGIO):

為一個(gè)目標(biāo)文件描述符指定宿主進(jìn)程,當(dāng)文件描述符上有事件發(fā)生時(shí),SIGIO 的信號(hào)處理函數(shù)將被觸發(fā),然后便可對(duì)目標(biāo)文件描述符執(zhí)行 I/O 操作。

1b1c96da-19db-11ed-ba43-dac502259ad0.png

點(diǎn)擊查看大圖

異步 I/O (POSIX 的 aio_ 系列函數(shù)):

異步 I/O 的讀寫操作總是立即返回,而不論 I/O 是否是阻塞的,真正的讀寫操作由內(nèi)核接管。

1b327766-19db-11ed-ba43-dac502259ad0.png

點(diǎn)擊查看大圖

思考一下,什么時(shí)候應(yīng)該選擇何種 I/O 模型?為何要這么選擇?

下面重點(diǎn)關(guān)注信號(hào)驅(qū)動(dòng)式 I/O 這一模型,其他模型可查閱文末參考書籍。

二、如何使用信號(hào)驅(qū)動(dòng)式 I/O?

一般通過如下 6 個(gè)步驟來(lái)使用信號(hào)驅(qū)動(dòng)式 I/O 模型。

1> 為通知信號(hào)安裝處理函數(shù)。

通過 sigaction() 來(lái)完成:

intsigaction(intsignum,conststructsigaction*act,structsigaction*oldact);

默認(rèn)情況下,這個(gè)通知信號(hào)為 SIGIO。

2> 為文件描述符的設(shè)置屬主。

通過 fcntl() 的 F_SETOWN 操作來(lái)完成:

fcntl(fd,F_SETOWN,pid)

屬主是當(dāng)文件描述符上可執(zhí)行 I/O 時(shí),會(huì)接收到通知信號(hào)的進(jìn)程或進(jìn)程組。

pid 為正整數(shù)時(shí),代表了進(jìn)程 ID 號(hào)。

pid 為負(fù)整數(shù)時(shí),它的絕對(duì)值就代表了進(jìn)程組 ID 號(hào)。

3> 使能非阻塞 I/O。

通過 fcntl() 的 F_SETFL 操作來(lái)完成:

flags=fcntl(fd,F_GETFL);
fcntl(fd,F_SETFL,flags|O_NONBLOCK);

4> 使能信號(hào)驅(qū)動(dòng) I/O。

通過 fcntl() 的 F_SETFL 操作來(lái)完成:

flags=fcntl(fd,F_GETFL);
fcntl(fd,F_SETFL,flags|O_ASYNC);

5> 進(jìn)程等待 "IO 就緒" 信號(hào)的到來(lái)。

當(dāng) I/O 操作就緒時(shí),內(nèi)核會(huì)給進(jìn)程發(fā)送一個(gè)信號(hào),然后調(diào)用在第 1 步中安裝好的信號(hào)處理函數(shù)。

6> 進(jìn)程盡可能多地執(zhí)行 I/O 操作。

循環(huán)執(zhí)行 I/O 系統(tǒng)調(diào)用直到失敗為止,此時(shí)錯(cuò)誤碼為 EAGAIN 或 EWOULDBLOCK。

原因:

信號(hào)驅(qū)動(dòng) I/O 提供的是邊緣觸發(fā)通知,即只有當(dāng) I/O 事件發(fā)生時(shí)我們才會(huì)收到通知,

且當(dāng)文件描述符收到 I/O 事件通知時(shí),并不知道要處理多少 I/O 數(shù)據(jù)。

三、內(nèi)核何時(shí)會(huì)發(fā)送 "IO 就緒" 信號(hào)?

對(duì)于不同類型的文件描述符,情況不一樣。

1> 終端

  • 對(duì)于終端,當(dāng)有新的輸入時(shí)會(huì)會(huì)產(chǎn)生信號(hào)。

2> 管道和 FIFO

對(duì)于讀端,下列情況會(huì)產(chǎn)生信號(hào):

  • 數(shù)據(jù)寫入到管道中;
  • 管道的寫端關(guān)閉;

對(duì)于寫端,下列情況會(huì)產(chǎn)生信號(hào):

  • 對(duì)管道的讀操作增加了管道中的空余空間大小。
  • 管道的讀端關(guān)閉;

3> 套接字

對(duì)于 UDP 套接字,下列情況會(huì)產(chǎn)生信號(hào):

  • 數(shù)據(jù)報(bào)到達(dá)套接字;
  • 套接字上發(fā)生異步錯(cuò)誤;

對(duì)于 TCP 套接字,信號(hào)驅(qū)動(dòng)式 I/O 近乎無(wú)用。

  • 太多情況都會(huì)產(chǎn)生信號(hào),而我們又無(wú)法得知事件類型,因此這里就不再列舉其產(chǎn)生信號(hào)的情況。

四、最簡(jiǎn)單的示例

信號(hào)處理函數(shù):

staticvolatilesig_atomic_tgotSigio=0;

staticvoidhandler(intsig)
{
gotSigio=1;
}

主程序:

intmain(intargc,char*argv[])
{
intflags,j,cnt;
structtermiosorigTermios;
charch;
structsigactionsa;
intdone;

/*Establishhandler*/
sigemptyset(&sa.sa_mask);
sa.sa_flags=SA_RESTART;
sa.sa_handler=handler;
if(sigaction(SIGIO,&sa,NULL)==-1){
perror("sigaction()
");
exit(1);
}

/*Setownerprocess*/
if(fcntl(STDIN_FILENO,F_SETOWN,getpid())==-1){
perror("fcntl()/F_SETOWN
");
exit(1);
}

/*Enable"I/Opossible"signalingandmakeI/Ononblocking*/
flags=fcntl(STDIN_FILENO,F_GETFL);
if(fcntl(STDIN_FILENO,F_SETFL,flags|O_ASYNC|O_NONBLOCK)==-1){
perror("fcntl()/F_SETFL
");
exit(1);
}

for(done=0,cnt=0;!done;cnt++){
sleep(1);

if(gotSigio){
gotSigio=0;

/*Readallavailableinputuntilerror(probablyEAGAIN)
orEOF*/
while(read(STDIN_FILENO,&ch,1)>0&&!done){
printf("cnt=%d;read%c
",cnt,ch);
done=ch=='#';
}
}
}
exit(0);
}

運(yùn)行效果:

./build/sigio
a
cnt=0;reada
cnt=0;read

abc
cnt=4;reada
cnt=4;readb
cnt=4;readc
cnt=4;read

#
cnt=7;read#

該程序會(huì)先使能信號(hào)驅(qū)動(dòng) IO,然后循環(huán)執(zhí)行計(jì)數(shù)操作。

當(dāng)有 IO 就緒信號(hào)到來(lái)時(shí),會(huì)去終端讀取數(shù)據(jù)并打印出來(lái),然后繼續(xù)執(zhí)行計(jì)數(shù)操作。

五、擴(kuò)展知識(shí)

I/O 多路復(fù)用 、信號(hào)驅(qū)動(dòng) I/O 以及 epoll 機(jī)制可用于監(jiān)視多個(gè)文件描述符。

它們并不實(shí)際執(zhí)行 I/O 操作,當(dāng)某個(gè)文件描述符處于就緒態(tài),仍需采用傳統(tǒng)的 I/O 系統(tǒng)調(diào)用來(lái)完成 I/O 操作。

相比 I/O 多路復(fù)用,當(dāng)監(jiān)視大量的文件描述符時(shí)信號(hào)驅(qū)動(dòng) I/O 有著顯著的性能優(yōu)勢(shì),原因是內(nèi)核能夠幫進(jìn)程記錄了正在監(jiān)視的文件描述符列表。

信號(hào)驅(qū)動(dòng) I/O 的缺點(diǎn):

  • 信號(hào)的處理流程較為復(fù)雜;

  • 無(wú)法指定需要監(jiān)控的事件類型。

Linux 特有的 epoll 是一個(gè)更好的選擇。

六、相關(guān)參考

UNIX 網(wǎng)絡(luò)編程卷1

  • 6.2 I/O模型
  • 25 信號(hào)驅(qū)動(dòng)式I/O

Linux-UNIX 系統(tǒng)編程手冊(cè)

  • 63 其他備選的I/O模型

Linux 高性能服務(wù)器編程

  • 8.3 I/O 模型

Linux 多線程服務(wù)端編程_使用muduo C++網(wǎng)絡(luò)庫(kù)

  • 7.4.1 muduo的IO模型

審核編輯 :李倩



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

    關(guān)注

    87

    文章

    11353

    瀏覽量

    210601
  • 信號(hào)處理
    +關(guān)注

    關(guān)注

    48

    文章

    1043

    瀏覽量

    103434
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4349

    瀏覽量

    63033

原文標(biāo)題:思考技術(shù),也思考人生

文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    OpenAI即將推出GPT-5模型

    OpenAI首席執(zhí)行官奧爾特曼近日宣布了一項(xiàng)重要消息:OpenAI將在今年未來(lái)幾個(gè)月內(nèi)推出全新的GPT-5模型。這一消息引起了業(yè)界的廣泛關(guān)注和期待。 據(jù)了解,GPT-5模型將整合Ope
    的頭像 發(fā)表于 02-13 11:21 ?238次閱讀

    請(qǐng)問有沒有不在linux上對(duì).pt模型向.kmodel轉(zhuǎn)換的教程呢?

    1、請(qǐng)問有沒有不在linux上對(duì).pt模型向.kmodel轉(zhuǎn)換的教程呢? 我看網(wǎng)上有個(gè)nncase studio的教程(AI模型GUI編譯工具 nncase studio食用指南 - Homura
    發(fā)表于 02-08 08:56

    λ-IO:存儲(chǔ)計(jì)算下的IO棧設(shè)計(jì)

    動(dòng)機(jī)和背景? ? 存儲(chǔ)計(jì)算存儲(chǔ)資源的充分利用。IO棧是管理存儲(chǔ)器的的基本組件,包括設(shè)備驅(qū)動(dòng)、塊接口層、文件系統(tǒng),目前一些用戶空間IO庫(kù)(如SPDK)有效降低了延遲,但是io棧仍然不可或缺。這是因?yàn)?
    的頭像 發(fā)表于 12-02 10:35 ?280次閱讀
    λ-<b class='flag-5'>IO</b>:存儲(chǔ)計(jì)算下的<b class='flag-5'>IO</b>棧設(shè)計(jì)

    一文解讀Linux 5IO模型

    Linux里有五IO模型:阻塞IO、非阻塞IO、多路復(fù)用I
    的頭像 發(fā)表于 11-09 11:12 ?445次閱讀
    一文解讀<b class='flag-5'>Linux</b> <b class='flag-5'>5</b><b class='flag-5'>種</b><b class='flag-5'>IO</b><b class='flag-5'>模型</b>

    Linux--IO多路復(fù)用(select,poll,epoll)

    IO多路復(fù)用——select,poll,epollIO多路復(fù)用是一操作系統(tǒng)技術(shù),旨在提高系統(tǒng)處理多個(gè)輸入輸出操作的性能和資源利用率。與傳統(tǒng)的多線程或多進(jìn)程模型相比,IO多路復(fù)用避免了
    的頭像 發(fā)表于 11-06 16:13 ?459次閱讀

    華納云監(jiān)視Linux磁盤IO性能命令:iotop,iostat,vmstat,atop,dstat,ioping

    以下介紹6個(gè)監(jiān)視 Linux 磁盤IO性能的命令(工具),它們分別是iotop、iostat、vmstat、atop、dstat、ioping,以下將附上簡(jiǎn)單的使用方法。 前言 磁盤IO
    的頭像 發(fā)表于 10-24 14:43 ?295次閱讀

    本地IO與遠(yuǎn)程IO:揭秘工業(yè)自動(dòng)化中的兩大關(guān)鍵角色

    在工業(yè)自動(dòng)化領(lǐng)域,IO(Input/Output,輸入/輸出)模塊扮演著至關(guān)重要的角色。它們作為連接控制系統(tǒng)與現(xiàn)場(chǎng)設(shè)備的橋梁,負(fù)責(zé)數(shù)據(jù)的采集與指令的執(zhí)行。然而,隨著技術(shù)的不斷進(jìn)步,IO模塊也分為本地IO和遠(yuǎn)程
    的頭像 發(fā)表于 10-08 18:06 ?599次閱讀

    請(qǐng)問如何將HSPICE和 IBIS兩模型怎么轉(zhuǎn)換成TINA軟件中用?

    TI網(wǎng)站里,給出了一些期間的HSPICE和IBIS模型,但是現(xiàn)有的仿真工具 只有TINA這種,請(qǐng)問如何將HSPICE和 IBIS兩模型怎么轉(zhuǎn)換成TINA軟件中用? 請(qǐng)高手給予解答。感謝!
    發(fā)表于 09-02 07:56

    linux驅(qū)動(dòng)程序如何加載進(jìn)內(nèi)核

    ,需要了解Linux內(nèi)核的基本概念和API。以下是一些關(guān)鍵概念: 1.1 內(nèi)核模塊:Linux內(nèi)核模塊是一動(dòng)態(tài)加載和卸載的代碼,可以在不重新啟動(dòng)系統(tǒng)的情況下加載和卸載。驅(qū)動(dòng)程序通常以內(nèi)核模塊的形式實(shí)現(xiàn)。 1.2 設(shè)備
    的頭像 發(fā)表于 08-30 15:02 ?618次閱讀

    Linux磁盤IO詳細(xì)解析

      在講解磁盤IO前,先簡(jiǎn)單說(shuō)下什么是磁盤。磁盤是可以持久化存儲(chǔ)的設(shè)備,根據(jù)存儲(chǔ)介質(zhì)的不同,常見磁盤可以分為兩類:機(jī)械磁盤和固態(tài)磁盤。
    的頭像 發(fā)表于 08-05 15:49 ?732次閱讀
    <b class='flag-5'>Linux</b>磁盤<b class='flag-5'>IO</b>詳細(xì)解析

    一體式IO與分布式IO:工業(yè)控制系統(tǒng)的兩架構(gòu)

    受到青睞。然而,一體式IO架構(gòu)在小型系統(tǒng)中仍然有著廣泛的應(yīng)用。了解這兩架構(gòu)的特點(diǎn)和區(qū)別,有助于工程師和決策者為企業(yè)選擇最合適的工業(yè)控制系統(tǒng)解決方案。
    的頭像 發(fā)表于 07-17 16:12 ?1269次閱讀
    一體式<b class='flag-5'>IO</b>與分布式<b class='flag-5'>IO</b>:工業(yè)控制系統(tǒng)的兩<b class='flag-5'>種</b>架構(gòu)

    遠(yuǎn)程IO與分布式IO的區(qū)別

    在工業(yè)自動(dòng)化和控制系統(tǒng)設(shè)計(jì)中,遠(yuǎn)程IO(Input/Output)和分布式IO是兩個(gè)重要的概念。它們各自具有獨(dú)特的特點(diǎn)和優(yōu)勢(shì),適用于不同的應(yīng)用場(chǎng)景。本文將詳細(xì)探討遠(yuǎn)程IO與分布式IO
    的頭像 發(fā)表于 06-15 15:57 ?2911次閱讀

    STM8L051F3P6 PC5 PC6用做普通IO輸入口,一直為低電平怎么解決?

    LOGIC_IO_INPUT_PORT GPIOC #define LOGIC_IO_INPUT_PINS GPIO_Pin_5 第一方式:輸入浮空 GPIO_Init(LOGI
    發(fā)表于 04-30 07:10

    無(wú)法使用STWB5MMG的QSPI IO2怎么解決?

    無(wú)法使用STWB5MMG的QSPI IO2 CS:PA2 CLK: PA3 IO0: PB9 IO1: PB8 IO2: PA7-----
    發(fā)表于 03-26 07:09

    物理內(nèi)存模型的演變

    內(nèi)存管理概述中,主要是以Linux v2.6.11為例進(jìn)行分析的,但是計(jì)算技術(shù)在不斷發(fā)展,新的存儲(chǔ)架構(gòu)、新的指令集架構(gòu)、新的SoC架構(gòu)等都對(duì)物理內(nèi)存模型的抽象提出了更高要求。為此,必須抽象一完全獨(dú)立于硬件架構(gòu)的物理內(nèi)存
    的頭像 發(fā)表于 02-25 10:35 ?558次閱讀
    主站蜘蛛池模板: 激情九月婷婷 | 成年大片免费视频播放手机不卡 | 欧美婷婷六月丁香综合色 | 精品色图 | 日本xxxxx69hd日本| 日韩午夜免费 | 天天亚洲综合 | 在线免费看一级片 | 手机在线观看你懂得 | 一级做a爰片久久毛片毛片 一级做a爰片久久毛片美女图片 | 婷婷色爱区综合五月激情韩国 | 精品国产中文一级毛片在线看 | 久久国产美女 | 天天干夜夜拍 | 农村妇女色又黄一级毛片卡 | 久久精品国产99国产精品免费看 | 男操女免费视频 | 五月天婷婷伊人 | 黄频网站免费大全在线观看 | 免费看黄视频 | 最新亚洲情黄在线网站 | 欧美3d成人动画在线 | 91国内视频 | 日韩精品一区二区三区毛片 | 91成人免费在线视频 | 在线观看日本免费不卡 | 精品美女在线 | 久久黄色视屏 | 色综合天天综久久久噜噜噜久久〔 | 久久国产美女 | 亭亭色| 永久福利盒子日韩日韩免费看 | 五月天婷婷精品视频 | 天堂在线最新版www中文 | 亚洲色图国产精品 | 欧美特黄视频在线观看 | 日韩a无吗一区二区三区 | 日日爽天天干 | a在线观看网站 | 国产美女一级ba大片免色 | 欧美一级乱理片免费观看 |