一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

【i.MX6ULL】驅(qū)動(dòng)開(kāi)發(fā)9——Linux I/O模型分析并進(jìn)來(lái)類比

碼農(nóng)愛(ài)學(xué)習(xí) ? 來(lái)源:碼農(nóng)愛(ài)學(xué)習(xí) ? 作者:碼農(nóng)愛(ài)學(xué)習(xí) ? 2022-05-26 09:05 ? 次閱讀

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

1 Linux中的I/O模型

這里以網(wǎng)絡(luò)I/O為例進(jìn)行分析,網(wǎng)絡(luò)IO的本質(zhì)是socket的讀取,socket在linux系統(tǒng)被抽象為流,對(duì)于一次IO訪問(wèn),以read為例,當(dāng)一個(gè)read操作發(fā)生時(shí),它會(huì)經(jīng)歷兩個(gè)階段:

等待數(shù)據(jù)準(zhǔn)備 (Waiting for the data to be ready)

將數(shù)據(jù)從內(nèi)核拷貝到進(jìn)程中 (Copying the data from the kernel to the process)

網(wǎng)絡(luò)I/O的模型,可以分為五種,這里先分類列出:

pYYBAGKOSqSASDN6AACJ9PwMXcs037.png

2 五種I/O模型分析

2.1 阻塞式I/O模型

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

應(yīng)用程序進(jìn)行recefrom系統(tǒng)調(diào)用,操作系統(tǒng)收到recefrom系統(tǒng)調(diào)用請(qǐng)求,經(jīng)過(guò)兩個(gè)階段:

等待數(shù)據(jù)準(zhǔn)備好

內(nèi)核將數(shù)據(jù)從內(nèi)核緩沖區(qū)復(fù)制到用戶緩沖區(qū)

這兩個(gè)階段完成后調(diào)用返回,應(yīng)用程序解除阻塞。

poYBAGKOSq2AAMoKAAHyp_gqMGE018.png

2.2 非阻塞式I/O模型

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

對(duì)于第一個(gè)階段:

等待數(shù)據(jù)準(zhǔn)備好

在這個(gè)階段系統(tǒng)調(diào)用會(huì)立刻返回一個(gè)錯(cuò)誤狀態(tài),不會(huì)阻塞,應(yīng)用程序需要不斷輪詢,直到內(nèi)核緩沖區(qū)數(shù)據(jù)準(zhǔn)備好

對(duì)于第二個(gè)階段:

內(nèi)核將數(shù)據(jù)從內(nèi)核緩沖區(qū)拷貝到用戶緩沖區(qū)

這個(gè)階段應(yīng)用程序的調(diào)用會(huì)被阻塞,直到拷貝完成,應(yīng)用程序的系統(tǒng)調(diào)用返回。

pYYBAGKOSrWAUg0mAANTbNQJfAc286.png

2.3 I/O復(fù)用模型

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

IO多路復(fù)用有兩個(gè)特別的系統(tǒng)調(diào)用select、poll

select可以等待多個(gè)socket,能實(shí)現(xiàn)同時(shí)對(duì)多個(gè)IO端口進(jìn)行監(jiān)聽(tīng),當(dāng)其中任何一個(gè)socket的數(shù)據(jù)準(zhǔn)好了,就能返回進(jìn)行可讀,然后進(jìn)程再進(jìn)行recvform系統(tǒng)調(diào)用,將數(shù)據(jù)由內(nèi)核拷貝到用戶進(jìn)程,這個(gè)過(guò)程是阻塞的。

pYYBAGKOSryAOrhdAAM9xQ4USq4878.png

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

應(yīng)該程序進(jìn)行Read系統(tǒng)調(diào)用,進(jìn)程繼續(xù)運(yùn)行不會(huì)阻塞,立即返回,等待內(nèi)核緩沖區(qū)數(shù)據(jù)準(zhǔn)備好后,通過(guò)SIGIO信號(hào)通知應(yīng)用程序,應(yīng)用程序再進(jìn)行Read系統(tǒng)調(diào)用,內(nèi)核將內(nèi)核緩沖區(qū)中的數(shù)據(jù)拷貝到用戶緩沖區(qū),調(diào)用完成。

pYYBAGKOSsOAXnU-AALULi-Hvlo252.png

2.5 異步I/O模型

相對(duì)于同步IO,異步IO不是順序執(zhí)行。用戶進(jìn)程進(jìn)行aio_read系統(tǒng)調(diào)用之后,無(wú)論內(nèi)核數(shù)據(jù)是否準(zhǔn)備好,都會(huì)直接返回給用戶進(jìn)程,然后用戶態(tài)進(jìn)程可以去做別的事情。等到socket數(shù)據(jù)準(zhǔn)備好了,內(nèi)核直接復(fù)制數(shù)據(jù)給進(jìn)程,然后從內(nèi)核向進(jìn)程發(fā)送通知。IO兩個(gè)階段,進(jìn)程都是非阻塞的。

