| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> 【i.MX6ULL】驱动开发9——Linux IO模型分析 -> 正文阅读 |
|
[系统运维]【i.MX6ULL】驱动开发9——Linux IO模型分析 |
前面两篇介绍按键的文章,无论是用GPIO来读取,还是用中断的方式,其应用程序通过循环读取的方式获取按键值,都会使得CPU的占用率很高。本篇先来介绍Linux中几种的I/O模型,以后使用这类方式进行按键值的读取,可以极大降低CPU的使用率。 1 Linux中的I/O模型这里以网络I/O为例进行分析,网络IO的本质是socket的读取,socket在linux系统被抽象为流,对于一次IO访问,以read为例,当一个read操作发生时,它会经历两个阶段:
网络I/O的模型,可以分为五种,这里先分类列出: 2 五种I/O模型分析2.1 阻塞式I/O模型阻塞式I/O模型是最常用、最简单的模型。阻塞就是进程被休息, CPU处理其它进程去了。 应用程序进行recefrom系统调用,操作系统收到recefrom系统调用请求,经过两个阶段:
这两个阶段完成后调用返回,应用程序解除阻塞。 2.2 非阻塞式I/O模型非阻塞就是轮询的方式,在这种模型中, I/O操作不会立即完成,recefrom操作可能会返回一个错误代码,说明这个命令不能立即满足。 对于第一个阶段:
在这个阶段系统调用会立刻返回一个错误状态,不会阻塞,应用程序需要不断轮询,直到内核缓冲区数据准备好 对于第二个阶段:
这个阶段应用程序的调用会被阻塞,直到拷贝完成,应用程序的系统调用返回。 2.3 I/O复用模型由于非阻塞I/O方式需要不断轮询,会消耗大量的CPU时间,而后台又可能有多个任务在同时轮询,为此,人们就想到了一种方式:循环查询多个任务的完成状态,只要有任何一个任务完成,就去处理它。 IO多路复用有两个特别的系统调用select、poll。 select可以等待多个socket,能实现同时对多个IO端口进行监听,当其中任何一个socket的数据准好了,就能返回进行可读,然后进程再进行recvform系统调用,将数据由内核拷贝到用户进程,这个过程是阻塞的。 2.4 信号驱动式I/O模型应该程序进行Read系统调用,进程继续运行不会阻塞,立即返回,等待内核缓冲区数据准备好后,通过SIGIO信号通知应用程序,应用程序再进行Read系统调用,内核将内核缓冲区中的数据拷贝到用户缓冲区,调用完成。 2.5 异步I/O模型相对于同步IO,异步IO不是顺序执行。用户进程进行aio_read系统调用之后,无论内核数据是否准备好,都会直接返回给用户进程,然后用户态进程可以去做别的事情。等到socket数据准备好了,内核直接复制数据给进程,然后从内核向进程发送通知。IO两个阶段,进程都是非阻塞的。 3 模型对比3.1 阻塞I/O与非阻塞I/O对比简单理解为需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了,否则就可以理解为非阻塞。详细区别如下图所示: 3.2 同步I/O与异步I/O对比实际上同步与异步是针对应用程序与内核的交互而言的。
同步与异步如下图所示: 对于Liunx的五种I/O模型,其实主要在等待数据和数据复制这两个时间段不同。 4 各种I/O模型的生活场景式类比4.1 类比1-饭店点菜我们去餐厅吃饭,会经过以下几个步骤:首先根据菜单点菜,然后等待厨房准备好,接着服务员上菜。在这个场景中,等待厨房准备菜肴等同于等待数据,服务员上菜等同于将数据从内核复制到用户空间,你就是用户态进程了,服务员和饭店看作是内核态的进程。
该例子出自: https://segmentfault.com/a/1190000016359495 4.2 类比2-钓鱼有A,B,C,D四个人在钓鱼。
该例子出自: https://blog.csdn.net/historyasamirror/article/details/5778378 4.3 类比3-银行存钱汇款
该例子出自: https://blog.csdn.net/historyasamirror/article/details/4270633 5 总结本篇介绍了Linux中的五种I/O模型:阻塞式I/O模型、非阻塞式I/O模型、I/O复用模型、信号驱动式I/O模型、异步I/O模型,并通过生活中实际的场景进来类比。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/16 2:56:50- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |