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

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

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

3天內不再提示

【i.MX6ULL】驅動開發9——Linux I/O模型分析并進來類比

碼農愛學習 ? 來源:碼農愛學習 ? 作者:碼農愛學習 ? 2022-05-26 09:05 ? 次閱讀

前面兩篇介紹按鍵的文章,無論是用GPIO來讀取,還是用中斷的方式,其應用程序通過循環讀取的方式獲取按鍵值,都會使得CPU的占用率很高。本篇先來介紹Linux中幾種的I/O模型,以后使用這類方式進行按鍵值的讀取,可以極大降低CPU的使用率。

1 Linux中的I/O模型

這里以網絡I/O為例進行分析,網絡IO的本質是socket的讀取,socket在linux系統被抽象為流,對于一次IO訪問,以read為例,當一個read操作發生時,它會經歷兩個階段:

等待數據準備 (Waiting for the data to be ready)

將數據從內核拷貝到進程中 (Copying the data from the kernel to the process)

網絡I/O的模型,可以分為五種,這里先分類列出:

pYYBAGKOSqSASDN6AACJ9PwMXcs037.png

2 五種I/O模型分析

2.1 阻塞式I/O模型

阻塞式I/O模型是最常用、最簡單的模型。阻塞就是進程被休息, CPU處理其它進程去了。

應用程序進行recefrom系統調用,操作系統收到recefrom系統調用請求,經過兩個階段:

等待數據準備好

內核將數據從內核緩沖區復制到用戶緩沖區

這兩個階段完成后調用返回,應用程序解除阻塞

poYBAGKOSq2AAMoKAAHyp_gqMGE018.png

2.2 非阻塞式I/O模型

非阻塞就是輪詢的方式,在這種模型中, I/O操作不會立即完成,recefrom操作可能會返回一個錯誤代碼,說明這個命令不能立即滿足。

對于第一個階段:

等待數據準備好

在這個階段系統調用會立刻返回一個錯誤狀態,不會阻塞,應用程序需要不斷輪詢,直到內核緩沖區數據準備好

對于第二個階段:

內核將數據從內核緩沖區拷貝到用戶緩沖區

這個階段應用程序的調用會被阻塞,直到拷貝完成,應用程序的系統調用返回。

pYYBAGKOSrWAUg0mAANTbNQJfAc286.png

2.3 I/O復用模型

由于非阻塞I/O方式需要不斷輪詢,會消耗大量的CPU時間,而后臺又可能有多個任務在同時輪詢,為此,人們就想到了一種方式:循環查詢多個任務的完成狀態,只要有任何一個任務完成,就去處理它。

IO多路復用有兩個特別的系統調用select、poll

select可以等待多個socket,能實現同時對多個IO端口進行監聽,當其中任何一個socket的數據準好了,就能返回進行可讀,然后進程再進行recvform系統調用,將數據由內核拷貝到用戶進程,這個過程是阻塞的。

pYYBAGKOSryAOrhdAAM9xQ4USq4878.png

2.4 信號驅動式I/O模型

應該程序進行Read系統調用,進程繼續運行不會阻塞,立即返回,等待內核緩沖區數據準備好后,通過SIGIO信號通知應用程序,應用程序再進行Read系統調用,內核將內核緩沖區中的數據拷貝到用戶緩沖區,調用完成。

pYYBAGKOSsOAXnU-AALULi-Hvlo252.png

2.5 異步I/O模型

相對于同步IO,異步IO不是順序執行。用戶進程進行aio_read系統調用之后,無論內核數據是否準備好,都會直接返回給用戶進程,然后用戶態進程可以去做別的事情。等到socket數據準備好了,內核直接復制數據給進程,然后從內核向進程發送通知。IO兩個階段,進程都是非阻塞的

pYYBAGKOSsqAcEXGAAIuiv9GPbQ941.png

3 模型對比

3.1 阻塞I/O與非阻塞I/O對比

簡單理解為需要做一件事能不能立即得到返回應答,如果不能立即獲得返回,需要等待,那就阻塞了,否則就可以理解為非阻塞。詳細區別如下圖所示:

pYYBAGKOStKASMagAABRY-knMlQ399.png

3.2 同步I/O與異步I/O對比

實際上同步與異步是針對應用程序內核的交互而言的。

同步過程中進程觸發IO操作并等待或者輪詢的去查看IO操作是否完成。

異步過程中進程觸發IO操作以后,直接返回,做自己的事情,IO交給內核來處理,完成后內核通知進程IO完成。

