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

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

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

3天內不再提示

Linux的5種IO模型

FPGA之家 ? 來源:FPGA之家 ? 作者:FPGA之家 ? 2022-08-12 09:22 ? 次閱讀

哈嘍,我是老吳,俺又來分享文章啦!

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

還有機會全身而退嗎?

哈哈!

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

以下是正文:

一、Linux 的 5 種 IO 模型
二、如何使用信號驅動式 I/O?
三、內核何時會發送 "IO 就緒" 信號?
四、最簡單的示例
五、擴展知識

一、Linux 的 5 種 IO 模型

阻塞式 I/O:

系統調用可能因為無法立即完成而被操作系統掛起,直到等待的事件發生為止。

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

點擊查看大圖

非阻塞式 I/O (O_NONBLOCK):

系統調用則總是立即返回,而不管事件是否已經發生。

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

點擊查看大圖

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

通過 I/O 復用函數向內核注冊一組事件,內核通過 I/O 復用函數把其中就緒的事件通知給應用程序。

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

點擊查看大圖

信號驅動式 I/O (SIGIO):

為一個目標文件描述符指定宿主進程,當文件描述符上有事件發生時,SIGIO 的信號處理函數將被觸發,然后便可對目標文件描述符執行 I/O 操作。

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

點擊查看大圖

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

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

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

點擊查看大圖

思考一下,什么時候應該選擇何種 I/O 模型?為何要這么選擇?

下面重點關注信號驅動式 I/O 這一模型,其他模型可查閱文末參考書籍。

二、如何使用信號驅動式 I/O?

一般通過如下 6 個步驟來使用信號驅動式 I/O 模型。

1> 為通知信號安裝處理函數。

通過 sigaction() 來完成:

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

默認情況下,這個通知信號為 SIGIO。

2> 為文件描述符的設置屬主。

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

fcntl(fd,F_SETOWN,pid)

屬主是當文件描述符上可執行 I/O 時,會接收到通知信號的進程或進程組。

pid 為正整數時,代表了進程 ID 號。

pid 為負整數時,它的絕對值就代表了進程組 ID 號。

3> 使能非阻塞 I/O。

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

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

4> 使能信號驅動 I/O。

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

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

5> 進程等待 "IO 就緒" 信號的到來。

當 I/O 操作就緒時,內核會給進程發送一個信號,然后調用在第 1 步中安裝好的信號處理函數。

6> 進程盡可能多地執行 I/O 操作。

循環執行 I/O 系統調用直到失敗為止,此時錯誤碼為 EAGAIN 或 EWOULDBLOCK。

原因:

信號驅動 I/O 提供的是邊緣觸發通知,即只有當 I/O 事件發生時我們才會收到通知,

且當文件描述符收到 I/O 事件通知時,并不知道要處理多少 I/O 數據。

三、內核何時會發送 "IO 就緒" 信號?

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

1> 終端

  • 對于終端,當有新的輸入時會會產生信號。

2> 管道和 FIFO

對于讀端,下列情況會產生信號:

  • 數據寫入到管道中;
  • 管道的寫端關閉;

對于寫端,下列情況會產生信號:

  • 對管道的讀操作增加了管道中的空余空間大小。
  • 管道的讀端關閉;

3> 套接字

對于 UDP 套接字,下列情況會產生信號:

  • 數據報到達套接字;
  • 套接字上發生異步錯誤;

對于 TCP 套接字,信號驅動式 I/O 近乎無用。

  • 太多情況都會產生信號,而我們又無法得知事件類型,因此這里就不再列舉其產生信號的情況。

四、最簡單的示例

信號處理函數:

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);
}

運行效果:

./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#

該程序會先使能信號驅動 IO,然后循環執行計數操作。

當有 IO 就緒信號到來時,會去終端讀取數據并打印出來,然后繼續執行計數操作。

五、擴展知識

I/O 多路復用 、信號驅動 I/O 以及 epoll 機制可用于監視多個文件描述符。

它們并不實際執行 I/O 操作,當某個文件描述符處于就緒態,仍需采用傳統的 I/O 系統調用來完成 I/O 操作。

相比 I/O 多路復用,當監視大量的文件描述符時信號驅動 I/O 有著顯著的性能優勢,原因是內核能夠幫進程記錄了正在監視的文件描述符列表。

信號驅動 I/O 的缺點:

  • 信號的處理流程較為復雜;

  • 無法指定需要監控的事件類型。

Linux 特有的 epoll 是一個更好的選擇。

六、相關參考

UNIX 網絡編程卷1

  • 6.2 I/O模型
  • 25 信號驅動式I/O

Linux-UNIX 系統編程手冊

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

Linux 高性能服務器編程

  • 8.3 I/O 模型

Linux 多線程服務端編程_使用muduo C++網絡庫

  • 7.4.1 muduo的IO模型

審核編輯 :李倩



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

    關注

    87

    文章

    11373

    瀏覽量

    211298
  • 信號處理
    +關注

    關注

    48

    文章

    1047

    瀏覽量

    103553
  • 函數
    +關注

    關注

    3

    文章

    4353

    瀏覽量

    63295

原文標題:思考技術,也思考人生

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    OpenAI即將推出GPT-5模型

    OpenAI首席執行官奧爾特曼近日宣布了一項重要消息:OpenAI將在今年未來幾個月內推出全新的GPT-5模型。這一消息引起了業界的廣泛關注和期待。 據了解,GPT-5模型將整合Ope
    的頭像 發表于 02-13 11:21 ?327次閱讀

    請問有沒有不在linux上對.pt模型向.kmodel轉換的教程呢?

    1、請問有沒有不在linux上對.pt模型向.kmodel轉換的教程呢? 我看網上有個nncase studio的教程(AI模型GUI編譯工具 nncase studio食用指南 - Homura
    發表于 02-08 08:56

    λ-IO:存儲計算下的IO棧設計

    動機和背景? ? 存儲計算存儲資源的充分利用。IO棧是管理存儲器的的基本組件,包括設備驅動、塊接口層、文件系統,目前一些用戶空間IO庫(如SPDK)有效降低了延遲,但是io棧仍然不可或缺。這是因為1
    的頭像 發表于 12-02 10:35 ?341次閱讀
    λ-<b class='flag-5'>IO</b>:存儲計算下的<b class='flag-5'>IO</b>棧設計

    一文解讀Linux 5IO模型

    Linux里有五IO模型:阻塞IO、非阻塞IO、多路復用I
    的頭像 發表于 11-09 11:12 ?534次閱讀
    一文解讀<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多路復用(select,poll,epoll)

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

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

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

    本地IO與遠程IO:揭秘工業自動化中的兩大關鍵角色

    在工業自動化領域,IO(Input/Output,輸入/輸出)模塊扮演著至關重要的角色。它們作為連接控制系統與現場設備的橋梁,負責數據的采集與指令的執行。然而,隨著技術的不斷進步,IO模塊也分為本地IO和遠程
    的頭像 發表于 10-08 18:06 ?734次閱讀

    請問如何將HSPICE和 IBIS兩模型怎么轉換成TINA軟件中用?

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

    linux驅動程序如何加載進內核

    ,需要了解Linux內核的基本概念和API。以下是一些關鍵概念: 1.1 內核模塊:Linux內核模塊是一動態加載和卸載的代碼,可以在不重新啟動系統的情況下加載和卸載。驅動程序通常以內核模塊的形式實現。 1.2 設備
    的頭像 發表于 08-30 15:02 ?699次閱讀

    Linux磁盤IO詳細解析

      在講解磁盤IO前,先簡單說下什么是磁盤。磁盤是可以持久化存儲的設備,根據存儲介質的不同,常見磁盤可以分為兩類:機械磁盤和固態磁盤。
    的頭像 發表于 08-05 15:49 ?772次閱讀
    <b class='flag-5'>Linux</b>磁盤<b class='flag-5'>IO</b>詳細解析

    LM393A的Pspice模型為什么只有5個引腳?

    如上右圖時Pspice模型,只有5個引腳,且沒有8引腳,怎么添加電源
    發表于 07-29 07:32

    一體式IO與分布式IO:工業控制系統的兩架構

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

    遠程IO與分布式IO的區別

    在工業自動化和控制系統設計中,遠程IO(Input/Output)和分布式IO是兩個重要的概念。它們各自具有獨特的特點和優勢,適用于不同的應用場景。本文將詳細探討遠程IO與分布式IO
    的頭像 發表于 06-15 15:57 ?3138次閱讀

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

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

    無法使用STWB5MMG的QSPI IO2怎么解決?

    無法使用STWB5MMG的QSPI IO2 CS:PA2 CLK: PA3 IO0: PB9 IO1: PB8 IO2: PA7-----
    發表于 03-26 07:09
    主站蜘蛛池模板: 黄色网址在线看 | 国产精品午夜福利在线观看 | 亚洲精品第一页中文字幕 | 久青草国产观看在线视频 | 久 久 亚洲 少 妇 无 码 | 飘雪在线观看免费完整版 | 啦啦啦 中文 日本 韩国 免费 | 一个人看的www视频动漫版 | 无码欧美XXXXX在线观看裸 | 亚洲色欲色欲综合网站 | 日韩亚洲视频一区二区三区 | 贵妃高h荡肉呻吟np杨玉环 | 国产AV综合手机在线观看 | 在线综合 亚洲 欧美 | 久久久影院亚洲精品 | 久久国内精品 | bbw videos 欧美老妇 | 在线涩涩免费观看国产精品 | 久久久久久久久a免费 | 岛国大片在线播放免费 | 亚洲国产日韩制服在线观看 | 久久国产视频网 | 5g在视影讯天天5g免费观看 | 内射少妇三洞齐开 | 99视频导航| 极品 女神校花 露脸91 | 亚洲国产成人一区二区在线 | 亚洲AV无码一区二区三区乱子伦 | 欧美色图天堂网 | 亚洲精品国产一区二区贰佰信息网 | 成人国产精品免费网站 | 午夜不卡久久精品无码免费 | 学校女性奴sm训练调教 | 中文字幕一区二区视频 | 色老99九久精品偷偷鲁 | 男人私gay挠脚心vk视频 | 插我一区二区在线观看 | 99久久久无码国产精品AAA | 手机移动oa | 寂寞夜晚视频在线观看 | 小sao货ji巴cao死你视频 |