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

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

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

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

Linux的5種IO模型

FPGA之家 ? 來源:FPGA之家 ? 作者:FPGA之家 ? 2022-08-12 09:22 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

哈哈!

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

以下是正文:

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

一、Linux 的 5 種 IO 模型

阻塞式 I/O:

系統(tǒng)調(diào)用可能因為無法立即完成而被操作系統(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)核注冊一組事件,內(nèi)核通過 I/O 復(fù)用函數(shù)把其中就緒的事件通知給應(yīng)用程序。

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

點(diǎn)擊查看大圖

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

為一個目標(biāo)文件描述符指定宿主進(jìn)程,當(dāng)文件描述符上有事件發(fā)生時,SIGIO 的信號處理函數(shù)將被觸發(fā),然后便可對目標(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)擊查看大圖

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

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

二、如何使用信號驅(qū)動式 I/O?

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

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

通過 sigaction() 來完成:

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

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

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

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

fcntl(fd,F_SETOWN,pid)

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

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

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

3> 使能非阻塞 I/O。

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

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

4> 使能信號驅(qū)動 I/O。

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

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

5> 進(jìn)程等待 "IO 就緒" 信號的到來。

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

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

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

原因:

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

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

三、內(nèi)核何時會發(fā)送 "IO 就緒" 信號?

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

1> 終端

  • 對于終端,當(dāng)有新的輸入時會會產(chǎn)生信號。

2> 管道和 FIFO

對于讀端,下列情況會產(chǎn)生信號:

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

對于寫端,下列情況會產(chǎn)生信號:

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

3> 套接字

對于 UDP 套接字,下列情況會產(chǎn)生信號:

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

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

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

四、最簡單的示例