同步與異步如下圖所示:

poYBAGKOStmALg6jAAApIKov2tA307.png

對于Liunx的五種I/O模型,其實主要在等待數據和數據復制這兩個時間段不同。

pYYBAGKOSuCASWPTAAOYfSyT4SA440.png

4 各種I/O模型的生活場景式類比

4.1 類比1-飯店點菜

我們去餐廳吃飯,會經過以下幾個步驟:首先根據菜單點菜,然后等待廚房準備好,接著服務員上菜。在這個場景中,等待廚房準備菜肴等同于等待數據,服務員上菜等同于將數據從內核復制到用戶空間,你就是用戶態進程了,服務員和飯店看作是內核態的進程。

阻塞式I/O模型:只點一個菜,然后在餐桌上開始等待,在這個過程中什么事都不干,等服務員把菜上到桌子上之后才開始大快朵頤。

非阻塞式I/O模型:只點一個菜,然后開始等待,啥事都不做,等了一會兒然后就去問服務員,“我的菜好了嗎?”,沒好接著等待,過了一會兒然后又跑去問....重復這個過程,直到服務員說“親,你的菜好了,我現在給您送桌上去”,然后你坐在桌子上,等待服務員把飯菜送到你的餐桌上,才開始吃飯。

I/O復用模型:你點了很多菜,然后開始等待,某個時刻其中一個菜或者多個菜廚房里同時好了,服務員跑過來說,“親,您的有些菜好了,要現在上桌么?”, 你回答,現在就上,于是服務員上一個菜(服務員一次只能上一個菜),你就吃完一個,上一個你就吃完一個。。。

信號驅動式I/O模型:只點一個菜,然后給服務員留下手機,告訴他菜準備好了打個電話給你,先不要上菜,然后你就出去玩耍了,等到菜好了,服務員手機通知你,你立馬回到了餐廳,對服務員說“你現在可以上菜了”,于是你在餐桌上等待服務員把菜送上來,然后吃飯。

異步I/O模型:只點一個菜,然后給服務員留下手機,告訴他菜準備好了先上菜,菜上桌了打電話給你,然后你就出去玩耍了,等到菜上桌了,服務員手機通知你,你立馬回到了餐桌,開始吃飯。

該例子出自: https://segmentfault.com/a/1190000016359495

4.2 類比2-釣魚

有A,B,C,D四個人在釣魚。

阻塞式I/O模型:A用的是最老式的魚竿,所以呢,得一直守著,等到魚上鉤了再拉桿;

非阻塞式I/O模型:B的魚竿有個功能,能夠顯示是否有魚上鉤,所以呢,B就和旁邊的MM聊天,隔會再看看有沒有魚上鉤,有的話就迅速拉桿;

I/O復用模型:C用的魚竿和B差不多,但他想了一個好辦法,就是同時放好幾根魚竿,然后守在旁邊,一旦有顯示說魚上鉤了,它就將對應的魚竿拉起來;

異步I/O模型:D是個有錢人,干脆雇了一個人幫他釣魚,一旦那個人把魚釣上來了,就給D發個短信。

該例子出自: https://blog.csdn.net/historyasamirror/article/details/5778378

4.3 類比3-銀行存錢匯款

阻塞式I/O模型:你去一個銀行柜臺存錢。首先,你會將存錢的單子填好,交給柜員,之后,你就坐在柜臺前等。柜員辦好以后會給你一個回執,表示辦好了,然后你就可以拿著回執干其它的事了。注意,這時如果你馬上去查賬,存的錢已經打到你的賬戶上了。

非阻塞式I/O模型:這次不是去銀行存錢,而是去銀行匯款。同樣的,你也需要填寫匯款單然后交給柜員,柜員進行一些簡單的手續處理就能夠給你回執。但是,你拿到回執并不意味著錢已經打到了對方的賬上。事實上,一般匯款的周期大概是24個小時左右,如果你要以存錢的模式來匯款的話,意味著你需要在銀行等24個小時,這顯然是不現實的。

I/O復用模型:比如說一個銀行柜臺,現在有10個人想存錢。這10個人都填好存款單,然后都提交給柜臺,提交完之后所有的10個人就在銀行大廳等待。這時候會專門有個人,他會了解存款單處理的情況,一旦有存款單處理完畢,他會將回執交給相應的正在大廳等待的人,這個拿到回執的人就可以去干其他的事情了。而前面提到的這個專人,就對應于select函數。

