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

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

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

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

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

碼農(nóng)愛學(xué)習(xí) ? 來源:碼農(nóng)愛學(xué)習(xí) ? 作者:碼農(nóng)愛學(xué)習(xí) ? 2022-05-26 09:05 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

1 Linux中的I/O模型

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

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

將數(shù)據(jù)從內(nèi)核拷貝到進程中 (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模型是最常用、最簡單的模型。阻塞就是進程被休息, CPU處理其它進程去了。

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

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

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

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

poYBAGKOSq2AAMoKAAHyp_gqMGE018.png

2.2 非阻塞式I/O模型

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

對于第一個階段:

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

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

對于第二個階段:

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

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

pYYBAGKOSrWAUg0mAANTbNQJfAc286.png

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

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

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

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

pYYBAGKOSryAOrhdAAM9xQ4USq4878.png

2.4 信號驅(qū)動式I/O模型

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

pYYBAGKOSsOAXnU-AALULi-Hvlo252.png

2.5 異步I/O模型

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

pYYBAGKOSsqAcEXGAAIuiv9GPbQ941.png

3 模型對比

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

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

pYYBAGKOStKASMagAABRY-knMlQ399.png

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

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

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

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

同步與異步如下圖所示:

poYBAGKOStmALg6jAAApIKov2tA307.png

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

pYYBAGKOSuCASWPTAAOYfSyT4SA440.png

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

4.1 類比1-飯店點菜

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

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

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

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

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

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

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

4.2 類比2-釣魚

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

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

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

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

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

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

4.3 類比3-銀行存錢匯款

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

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

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

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

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

5 總結(jié)

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

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

    關(guān)注

    5198

    文章

    20442

    瀏覽量

    333971
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11758

    瀏覽量

    219006
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1328

    瀏覽量

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

    關(guān)注

    1

    文章

    37

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    i.MX 6ULL之后:2026年入門工控平臺,TI AM62x與STM32MP1誰主沉浮?

    做一個帶 7 寸屏的工業(yè)儀器、充電樁顯示屏或簡易網(wǎng)關(guān),NXP i.MX 6ULL 是閉眼選的標準答案。
    的頭像 發(fā)表于 01-27 15:15 ?221次閱讀

    FRDM i.MX 9平臺選型指南:FRDM i.MX 9系列開發(fā)平臺解析

    FRDM i.MX 9系列開發(fā)平臺的入門級產(chǎn)品 FRDM i.MX 9系列概述 恩智浦FRDM i.MX
    的頭像 發(fā)表于 12-11 15:15 ?3.2w次閱讀
    FRDM <b class='flag-5'>i.MX</b> <b class='flag-5'>9</b>平臺選型指南:FRDM <b class='flag-5'>i.MX</b> <b class='flag-5'>9</b>系列<b class='flag-5'>開發(fā)</b>平臺解析

    既要穩(wěn)定性,還要性價比的工業(yè)級開發(fā)板 — 米爾i.MX91

    之前我介紹過NXPi.MX8系列的開發(fā)板,最近它的下一代產(chǎn)品i.MX9系列產(chǎn)品也有了,我就拿到了這個基于NXPi.MX9系列的米爾MYD-LMX91
    的頭像 發(fā)表于 11-20 08:05 ?2044次閱讀
    既要穩(wěn)定性,還要性價比的工業(yè)級<b class='flag-5'>開發(fā)</b>板 — 米爾<b class='flag-5'>i.MX</b>91

    【米爾NXP i.MX 91開發(fā)板評測】移植和運行RT-Linux,實時性能測試

    介紹 實時性系統(tǒng)應(yīng)用廣泛,在工業(yè)自動化、醫(yī)療設(shè)備、汽車電子等領(lǐng)域扮演著十分重要的角色,我們用i.MX91開發(fā)板來移植運行RT-Linux,看看它的實時性能表現(xiàn)如何 實時補丁 下載并應(yīng)用RT補丁
    發(fā)表于 09-01 10:11

    瑞芯微RK3506 vs NXP i.MX6ULL

    NXPi.MX6ULL核心板進行多方面對比。性能與能效對比性能優(yōu)勢對比:RK3506在接口方面比i.MX6ULL少2個UART,其他性能方面,RK3506以三核A7(1.
    的頭像 發(fā)表于 06-19 16:26 ?1242次閱讀
    瑞芯微RK3506 vs NXP <b class='flag-5'>i.MX6ULL</b>

    618盛夏狂歡,米爾電子攜手恩智浦開啟年度技術(shù)盛宴!

    即日起-2025.06.30,米爾恩智浦多系列開發(fā)板限時折扣!米爾基于i.MX91、i.MX93、i.MX8MPlus、i.MX6UL/
    的頭像 發(fā)表于 06-13 08:03 ?900次閱讀
    618盛夏狂歡,米爾電子攜手恩智浦開啟年度技術(shù)盛宴!

    米爾NXP i.MX 91核心板發(fā)布,助力新一代入門級Linux應(yīng)用開發(fā)

    本帖最后由 blingbling111 于 2025-5-30 16:17 編輯 米爾電子基于與NXP長期合作的嵌入式處理器開發(fā)經(jīng)驗,在i.MX 6i.MX 8系列核心板領(lǐng)域已
    發(fā)表于 05-30 11:20

    新品!米爾NXP i.MX 91核心板,賦能新一代入門級Linux應(yīng)用

    米爾電子基于與NXP長期合作的嵌入式處理器開發(fā)經(jīng)驗,在i.MX6i.MX8系列核心板領(lǐng)域已形成完整產(chǎn)品矩陣,米爾累計推出5個平臺共計二十余款NXP核心板,涵蓋工業(yè)物聯(lián)網(wǎng)、新能源、醫(yī)療等領(lǐng)域。此次
    的頭像 發(fā)表于 05-29 08:01 ?2864次閱讀
    新品!米爾NXP <b class='flag-5'>i.MX</b> 91核心板,賦能新一代入門級<b class='flag-5'>Linux</b>應(yīng)用

    NXP i.MX 91開發(fā)板#支持快速創(chuàng)建基于Linux?的邊緣器件

    NXP Semiconductors FRDM i.MX 91開發(fā)板設(shè)計用于評估i.MX 91應(yīng)用處理器,支持快速創(chuàng)建基于Linux ^?^ 的邊緣器件。該
    的頭像 發(fā)表于 05-19 10:55 ?2862次閱讀
    NXP <b class='flag-5'>i.MX</b> 91<b class='flag-5'>開發(fā)</b>板#支持快速創(chuàng)建基于<b class='flag-5'>Linux</b>?的邊緣器件

    ECB20-PG6Y28C-I 單板機深度測評報告 ——工業(yè)級嵌入式開發(fā)的強力助手

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

    如何在i.MX6ULL睡眠時停止刷新LCD?

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

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

    為 5.15.158。 因此,我們想知道:是否有可能基于這個 BSP 平臺實現(xiàn)安全的 i.MX 6ULL 系統(tǒng)?您會推薦上游的 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é)點添加到 i
    發(fā)表于 03-26 07:10

    將Deepseek移植到i.MX 8MP|93 EVK的步驟

    顯示了 DeepSeek 模型運行期間 i.MX 的 CPU 和內(nèi)存使用情況。需要指出的是,CPU 效率會影響模型 Token 生成的速度。開發(fā)板的內(nèi)存大小限制了
    發(fā)表于 03-26 06:08

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

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