5种IO模型

news/2025/1/12 14:47:44/

目录

  • 一、认识IO
  • 二、5种IO模型
  • 三、非阻塞IO代码

一、认识IO

什么是IO? Input(输入)和Output(输出)。

冯诺依曼体系结构中,数据从输入设备拷贝到内存,经过处理后,再从内存拷贝到输出设备。现实情况中,数据并不是那么流畅的进行拷贝操作,而是会进行“等”。比如系统调用recv,当读取条件不满足时,它就会阻塞,当读取条件满足了,拷贝数据并返回结果。

所以总结一下,recv一共就做了两件事:等+拷贝 => IO=等+拷贝

其他系统调用也是一样,比如send,当发送缓冲区满了,就会阻塞,直到有空间腾出来,才能进行发送数据。

什么是高效IO? 单位时间内,等的比重越低,IO效率越高
高效的IO代码: 减少IO的比重或者等的时间利用起来

二、5种IO模型

1️⃣阻塞IO
在这里插入图片描述

内核准备好数据之前,系统调用会一直等待

2️⃣非阻塞IO
如果系统调用一直长时间等下去,对CPU来说是较大的浪费。
在这里插入图片描述
如果内核还未将数据准备好,系统调用仍然会直接返回,并且返回EWOULDBLOCK 错误码。返回的间隙应用进程可以做别的事情。

3️⃣信号驱动IO
在这里插入图片描述
数据准备好了,内核发送信号通知应用进程可以进行IO操作了。

4️⃣多路转接IO
在这里插入图片描述
与阻塞IO类似,区别在于多路转接IO可以同时等待多个fd的就绪状态。

5️⃣异步IO
在这里插入图片描述
由内核完成数据的拷贝,然后通知应用进程来处理数据(注意:信号驱动IO是发送信号告诉应用进程什么时候来拷贝数据)

阻塞IO与非阻塞IO
等的方式不一样,前者干等,后者轮询式的等待,期间可以做别的事情
同步IO与异步IO
阻塞IO、非阻塞IO、信号驱动IO和多路转接IO是同步IO,最后一个是异步IO。同步IO应用程序的系统调用都有参与IO的操作,异步IO拷贝数据时是内核来完成的
谁最高效?
多路转接IO最高效,栗子:200个人(为一个整体)钓鱼与一个人钓鱼,200个人中任意一个人钓上鱼的概率比一个人钓上鱼的概率要大

三、非阻塞IO代码

系统调用:fcntl

设置非阻塞:

void SetNonblock(int fd)
{int fl = fcntl(fd, F_GETFL);if(fl < 0){return;}fcntl(fd, F_SETFL, fl | O_NONBLOCK);
}

1️⃣阻塞IO代码

#include "Comm.hpp"
int main()
{char buffer[1024];while (true){ssize_t s = read(0, buffer, sizeof(buffer) - 1);if (s > 0){buffer[s] = 0;cout << "echo# " << buffer << endl;}else{cout << "读取错误..." << endl;sleep(1);}}return 0;
}

在这里插入图片描述
没有数据等待用户输入,有数据就打印数据

2️⃣非阻塞IO代码

#include "Comm.hpp"
int main()
{char buffer[1024];SetNonblock(0);// 设置非阻塞while (true){ssize_t s = read(0, buffer, sizeof(buffer) - 1);if (s > 0){buffer[s] = 0;cout << "echo# " << buffer << endl;}else{cout << "读取错误..." << endl;sleep(1);}}return 0;
}

在这里插入图片描述

怎么知道是IO条件不就绪,还是读取错误?
打印返回值:

#include "Comm.hpp"
int main()
{char buffer[1024];SetNonblock(0);// 设置非阻塞while (true){ssize_t s = read(0, buffer, sizeof(buffer) - 1);if (s > 0){buffer[s] = 0;cout << "echo# " << buffer << endl;}else{cout << "读取错误... , s: " << s << endl;sleep(1);}}return 0;
}

在这里插入图片描述

注意:IO条件不就绪和读取错误的返回值是一样的

打印错误码:

#include "Comm.hpp"
int main()
{char buffer[1024];SetNonblock(0);// 设置非阻塞while (true){ssize_t s = read(0, buffer, sizeof(buffer) - 1);if (s > 0){buffer[s] = 0;cout << "echo# " << buffer << endl;}else{cout << "读取错误... , s: " << s << " errno: " << errno << endl;sleep(1);}}return 0;
}

