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模型,并通过生活中实际的场景进来类比。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5209

    文章

    20629

    浏览量

    336793
  • Linux
    +关注

    关注

    88

    文章

    11810

    浏览量

    219513
  • GPIO
    +关注

    关注

    16

    文章

    1333

    浏览量

    56430
  • i.MX6
    +关注

    关注

    1

    文章

    37

    浏览量

    16795
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    i.MX6ULL能否接受来自外部振荡器的直接50 MHz输入?

    我们正在将 LAN8710A-EZK PHY 与 RMII 模式下的 i.MX6ULL 集成,需要澄清有关 50 MHz 参考时钟的信息。 由于RMII需要50 MHz时钟,i.MX6ULL能否接受
    发表于 04-17 06:05

    开发一个基于运行 Yocto 的 i.MX6ULL 的定制板,如何减少启动时间?

    我正在开发一个基于运行 Yocto 的 i.MX6ULL 的定制板,我想尽可能减少启动时间。 到目前为止,我已经: 禁用内核中所有不必要的选项 (menuconfig) 将 Yocto 图像减少到
    发表于 04-16 08:26

    i.MX 6ULL之后:2026年入门工控平台,TI AM62x与STM32MP1谁主沉浮?

    做一个带 7 寸屏的工业仪器、充电桩显示屏或简易网关,NXP i.MX 6ULL 是闭眼选的标准答案。
    的头像 发表于 01-27 15:15 607次阅读

    FRDM-i.MX 91开发板刷机指南

    FRDM-i.MX 91开发板刷机指南 在电子开发领域,开发板的刷机操作是一项基础且关键的技能。今天,我们就来详细探讨NXP的FRDM-i.MX
    的头像 发表于 12-24 11:30 1105次阅读

    FRDM i.MX 9平台选型指南:FRDM i.MX 9系列开发平台解析

    FRDM i.MX 9系列开发平台的入门级产品 FRDM i.MX 9系列概述 恩智浦FRDM i.MX
    的头像 发表于 12-11 15:15 5w次阅读
    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'>开发</b>平台解析

    既要稳定性,还要性价比的工业级开发板 — 米尔i.MX91

    之前我介绍过NXPi.MX8系列的开发板,最近它的下一代产品i.MX9系列产品也有了,我就拿到了这个基于NXPi.MX9系列的米尔MYD-LMX91
    的头像 发表于 11-20 08:05 2665次阅读
    既要稳定性,还要性价比的工业级<b class='flag-5'>开发</b>板 — 米尔<b class='flag-5'>i.MX</b>91

    简单认识NXP FRDM i.MX 93开发

    FRDM i.MX 93开发板是一款入门级、紧凑型开发板,采用i.MX93应用处理器。该板配备板载IW612模块,集成了恩智浦的三频解决方案,支持Wi-Fi
    的头像 发表于 11-17 09:45 1720次阅读
    简单认识NXP FRDM <b class='flag-5'>i.MX</b> 93<b class='flag-5'>开发</b>板

    【米尔NXP i.MX 91开发板评测】移植和运行RT-Linux,实时性能测试

    介绍 实时性系统应用广泛,在工业自动化、医疗设备、汽车电子等领域扮演着十分重要的角色,我们用i.MX91开发板来移植运行RT-Linux,看看它的实时性能表现如何 实时补丁 下载并应用RT补丁
    发表于 09-01 10:11

    瑞芯微RK3506 vs NXP i.MX6ULL

    NXPi.MX6ULL核心板进行多方面对比。性能与能效对比性能优势对比:RK3506在接口方面比i.MX6ULL少2个UART,其他性能方面,RK3506以三核A7(1.
    的头像 发表于 06-19 16:26 1528次阅读
    瑞芯微RK3506 vs NXP <b class='flag-5'>i.MX6ULL</b>

    618盛夏狂欢,米尔电子携手恩智浦开启年度技术盛宴!

    即日起-2025.06.30,米尔恩智浦多系列开发板限时折扣!米尔基于i.MX91、i.MX93、i.MX8MPlus、i.MX6UL/
    的头像 发表于 06-13 08:03 1017次阅读
    618盛夏狂欢,米尔电子携手恩智浦开启年度技术盛宴!

    米尔NXP i.MX 91核心板发布,助力新一代入门级Linux应用开发

    本帖最后由 blingbling111 于 2025-5-30 16:17 编辑 米尔电子基于与NXP长期合作的嵌入式处理器开发经验,在i.MX 6i.MX 8系列核心板领域已
    发表于 05-30 11:20

    5分钟学会网络服务搭建,飞凌i.MX9352 + Linux 6.1实战示例

    本文将以飞凌嵌入式OK-MX9352-C开发板(搭载了在工业物联网领域广泛应用的NXP i.MX9352处理器)为平台,介绍如何在Linux6.1.36
    的头像 发表于 05-30 11:08 2517次阅读
    5分钟学会网络服务搭建,飞凌<b class='flag-5'>i.MX</b>9352 + <b class='flag-5'>Linux</b> 6.1实战示例

    新品!米尔NXP i.MX 91核心板,赋能新一代入门级Linux应用

    米尔电子基于与NXP长期合作的嵌入式处理器开发经验,在i.MX6i.MX8系列核心板领域已形成完整产品矩阵,米尔累计推出5个平台共计二十余款NXP核心板,涵盖工业物联网、新能源、医疗等领域。此次
    的头像 发表于 05-29 08:01 3066次阅读
    新品!米尔NXP <b class='flag-5'>i.MX</b> 91核心板,赋能新一代入门级<b class='flag-5'>Linux</b>应用

    NXP i.MX 91开发板#支持快速创建基于Linux®的边缘器件

    NXP Semiconductors FRDM i.MX 91开发板设计用于评估i.MX 91应用处理器,支持快速创建基于Linux ^®^ 的边缘器件。该
    的头像 发表于 05-19 10:55 3360次阅读
    NXP <b class='flag-5'>i.MX</b> 91<b class='flag-5'>开发</b>板#支持快速创建基于<b class='flag-5'>Linux</b>®的边缘器件

    ECB20-PG6Y28C-I 单板机深度测评报告 ——工业级嵌入式开发的强力助手

    ECB20-PG6Y28C-I 是成都亿佰特电子科技基于 i.MX6ULL 处理器推出的工业级测试底板,搭配 ECK20-6Y28C 系列核心板,专为高性能嵌入式场景设计。其核心亮点在于 双网口、多接口扩展能力 和 工业级可靠性
    的头像 发表于 04-22 11:49 1370次阅读