pYYBAGKOSsqAcEXGAAIuiv9GPbQ941.png

3 模型對(duì)比

3.1 阻塞I/O與非阻塞I/O對(duì)比

簡(jiǎn)單理解為需要做一件事能不能立即得到返回應(yīng)答,如果不能立即獲得返回,需要等待,那就阻塞了,否則就可以理解為非阻塞。詳細(xì)區(qū)別如下圖所示:

pYYBAGKOStKASMagAABRY-knMlQ399.png

3.2 同步I/O與異步I/O對(duì)比

實(shí)際上同步與異步是針對(duì)應(yīng)用程序內(nèi)核的交互而言的。

同步過(guò)程中進(jìn)程觸發(fā)IO操作并等待或者輪詢的去查看IO操作是否完成。

異步過(guò)程中進(jìn)程觸發(fā)IO操作以后,直接返回,做自己的事情,IO交給內(nèi)核來(lái)處理,完成后內(nèi)核通知進(jìn)程IO完成。

同步與異步如下圖所示:

poYBAGKOStmALg6jAAApIKov2tA307.png

對(duì)于Liunx的五種I/O模型,其實(shí)主要在等待數(shù)據(jù)和數(shù)據(jù)復(fù)制這兩個(gè)時(shí)間段不同。

pYYBAGKOSuCASWPTAAOYfSyT4SA440.png

4 各種I/O模型的生活場(chǎng)景式類比

4.1 類比1-飯店點(diǎn)菜

我們?nèi)ゲ蛷d吃飯,會(huì)經(jīng)過(guò)以下幾個(gè)步驟:首先根據(jù)菜單點(diǎn)菜,然后等待廚房準(zhǔn)備好,接著服務(wù)員上菜。在這個(gè)場(chǎng)景中,等待廚房準(zhǔn)備菜肴等同于等待數(shù)據(jù),服務(wù)員上菜等同于將數(shù)據(jù)從內(nèi)核復(fù)制到用戶空間,你就是用戶態(tài)進(jìn)程了,服務(wù)員和飯店看作是內(nèi)核態(tài)的進(jìn)程。

阻塞式I/O模型:只點(diǎn)一個(gè)菜,然后在餐桌上開(kāi)始等待,在這個(gè)過(guò)程中什么事都不干,等服務(wù)員把菜上到桌子上之后才開(kāi)始大快朵頤。

非阻塞式I/O模型:只點(diǎn)一個(gè)菜,然后開(kāi)始等待,啥事都不做,等了一會(huì)兒然后就去問(wèn)服務(wù)員,“我的菜好了嗎?”,沒(méi)好接著等待,過(guò)了一會(huì)兒然后又跑去問(wèn)....重復(fù)這個(gè)過(guò)程,直到服務(wù)員說(shuō)“親,你的菜好了,我現(xiàn)在給您送桌上去”,然后你坐在桌子上,等待服務(wù)員把飯菜送到你的餐桌上,才開(kāi)始吃飯。

I/O復(fù)用模型:你點(diǎn)了很多菜,然后開(kāi)始等待,某個(gè)時(shí)刻其中一個(gè)菜或者多個(gè)菜廚房里同時(shí)好了,服務(wù)員跑過(guò)來(lái)說(shuō),“親,您的有些菜好了,要現(xiàn)在上桌么?”, 你回答,現(xiàn)在就上,于是服務(wù)員上一個(gè)菜(服務(wù)員一次只能上一個(gè)菜),你就吃完一個(gè),上一個(gè)你就吃完一個(gè)。。。

信號(hào)驅(qū)動(dòng)式I/O模型:只點(diǎn)一個(gè)菜,然后給服務(wù)員留下手機(jī),告訴他菜準(zhǔn)備好了打個(gè)電話給你,先不要上菜,然后你就出去玩耍了,等到菜好了,服務(wù)員手機(jī)通知你,你立馬回到了餐廳,對(duì)服務(wù)員說(shuō)“你現(xiàn)在可以上菜了”,于是你在餐桌上等待服務(wù)員把菜送上來(lái),然后吃飯。

異步I/O模型:只點(diǎn)一個(gè)菜,然后給服務(wù)員留下手機(jī),告訴他菜準(zhǔn)備好了先上菜,菜上桌了打電話給你,然后你就出去玩耍了,等到菜上桌了,服務(wù)員手機(jī)通知你,你立馬回到了餐桌,開(kāi)始吃飯。

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

4.2 類比2-釣魚(yú)

有A,B,C,D四個(gè)人在釣魚(yú)。

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

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