信號處理函數(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#

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

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

五、擴(kuò)展知識

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

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

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

信號驅(qū)動 I/O 的缺點(diǎn):

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

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

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

六、相關(guān)參考

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

  • 6.2 I/O模型
  • 25 信號驅(qū)動式I/O

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

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

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

  • 8.3 I/O 模型

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

  • 7.4.1 muduo的IO模型

審核編輯 :李倩



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

    關(guān)注

    88

    文章

    11764

    瀏覽量

    219099
  • 信號處理
    +關(guān)注

    關(guān)注

    49

    文章

    1145

    瀏覽量

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

    關(guān)注

    3

    文章

    4417

    瀏覽量

    67552

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    三格電子一體式io和分體式io的區(qū)別#

    IO
    jf_68793483
    發(fā)布于 :2026年02月27日 14:15:48

    IO口8工作模式和應(yīng)用

    在芯片設(shè)計中,IO口(輸入/輸出端口)是微控制器(MCU)或處理器與外部設(shè)備交互的關(guān)鍵接口。IO口的工作模式通常由芯片的硬件設(shè)計和軟件配置決定,不同的工作模式適用于不同的應(yīng)用場景。 工作模式典型
    發(fā)表于 11-14 06:46

    N32 MCU IO 5V 耐壓選型指南

    支持5V耐壓IO的MCU能夠直接承受5V電壓輸入,能夠增強(qiáng)系統(tǒng)魯棒性,有效防止意外損壞。01如何快速判斷一顆MCU是否支持5V耐壓?選型時,無需通讀全篇數(shù)據(jù)手冊,只需重點(diǎn)關(guān)注以下兩處關(guān)
    的頭像 發(fā)表于 11-04 11:31 ?495次閱讀
    N32 MCU  <b class='flag-5'>IO</b> <b class='flag-5'>5</b>V 耐壓選型指南

    STM32 Nucleo IO-Link開發(fā)套件技術(shù)解析

    適用于IO-Link的STMicroelectronics P-NUCLEO-IOD5A1 Nucleo套件由堆疊在NUCLEOG071RB開發(fā)板上的X-NUCLEOIOD02A1
    的頭像 發(fā)表于 10-16 10:01 ?883次閱讀
    STM32 Nucleo <b class='flag-5'>IO</b>-Link開發(fā)套件技術(shù)解析

    遠(yuǎn)程IO不就是分布式IO?其實(shí)很多人都理解錯了

    一、引言 在工業(yè)自動化和控制系統(tǒng)中,分布式io和遠(yuǎn)程io作為兩常見的IO技術(shù),各自具有獨(dú)特的特點(diǎn)和優(yōu)勢,以下對遠(yuǎn)程io和分布式
    的頭像 發(fā)表于 09-28 11:06 ?745次閱讀
    遠(yuǎn)程<b class='flag-5'>IO</b>不就是分布式<b class='flag-5'>IO</b>?其實(shí)很多人都理解錯了

    GraniStudio:IO初始化以及IO資源配置例程

    1.文件運(yùn)行 導(dǎo)入工程 雙擊運(yùn)行桌面GraniStudio.exe。 通過引導(dǎo)界面導(dǎo)入IO初始化以及IO資源配置例程,點(diǎn)擊導(dǎo)入按鈕。 打開IO初始化以及IO資源配置例程所在路徑,選中
    的頭像 發(fā)表于 08-22 17:34 ?942次閱讀
    GraniStudio:<b class='flag-5'>IO</b>初始化以及<b class='flag-5'>IO</b>資源配置例程

    GraniStudio:IO寫入例程

    1.文件運(yùn)行 導(dǎo)入工程 雙擊運(yùn)行桌面GraniStudio.exe。 通過引導(dǎo)界面導(dǎo)入IO寫入例程,點(diǎn)擊導(dǎo)入按鈕。 打開IO寫入例程所在路徑,選中IO寫入.gsp文件,點(diǎn)擊打開,完成導(dǎo)入。 2.功能
    的頭像 發(fā)表于 08-22 16:47 ?774次閱讀
    GraniStudio:<b class='flag-5'>IO</b>寫入例程

    干貨分享 | TSMaster IO功能使用指南—基于同星帶IO設(shè)備的配置與操作步驟

    IO模塊是一用于連接計算機(jī)系統(tǒng)或控制系統(tǒng)與外部設(shè)備之間的接口模塊。數(shù)字IO模塊用于處理二進(jìn)制信號的輸入和輸出,它們可以接收和發(fā)送數(shù)字信號,通常用于控制邏輯開關(guān)、觸發(fā)器和其他數(shù)字設(shè)備。模擬IO
    的頭像 發(fā)表于 08-09 20:04 ?1070次閱讀
    干貨分享 | TSMaster <b class='flag-5'>IO</b>功能使用指南—基于同星帶<b class='flag-5'>IO</b>設(shè)備的配置與操作步驟

    鴻蒙中Stage模型與FA模型詳解

    【HarmonyOS 5】鴻蒙中Stage模型與FA模型詳解 ##鴻蒙開發(fā)能力 ##HarmonyOS SDK應(yīng)用服務(wù)##鴻蒙金融類應(yīng)用 (金融理財# 一、前言 在HarmonyOS 5
    的頭像 發(fā)表于 07-07 11:50 ?926次閱讀

    Analog Devices / Maxim Integrated MAXREFDES177 IO-Link通用模擬IO特性/框圖

    Analog Devices MAXREFDES177 IO-Link通用模擬IO是一款完備的IO-Link?通用模擬輸入-輸出 (IO) 參考設(shè)計,采用內(nèi)置集成保護(hù)功能的MAX225
    的頭像 發(fā)表于 06-30 09:30 ?793次閱讀
    Analog Devices / Maxim Integrated MAXREFDES177 <b class='flag-5'>IO</b>-Link通用模擬<b class='flag-5'>IO</b>特性/框圖

    邊緣計算中的機(jī)器學(xué)習(xí):基于 Linux 系統(tǒng)的實(shí)時推理模型部署與工業(yè)集成!

    學(xué)習(xí)如何訓(xùn)練模型、導(dǎo)出模型,并在基于Linux的系統(tǒng)上運(yùn)行實(shí)時推理,并通過MQTT發(fā)布結(jié)果。這是一個簡單但完整的流程——從工作站上的建模到在邊緣設(shè)備上運(yùn)行工業(yè)風(fēng)格
    的頭像 發(fā)表于 06-11 17:22 ?1010次閱讀
    邊緣計算中的機(jī)器學(xué)習(xí):基于 <b class='flag-5'>Linux</b> 系統(tǒng)的實(shí)時推理<b class='flag-5'>模型</b>部署與工業(yè)集成!

    FA模型卡片和Stage模型卡片切換

    ,Stage卡片配置在module.json5和form_config.json中(如下圖1和圖2)。 卡片業(yè)務(wù)邏輯:FA模型和Stage模型在卡片入口文件以及生命周期存在細(xì)微的差異(如下圖3和圖4
    發(fā)表于 06-06 08:10

    FA模型訪問Stage模型DataShareExtensionAbility說明

    FA模型訪問Stage模型DataShareExtensionAbility 概述 無論FA模型還是Stage模型,數(shù)據(jù)讀寫功能都包含客戶端和服務(wù)端兩部分。 FA
    發(fā)表于 06-04 07:53

    KaihongOS操作系統(tǒng)FA模型與Stage模型介紹

    FA模型與Stage模型介紹 KaihongOS操作系統(tǒng)中,F(xiàn)A模型(Feature Ability)和Stage模型是兩不同的應(yīng)用
    發(fā)表于 04-24 07:27

    請問如何在imx8mplus上部署和運(yùn)行YOLOv5訓(xùn)練的模型?

    我正在從事 imx8mplus yocto 項目。我已經(jīng)在自定義數(shù)據(jù)集上的 YOLOv5 上訓(xùn)練了對象檢測模型。它在 ubuntu 電腦上運(yùn)行良好。現(xiàn)在我想在我的 imx8mplus 板上運(yùn)行該模型
    發(fā)表于 03-25 07:23