在这里插入图片描述
说明是底层IO条件不就绪导致的:

#include "Comm.hpp"
int main()
{char buffer[1024];SetNonblock(0);// 设置非阻塞while (true){ssize_t s = read(0, buffer, sizeof(buffer) - 1);if (s > 0){buffer[s] = 0;cout << "echo# " << buffer << endl;}else{if(errno == EWOULDBLOCK || errno == EAGAIN){cout << "IO条件不就绪, 下次再试下" << endl;sleep(1);continue;}cout << "读取错误..."<< endl;sleep(1);}}return 0;
}

在这里插入图片描述
如果有输入数据,这些数据会被按顺序读取,按回车后通过显示器设备打印出来(显示器也有输入缓冲区和输出缓冲区)


http://www.ppmy.cn/news/1562536.html

相关文章

pandas与sql对应关系【帮助sql使用者快速上手pandas】

本页旨在提供一些如何使用pandas执行各种SQL操作的示例&#xff0c;来帮助SQL使用者快速上手使用pandas。 目录 SQL语法一、选择SELECT1、选择2、添加计算列 二、连接JOIN ON1、内连接2、左外连接3、右外连接4、全外连接 三、过滤WHERE1、AND2、OR3、IS NULL4、IS NOT NULL5、B…

基于单片机的粮仓环境监测系统设计

本设计是以单片机为核心的粮仓环境监测系统&#xff0c;由单片机、温湿度检测模块、烟雾检测模块、显示模块、继电器模块、NB-IoT通信模块、报警电路等组成&#xff0c;以实现对粮仓内环境的监测功能&#xff0c;使用NB-IoT通信技术将环境信息上传至云平台&#xff0c;以便管理…

【HUAWEI】HCIP-AI-MindSpore Developer V1.0 | 第五章 自然语言处理原理与应用(3 And 4) | 学习笔记

目录 第五章 自然语言处理原理与应用 3 自然语言处理应用系统 ■ 对话系统 ■ 任务型对话系统架构 ■ 对话系统关键技术-自然语言理解 ■ 对话系统关键技术-对话管理 ■ 对话系统关键技术-自然语言生成 4 基于 MindSpore 的自然语言处理实践 ■ 模型实现 ▲ MindSpor…

[Linux]Mysql9.0.1服务端脱机安装配置教程(redhat)

前言 本教程适用于在yum源不可用的LInux主机上安装Mysql的场景。 以redhat系主机做操作示例&#xff0c;debian系主机可参照步骤&#xff0c;将对应的rpm -ivh命令换成dpkg -i。 1. 官网下载安装包 https://dev.mysql.com/downloads/mysql/ 1.1 版本分类 MySQL Enterprise…

牛客网刷题 ——C语言初阶(5操作符)——BC90 矩阵计算

1. 题目描述&#xff1a;BC90 矩阵计算 牛客网OJ链接 输入NxM矩阵&#xff0c;矩阵元素均为整数&#xff0c;计算其中大于零的元素之和。 输入描述: 第一行为N M(N: 矩阵行数&#xff1b;M: 矩阵列数,且M,N10)&#xff0c;接下来的N行为矩阵各行。 输出描述:一行&#xff0c;…

点赞系统设计(微服务)

点赞业务是一个常见的社交功能&#xff0c;它允许用户对其他用户的内容&#xff08;如帖子、评论、图片等&#xff09;表示喜欢或支持。在设计点赞业务时&#xff0c;需要考虑以下几个方面&#xff1a; 一、业务需求 点赞业务需要满足以下特性&#xff1a; 通用&#xff1a;…

《拉依达的嵌入式\驱动面试宝典》—计算机网络篇(一)

《拉依达的嵌入式\驱动面试宝典》—计算机网络篇(一) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《…

基于华为ENSP的OSPF不规则区域划分深入浅出(5)

本篇技术博文摘要 &#x1f31f; OSPF不规则区域划分及其问题解决方案涉及多个技术手段&#xff0c;包括隧道、虚链路和路由重发布等。合理的网络设计和配置对于避免网络中出现的环路问题至关重要。通过多进程双向重发布等方式&#xff0c;能够有效地优化路由协议的互通性和网络…