I/O復(fù)用模型:C用的魚(yú)竿和B差不多,但他想了一個(gè)好辦法,就是同時(shí)放好幾根魚(yú)竿,然后守在旁邊,一旦有顯示說(shuō)魚(yú)上鉤了,它就將對(duì)應(yīng)的魚(yú)竿拉起來(lái);

異步I/O模型:D是個(gè)有錢人,干脆雇了一個(gè)人幫他釣魚(yú),一旦那個(gè)人把魚(yú)釣上來(lái)了,就給D發(fā)個(gè)短信。

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

4.3 類比3-銀行存錢匯款

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

非阻塞式I/O模型:這次不是去銀行存錢,而是去銀行匯款。同樣的,你也需要填寫(xiě)匯款單然后交給柜員,柜員進(jìn)行一些簡(jiǎn)單的手續(xù)處理就能夠給你回執(zhí)。但是,你拿到回執(zhí)并不意味著錢已經(jīng)打到了對(duì)方的賬上。事實(shí)上,一般匯款的周期大概是24個(gè)小時(shí)左右,如果你要以存錢的模式來(lái)匯款的話,意味著你需要在銀行等24個(gè)小時(shí),這顯然是不現(xiàn)實(shí)的。

I/O復(fù)用模型:比如說(shuō)一個(gè)銀行柜臺(tái),現(xiàn)在有10個(gè)人想存錢。這10個(gè)人都填好存款單,然后都提交給柜臺(tái),提交完之后所有的10個(gè)人就在銀行大廳等待。這時(shí)候會(huì)專門有個(gè)人,他會(huì)了解存款單處理的情況,一旦有存款單處理完畢,他會(huì)將回執(zhí)交給相應(yīng)的正在大廳等待的人,這個(gè)拿到回執(zhí)的人就可以去干其他的事情了。而前面提到的這個(gè)專人,就對(duì)應(yīng)于select函數(shù)。

異步I/O模型:現(xiàn)在某銀行新開(kāi)通了一項(xiàng)存錢業(yè)務(wù)。用戶之需要將存款單交給柜臺(tái),然后無(wú)需等待就可以離開(kāi)了。柜臺(tái)辦好以后會(huì)給用戶發(fā)送一條短信,告知交易成功。這樣用戶不需要在柜臺(tái)前進(jìn)行長(zhǎng)時(shí)間的等待,同時(shí),也能夠得到確切的消息知道交易完成。

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

5 總結(jié)

