嵌入式开发之IO多路复用(一)

embedded/2024/11/29 15:09:12/

目录

1、IO模型和多路复用模型

1.1、阻塞I/O模式

1.1.1、读阻塞

1.1.2、写阻塞

1.2、非阻塞模式I/O

1.3、信号驱动I/O

1.4、多路复用I/O

1.4.1、IO多路复用步骤:

1.4.2、伪代码示例讲解


1、IO模型和多路复用模型

在UNIX、Linux下主要有4种I/O模型:

  • 阻塞I/O:  最常用
  • 非阻塞I/O:可防止进程阻塞在I/O操作上,需要沦陷
  • I/O多路复用:允许同时对多个I/O进行控制
  • 信号驱动I/O:一种异步通信模型

1.1、阻塞I/O模式

在阻塞模式下,如果设备不可读写,进程会休眠等待,此时CPU资源会被释放给其他进程使用。当设备可读写时,进程被唤醒继续执行‌。

阻塞I/O模式是最普遍使用的I/O模式,大部分程序使用的都是阻塞模式的I/O。

缺省情况下,套接字建立后所处于的模式就是阻塞I/O模式。

前面学习的很多读写函数在调用过程中会发生阻塞。

  • 读操作中的read、recv、recvfrom
  • 写操作中的write、send,但是sendto不阻塞
  • 其他操作:accept、connect

1.1.1、读阻塞

以read函数为例:

  • 进程调用read函数从套接字上读取数据,当套接字的接收缓冲区中还没有数据可读,函数read将发生阻塞。
  • 他会一直阻塞下去,等待套接字的接收缓冲区中有数据可读。
  • 经过一段时间后,缓冲区内接收到数据,于是内核便去唤醒该进程,通过read访问这些数据。
  • 如果在进程阻塞过程中,对方发生故障,那这个进程将永远阻塞下去。

1.1.2、写阻塞

  • 在写操作时发生阻塞的情况要比读操作少。主要发生在要写入的缓冲区的大小小于要写入的数据量的情况下。
  • 这时,写操作不进行任何拷贝工作,将发生阻塞。
  • 一量发送缓冲区内有足够的空间,内核将唤醒进程,将数据从用户缓冲区中拷贝到相应的发生数据缓冲区。
  • UDP不用等待确认,没有实际的发送缓冲区,所以UDP协议中不存在发送缓冲区满的情况,在UDP套接字上执行的写操作永远都不会阻塞(sendto)

1.2、非阻塞模式I/O

  • 当我们将一个套接字设置为非阻塞模式,我们相当于告诉了系统内核:"当我请求的I/O操作不能够马上完成,你想让我的进程进行休眠等待的时候,不要这么做,请马上返回一个错误给我"。
  • 当一个应用程序使用了非阻塞模式的套接字,它需要使用一个循环来不停地测试是否一个文件描述符有数据可读(称作polling)。
  • 应用程序不停的polling内核来检查是否I/O操作已经就绪。这将是一个极浪费CPU资源的操作。
  • 这种模式使用中不普遍。

http://www.ppmy.cn/embedded/141501.html

相关文章

day 29 第八章 贪心算法part03

第一题:134.加油站 解题思路 本题要求在给定两个整数数组 gas(表示每个加油站的汽油量)和 cost(表示从一个加油站到下一个加油站的耗油量)的情况下,判断能否绕环路行驶一周,如果可以则返回出发…

Redis设计与实现 学习笔记 第二十二章 二进制位数组

Redis提供了SETBIT、GETBIT、BITCOUNT、BITOP四个命令用于处理二进制位数组(bit array,又称“位数组”)。 SETBIT命令用于为位数组指定偏移量上的二进制位设置值,位数组的偏移量从0开始,而二进制位的值可以是0或1&…

k8s中部署filebeat进行日志监听并发送到es中

注意事项 1. 需要将namespace修改为自己项目中的命名空间 2. es换成对应的地址 3. filebeat-inputs中的两个配置(根据需要用任意一个就可以) 3.1 第一个配置是监听docker日志,由于系统日志太多所以这里只监听项目部署命名空间下的内容 -…

【速通GO】基础结构和语法

独立站原文 基础结构以及执行方式 基础结构 // 包名 package main// 引入包 import "fmt"// main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数 // 注意 { 不能单独放在一…

【C++笔记】数据结构进阶之二叉搜索树(BSTree)

【C笔记】数据结构进阶之二叉搜索树(BSTree) 🔥个人主页:大白的编程日记 🔥专栏:C笔记 文章目录 【C笔记】数据结构进阶之二叉搜索树(BSTree)前言一.二叉搜索树的概念二.二叉搜索树的性能分析三.二叉搜索树的实现3.1二叉树的中序…

机器学习6-梯度下降法

梯度下降法 目的 梯度下降法(Gradient Descent)是一个算法,但不是像多元线性回归那样是一个具体做回归任务的算法,而是一个非常通用的优化算法来帮助一些机器学习算法求解出最优解的,所谓的通用就是很多机器学习算法都是用它,甚…

如何做好一份技术文档?

技术文档的创作与优化 一、技术文档的规划布局(一)明确文档目的与受众确定目的分析受众 (二)构建章节框架概述章节基础技术概念章节系统架构章节功能实现章节测试与验证章节结论与展望章节 二、技术文档的语言表达(一&…

初级数据结构——二叉搜索树题库(c++)

目录 前言[1.——108. 将有序数组转换为二叉搜索树](https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/)[2.——LCR 052. 递增顺序搜索树](https://leetcode.cn/problems/NYBBNL/)[3.——897. 递增顺序搜索树](https://leetcode.cn/problems/increasi…