異步I/O模型:現在某銀行新開通了一項存錢業務。用戶之需要將存款單交給柜臺,然后無需等待就可以離開了。柜臺辦好以后會給用戶發送一條短信,告知交易成功。這樣用戶不需要在柜臺前進行長時間的等待,同時,也能夠得到確切的消息知道交易完成。

該例子出自: https://blog.csdn.net/historyasamirror/article/details/4270633

5 總結

本篇介紹了Linux中的五種I/O模型:阻塞式I/O模型、非阻塞式I/O模型、I/O復用模型、信號驅動式I/O模型、異步I/O模型,并通過生活中實際的場景進來類比。

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

    關注

    5087

    文章

    19148

    瀏覽量

    306156
  • Linux
    +關注

    關注

    87

    文章

    11322

    瀏覽量

    209857
  • GPIO
    +關注

    關注

    16

    文章

    1212

    瀏覽量

    52182
  • i.MX6
    +關注

    關注

    1

    文章

    37

    瀏覽量

    16322
收藏 人收藏

    評論

    相關推薦

    【迅為電子】i.MX6UL和i.MX6ULL芯片區別與開發板對比

    【迅為電子】i.MX6UL和i.MX6ULL芯片區別與開發板對比
    的頭像 發表于 11-28 14:31 ?469次閱讀
    【迅為電子】<b class='flag-5'>i.MX6</b>UL和<b class='flag-5'>i.MX6ULL</b>芯片區別與<b class='flag-5'>開發</b>板對比

    【新品】i.MX6ULL工業嵌入式核心板!NXP低功耗MPU,LCD顯示

    核心板新品上市ECK20-6Y2XA系列核心板是億佰特基于NXPCortex-A7內核i.MX6ULL處理器精心設計的,采用郵票孔連接的低成本、低功耗、高性價比、高可靠性的嵌入式核心板。可廣泛應用于工業控制、HMI、IoT等領域。
    的頭像 發表于 11-15 01:04 ?256次閱讀
    【新品】<b class='flag-5'>i.MX6ULL</b>工業嵌入式核心板!NXP低功耗MPU,LCD顯示

    i.MX Linux開發實戰指南—基于野火i.MX系列開發

    電子發燒友網站提供《i.MX Linux開發實戰指南—基于野火i.MX系列開發板.pdf》資料免費下載
    發表于 10-10 17:23 ?11次下載

    在NXP源碼基礎上如何適配ELF 1開發板的UART功能

    UART即通用異步收發器,是一種支持全雙工串行通信協議的接口。在i.MX6ULL處理器平臺上,該處理器原生支持多達8路的UART接口,提供了豐富的串行通信能力。 針對ELF 1開發板,實際引出了4路
    的頭像 發表于 09-29 11:49 ?385次閱讀
    在NXP源碼基礎上如何適配ELF 1<b class='flag-5'>開發</b>板的UART功能

    使用TPS6521815 PMIC為NXP i.MX 6ULL6UltraLite供電

    電子發燒友網站提供《使用TPS6521815 PMIC為NXP i.MX 6ULL6UltraLite供電.pdf》資料免費下載
    發表于 09-13 09:44 ?1次下載
    使用TPS6521815 PMIC為NXP <b class='flag-5'>i.MX</b> <b class='flag-5'>6ULL</b>、<b class='flag-5'>6</b>UltraLite供電

    如何在NXP源碼基礎上適配ELF 1開發板的PWM功能

    本次源碼適配項目是在NXP i.MX6ULL EVK評估板所搭載的Linux內核源碼(版本為Linux-imx_4.1.15)基礎上進行的,主要目標是通過調整功能接口引腳配置,使其適應ELF 1
    的頭像 發表于 09-10 10:00 ?961次閱讀
    如何在NXP源碼基礎上適配ELF 1<b class='flag-5'>開發</b>板的PWM功能

    【正點原子i.MX93開發板試用連載體驗】01 - 開箱報告

    前言 感謝正點原子和電子發燒友論壇提供的這次機會讓我有機會體驗正點原子i.MX93開發板,奔著正點名字的教程齊全來的,希望可以借這個機會好好學習一下。 開箱 包裝還是挺精致的,好評。 板子
    發表于 06-27 21:53

    Linux平臺移植音頻芯片實戰記錄

    本文詳細記錄在NXP I.MX6ULL+Linux平臺下進行WM8960音頻芯片移植的過程,其他平臺操作方法類似,希望為大家提供幫助。
    的頭像 發表于 05-17 14:28 ?1116次閱讀
    <b class='flag-5'>Linux</b>平臺移植音頻芯片實戰記錄

    淺析在NXP I.MX6ULL+Linux平臺下進行WM8960音頻芯片移植的過程

    本文詳細記錄在NXP I.MX6ULL+Linux平臺下進行WM8960音頻芯片移植的過程,其他平臺操作方法類似,希望為大家提供幫助。
    的頭像 發表于 05-17 11:33 ?1349次閱讀
    淺析在NXP <b class='flag-5'>I.MX6ULL+Linux</b>平臺下進行WM8960音頻芯片移植的過程

    正點原子i.MX93開發

    我計劃申請正點原子i.MX93開發板,因為我希望利用其強大的NXP i.MX9352處理器進行中高端嵌入式Linux開發。這款處理器具備雙核
    發表于 05-16 14:57

    米爾NXP i.MX 93開發板限量6折!賦能入門級邊緣處理市場

    NXP在處理器板塊耕耘多年,從早期的i.MX6i.MX7→i.MX8,再到最新的i.MX9都已經有一條完整的生態鏈以及很多客戶基礎。i.MX
    的頭像 發表于 04-29 08:01 ?587次閱讀
    米爾NXP <b class='flag-5'>i.MX</b> 93<b class='flag-5'>開發</b>板限量<b class='flag-5'>6</b>折!賦能入門級邊緣處理市場

    基于飛凌嵌入式i.MX6ULL核心板的電梯智能物聯網關方案

    使用飛凌嵌入式FETMX6ULL-S核心板作為智能電梯物聯網關的主控平臺,為智能電梯的變革提供了強有力的技術支持。
    的頭像 發表于 03-22 10:45 ?1566次閱讀
    基于飛凌嵌入式<b class='flag-5'>i.MX6ULL</b>核心板的電梯智能物聯網關方案

    適用于 NXP i.MX 6ULL6ULZ 和 6UltraLite的TPS6521835電源管理IC數據表

    電子發燒友網站提供《適用于 NXP i.MX 6ULL6ULZ 和 6UltraLite的TPS6521835電源管理IC數據表.pdf》資料免費下載
    發表于 03-01 09:10 ?0次下載
    適用于 NXP <b class='flag-5'>i.MX</b> <b class='flag-5'>6ULL</b>、<b class='flag-5'>6</b>ULZ 和 <b class='flag-5'>6</b>UltraLite的TPS6521835電源管理IC數據表

    嵌入式學習-ElfBoard ELF 1-gpio模擬i2c的方法

    /linux-4.1.15-elf1$ make zImage 二、設備樹修改設備樹路徑:linux-4.1.15-elf1/arch/arm/boot/dts/imx6ull-elf1-emmc.dts(1)將
    發表于 02-22 15:17

    FANUC外部I/O點數不夠用了怎么辦?可以擴展I/O點數嗎?

    FANUC外部I/O點數不夠用了怎么辦?可以擴展I/O點數嗎? 擴展FANUC的外部I/O點數是
    的頭像 發表于 02-18 15:21 ?1976次閱讀
    主站蜘蛛池模板: 一本到2019线观看| 亚洲国产在线精品第二剧情不卡| 骚妇BB双飞插| 970女主播电台歌曲| 久久这里只有精品2| 亚洲乱码爆乳精品成人毛片| 国产毛片女人高潮叫声| 我的好妈妈BD免费观看| 国产精品禁18久久久夂久| 四虎永久免费| 国产免费人成在线视频有码 | 成 人 免费 黄 色 网站无毒下载| 明星三级电影| 边做边爱BD免费看片| 破女在线观看视频| 成人精品视频| 忘忧草下载| 教室眠催白丝美女校花| 在线看片福利无码网址| 蜜臀AV999无码精品国产| videossexo乌克兰| 视频一区亚洲视频无码| 国产自产第一区c国产| 亚洲在线v观看免费国| 久久只精品99品免费久| 99亚洲精品色情无码久久| 色戒未删减版在线观看完整| 国产精品嫩草免费视频| 亚洲三级在线看| 奶水四溅54p| 第四色男人天堂| 亚洲精品久久久一区| 久久精品亚洲AV无码三区观看| 99麻豆精品国产人妻无码| 日日噜噜噜夜夜爽爽狠狠图片| 国产午夜不卡在线观看视频666| 亚洲偷自拍精品视频在线观看 | 国产午夜人做人免费视频中文| 影音先锋 av天堂| 欧美黑白配性xxxxx| 国产精品自拍|