本篇介紹了Linux中的五種I/O模型:阻塞式I/O模型、非阻塞式I/O模型、I/O復(fù)用模型、信號(hào)驅(qū)動(dòng)式I/O模型、異步I/O模型,并通過(guò)生活中實(shí)際的場(chǎng)景進(jìn)來(lái)類比。

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

    關(guān)注

    5125

    文章

    19438

    瀏覽量

    313199
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11420

    瀏覽量

    212361
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1238

    瀏覽量

    53326
  • i.MX6
    +關(guān)注

    關(guān)注

    1

    文章

    37

    瀏覽量

    16479
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    ECB20-PG6Y28C-I 單板機(jī)深度測(cè)評(píng)報(bào)告 ——工業(yè)級(jí)嵌入式開(kāi)發(fā)的強(qiáng)力助手

    ECB20-PG6Y28C-I?是成都億佰特電子科技基于 i.MX6ULL 處理器推出的工業(yè)級(jí)測(cè)試底板,搭配 ECK20-6Y28C 系列核心板,專為高性能嵌入式場(chǎng)景設(shè)計(jì)。其核心亮點(diǎn)在于 雙網(wǎng)口、多接口擴(kuò)展能力?和 工業(yè)級(jí)可靠性
    的頭像 發(fā)表于 04-22 11:49 ?79次閱讀

    如何在i.MX6ULL睡眠時(shí)停止刷新LCD?

    為了更好的 EMC,我們需要在 i.MX6ULL 進(jìn)入睡眠狀態(tài)時(shí)停止 LCD 刷新。 能否實(shí)現(xiàn) ? 平臺(tái): i.MX6ULL 系統(tǒng): Linux
    發(fā)表于 04-03 07:14

    如何維護(hù)i.MX6ULL的安全內(nèi)核?

    為 5.15.158。 因此,我們想知道:是否有可能基于這個(gè) BSP 平臺(tái)實(shí)現(xiàn)安全的 i.MX 6ULL 系統(tǒng)?您會(huì)推薦上游的 linux-fslc 還是 linux-imx (BSP
    發(fā)表于 04-01 08:28

    如何在i.MX6ULL定制板上啟用IO Expander PCA6416A的控制?

    我想知道如何在 i.MX6ULL 定制板上啟用 IO Expander PCA6416A 的控制。 我嘗試修改 imx6ul-14x14-evk.dtsi,將 pca6416 節(jié)點(diǎn)添加到 i
    發(fā)表于 03-26 07:10

    NXP入門級(jí)Linux應(yīng)用開(kāi)發(fā)板,F(xiàn)RDM i.MX 91詳解

    FRDM平臺(tái)新品發(fā)布 FRDM i.MX 91開(kāi)發(fā)板是一款低成本、體積小巧的開(kāi)發(fā)板,集成了恩智浦i.MX 91應(yīng)用處理器和IW610 Wi-Fi 6
    的頭像 發(fā)表于 03-14 09:43 ?585次閱讀
    NXP入門級(jí)<b class='flag-5'>Linux</b>應(yīng)用<b class='flag-5'>開(kāi)發(fā)</b>板,F(xiàn)RDM <b class='flag-5'>i.MX</b> 91詳解

    GoPoint嵌入式開(kāi)發(fā)平臺(tái) 釋放i.MX潛力 簡(jiǎn)化Linux開(kāi)發(fā)

    GoPoint是一個(gè)以用戶為中心的平臺(tái),旨在釋放恩智浦i.MX微處理器的潛力,從而優(yōu)化基于i.MX應(yīng)用處理器的開(kāi)發(fā)。憑借豐富的交互式演示庫(kù)和強(qiáng)大的技術(shù)支持,GoPoint幫助開(kāi)發(fā)人員更
    發(fā)表于 02-28 10:07 ?444次閱讀
    GoPoint嵌入式<b class='flag-5'>開(kāi)發(fā)</b>平臺(tái) 釋放<b class='flag-5'>i.MX</b>潛力 簡(jiǎn)化<b class='flag-5'>Linux</b><b class='flag-5'>開(kāi)發(fā)</b>

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-開(kāi)發(fā)板適配之USB_OTG

    ,i.MX6ULL通過(guò)檢測(cè)TYPE C類型的插頭內(nèi)的CC引腳線的高低,來(lái)判斷自己是工作在host模式還是device模式,ELF 1開(kāi)發(fā)板直接將CC(TYPE C座的CC1和CC2還有檢測(cè)插入方向的功能
    發(fā)表于 02-28 09:29

    飛凌嵌入式ElfBoard ELF 1板卡-開(kāi)發(fā)板適配之USB_OTG

    ,i.MX6ULL通過(guò)檢測(cè)TYPE C類型的插頭內(nèi)的CC引腳線的高低,來(lái)判斷自己是工作在host模式還是device模式,ELF 1開(kāi)發(fā)板直接將CC(TYPE C座的CC1和CC2還有檢測(cè)插入方向的功能,這里不
    發(fā)表于 02-27 09:16

    I/O接口與I/O端口的區(qū)別

    在計(jì)算機(jī)系統(tǒng)中,I/O接口與I/O端口是實(shí)現(xiàn)CPU與外部設(shè)備數(shù)據(jù)交換的關(guān)鍵組件,它們?cè)诠δ堋⒔Y(jié)構(gòu)、作用及運(yùn)作機(jī)制上均存在顯著差異,卻又相互協(xié)同工作,共同構(gòu)建起CPU與外部設(shè)備之間的橋梁
    的頭像 發(fā)表于 02-02 16:00 ?862次閱讀

    【迅為電子】i.MX6UL和i.MX6ULL芯片區(qū)別與開(kāi)發(fā)板對(duì)比

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

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

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

    i.MX Linux開(kāi)發(fā)實(shí)戰(zhàn)指南—基于野火i.MX系列開(kāi)發(fā)

    電子發(fā)燒友網(wǎng)站提供《i.MX Linux開(kāi)發(fā)實(shí)戰(zhàn)指南—基于野火i.MX系列開(kāi)發(fā)板.pdf》資料免費(fèi)下載
    發(fā)表于 10-10 17:23 ?12次下載

    使用TPS6521815 PMIC為NXP i.MX 6ULL、6UltraLite供電

    電子發(fā)燒友網(wǎng)站提供《使用TPS6521815 PMIC為NXP i.MX 6ULL6UltraLite供電.pdf》資料免費(fèi)下載
    發(fā)表于 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源碼基礎(chǔ)上適配ELF 1開(kāi)發(fā)板的PWM功能

    本次源碼適配項(xiàng)目是在NXP i.MX6ULL EVK評(píng)估板所搭載的Linux內(nèi)核源碼(版本為Linux-imx_4.1.15)基礎(chǔ)上進(jìn)行的,主要目標(biāo)是通過(guò)調(diào)整功能接口引腳配置,使其適應(yīng)ELF 1
    的頭像 發(fā)表于 09-10 10:00 ?1109次閱讀
    如何在NXP源碼基礎(chǔ)上適配ELF 1<b class='flag-5'>開(kāi)發(fā)</b>板的PWM功能

    淺析在NXP I.MX6ULL+Linux平臺(tái)下進(jìn)行WM8960音頻芯片移植的過(guò)程

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