国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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
    +關注

    關注

    88

    文章

    11760

    瀏覽量

    219030
  • 信號處理
    +關注

    關注

    49

    文章

    1143

    瀏覽量

    105100
  • 函數
    +關注

    關注

    3

    文章

    4417

    瀏覽量

    67506

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    三格電子一體式io和分體式io的區別#

    IO
    jf_68793483
    發布于 :2026年02月27日 14:15:48

    IO口8工作模式和應用

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

    N32 MCU IO 5V 耐壓選型指南

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

    STM32 Nucleo IO-Link開發套件技術解析

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

    遠程IO不就是分布式IO?其實很多人都理解錯了

    一、引言 在工業自動化和控制系統中,分布式io和遠程io作為兩常見的IO技術,各自具有獨特的特點和優勢,以下對遠程io和分布式
    的頭像 發表于 09-28 11:06 ?726次閱讀
    遠程<b class='flag-5'>IO</b>不就是分布式<b class='flag-5'>IO</b>?其實很多人都理解錯了

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

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

    GraniStudio:IO寫入例程

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

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

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

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

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

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

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

    邊緣計算中的機器學習:基于 Linux 系統的實時推理模型部署與工業集成!

    學習如何訓練模型、導出模型,并在基于Linux的系統上運行實時推理,并通過MQTT發布結果。這是一個簡單但完整的流程——從工作站上的建模到在邊緣設備上運行工業風格
    的頭像 發表于 06-11 17:22 ?997次閱讀
    邊緣計算中的機器學習:基于 <b class='flag-5'>Linux</b> 系統的實時推理<b class='flag-5'>模型</b>部署與工業集成!

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

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

    FA模型訪問Stage模型DataShareExtensionAbility說明

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

    KaihongOS操作系統FA模型與Stage模型介紹

    FA模型與Stage模型介紹 KaihongOS操作系統中,FA模型(Feature Ability)和Stage模型是兩不同的應用
    發表于 04-24 07:27

    請問如何在imx8mplus上部署和運行YOLOv5訓練的模型

    我正在從事 imx8mplus yocto 項目。我已經在自定義數據集上的 YOLOv5 上訓練了對象檢測模型。它在 ubuntu 電腦上運行良好。現在我想在我的 imx8mplus 板上運行該模型
    發表于 03-25 07:23