Linux 之 IO模型

IO的本质是基于操作系统接口来控制底层的硬件之间数据传输,并且在操作系统中实现了多种不同的IO方式(模型),比较常见的有下列三种

阻塞型IO模型
非阻塞型IO模型
多路复用IO模型

一、阻塞与非阻塞IO

一般默认的 IO 操作都是阻塞型 IO,在IO操作时等待输入会阻塞进程(进入睡眠状态)资源就绪后苏醒

阻塞IO模型如下图:在这里插入图片描述
非阻塞IO:当进程发出IO请求后,进行轮询就检查操作,无论资源是否就绪都返回,直到资源就绪才处理资源,其模型如下图:
在这里插入图片描述

实现非阻塞型IO,需要设置 O_NONBLOCK 标志,两种方式:
1.调用 fcntl 函数来进行设置
2.通过open函数来进行设置,一般在打开文件时就需要设置

多路复用IO(select,poll,epoll)

简介:本质上就是通过复用一个进程来处理多个IO请求
基本思想由内核来监控多个文件描述符是否可以进行I/O操作,如果有就绪的文件描述符,将结果告知给用户进程,则用户进程再进行相应的I/O操作

目前在Linux系统有三种多路复用I/O的方案:
select、poll、epoll

Select

设计思想通过单进程创建一个文件描述符集合,将需要监控的文件描述符添加到这个集合中,由内核负责监控文件描述符是否可以进行读写,一旦可以读写,则通知相应的进程进行相应的I/O操作

原型
int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds,
struct timeval *timeout);
功能
监控一组文件描述符,阻塞当前进程,由内核检测相应的文件描述符是否就绪,一旦有文件描述符就绪,将就绪的文件描述符拷贝给进程,唤醒进程处理
参数
nfds:最大文件描述符加1
readfds:读文件描述符集合的指针
writefds:写文件描述符集合的指针
exceptfds:其他文件描述符集合的指针
timeout:超时时间结构体变量的指针
函数返回值
成功:返回已经就绪的文件描述符的个数。如果设置timeout,超时就会返回0
失败:-1,并设置errno

操作文件描述符集合函数
void FD_CLR(int fd,fd_set *set)
将fd从文件描述符集合中删除

int FD_ISSET(int fd,fd_set *set)
判断fd是否在文件描述符集合中

void FD_SET(int fd,fd_set *set)
将文件描述符添加到文件描述符集合中

void FD_ZERO(fd_set *set)
将文件描述符集合清空
参数描述:
fd:文件描述符
set:文件描述符集合的指针

超出时间说明:
如果timeout之后,文件描述符集合中没有任何就绪的文件描述符,select函数就会返回0
超时之后,timeout会被select函数修改,表示超时时间已经使用完。
如果想继续使用超时时间,需要备份之前的struct timeval

超时之后,表示没有就绪的文件描述符,此时文件描述符集合被赋值为空。因此,需要将之前的文件描述符集合进行备份

Poll

多路复用poll的方式与select多路复用原理类似,但有很多地方不同。

区别:
1.在应用层是以结构体struct pollfd数组的形式来进行管理文件描述符,在内核中基于链表对数组进行扩展;select方式以集合的形式管理文件描述符且最大支持1024个文件描述符
2.poll将请求与就绪事件通过结构体进行分开;select将请求与就绪文件描述符存储在同一个集合中,导致每次都需要进行重新赋值才能进行下一次的监控
共同点:在内核中仍然使用的是轮询的方式,与 select 相同,当文件描述符越来越多时,则会影响效率

使用:
原型:int poll(struct pollfd *fds, nfds_t nfds, int timeout);
参数:
fds:sturct pollfd结构体指针
nfds:fds结构体的数量
timeout:超时时间,单位为ms
返回值:
成功:大于0,返回就绪的文件描述符数量;=0,超时返回,没有文件描述符就绪
失败:-1,并设置errno

在这里插入图片描述

Epoll

select/poll的不足:
1.select 方案使用数组存储文件描述符,最大支持1024个
2.select 每次调用都需要将文件描述符集合拷贝到内核中,非常消耗资源
3.poll 方案解决文件描述符存储数量限制问题,但其他问题没有得到解决
4.select / poll 底层使用轮询的方式检测文件描述符是否就绪,文件描述符越多,则效率越低

epoll优点
1.epoll底层使用红黑树,没有文件描述符数量的限制,并且可以动态增加与删除节点,不用重复拷贝
2.epoll底层使用callback机制,没有采用遍历所有描述符的方式,效率较高

使用epoll_create函数创建:

原型:int epoll_create(int size);
参数:size:需要填一个大于0的数,从Linux 2.6.8开始,size参数被忽略
返回值:成功返回epoll文件描述符,失败返回-1,并设置errno

示例代码:创建一个epoll 实例
在这里插入图片描述

epoll控制函数:
主要用于文件描述符集合的管理,包括增加、修改、删除等操作。

原型:int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
参数
epfd:epoll 实例
op:epoll 操作命令字
EPOLL_CTL_ADD:在epoll实例中添加新的文件描述符(相当于向红黑树中添加节点),并将事件与fd关联
EPOLL_CTL_MOD:更改与目标文件描述符fd相关联的事件
EPOLL_CTL_DEL:从epoll实例中删除目标文件描述符fd ,事件参数被忽略
fd:操作的文件描述符
event:struct epoll_event结构体对象指针

epoll 等待函数
epoll 等待事件发生(关联的文件描述符就绪)

原型:
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int
timeout);
参数:
epfd:epoll实例对象
events:存储就绪集合的数组的地址
maxevents:就绪集合的最大值
timeout:超时时间
返回值:
成功:返回就绪的文件描述符数量,超时返回0
失败:返回-1,并设置errno

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1551866.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

在Linux中进行OpenSSH升级(编译安装在openssh目录)

由于OpenSSH有严重漏洞,因此需要升级OpenSSH到最新版本。 注意:在OpenSSH升级过程中千万不要断开服务器连接,不然的话,会出现断开后连接不了服务器的情况。 第一步,查看当前的OpenSSH服务版本。 命令:ss…

DataEase v2 开源代码 Windows 从0到1环境搭建

一、环境准备 功能名称 描述 其它 操作系统 Windows 数据库 Mysql8.0 开发环境 JDK17以上 本项基于的21版本开发 Maven 3.9版本 开发工具 idea2024.2版本 前端 VSCode TIPS:如果你本地有jdk8版本,需要切换21版本,请看…

C语言 | Leetcode C语言题解之第448题找到所有数组中消失的数字

题目&#xff1a; 题解&#xff1a; int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize) {for (int i 0; i < numsSize; i) {int x (nums[i] - 1) % numsSize;nums[x] numsSize;}int* ret malloc(sizeof(int) * numsSize);*returnSize 0;for (in…

遥感图像文本检索

遥感图像文本检索是一种通过自然语言描述&#xff0c;从大量遥感图像中搜索与之相关的图像的技术。它用于遥感解释任务中&#xff0c;帮助用户根据文字描述快速找到符合条件的遥感图像&#xff0c;这在城市规划、环境监测、灾害管理等领域具有重要应用意义。 实现这一技术的核…

线路交换与分组交换的深度解析

1. 线路交换 原理 线路交换是一种在通信双方之间建立固定通信路径的方式。当用户发起通信时&#xff0c;网络为其分配一条专用的物理通道&#xff0c;这条通道在整个通话过程中保持不变。这意味着在通话期间&#xff0c;其他用户无法使用这条线路。 优点 稳定性&#xff1a…

记录一次出现循环依赖问题

具体的结构设计&#xff1a; 在上面的图片中&#xff1a; UnboundBlackVerifyChain类中继承了UnboundChain类。但是UnboundChain类中注入了下面三个类。 Scope(“prototype”) UnboundLinkFlowCheck类 Scope(“prototype”) UnboundUserNameCheck类 Scope(“prototype”) Un…

【刷题6】一维前缀和、二维前缀和

目录 一、一维前缀和二、二维前缀和 一、一维前缀和 题目&#xff1a; 思路&#xff1a; 一、前缀和&#xff0c;时间复杂度O&#xff08;1&#xff09;&#xff0c;快速得到区间的值 二、预处理&#xff0c;公式——dp[i] dp[i-1] arr[i] 三、使用前缀和&#xff0c;根据…

VUE a-table 动态拖动修改列宽+固定列

实现效果 实现思路 自定义表头&#xff0c;在标题后面加两个标签&#xff0c;分别用来显示拖拽图标&#xff08;cursor: col-resize&#xff09;&#xff0c;和蓝色标记线&#xff08;有的时候鼠标移动过程中不一定会在表内&#xff0c;这个时候不显示图标&#xff0c;只显示蓝…

综合练习 学习案例

//验证码 前四位是字母 最后一位是数字 public class test1 {public static void main(String[] args){char [] charsnew char[52];for (int i 0; i <chars.length ; i) {if(i<25){chars[i](char)(i97);}else{chars[i](char)(i65-26);}}Random rnew Random();String cod…

828华为云征文|华为云Flexus云服务器X实例部署 即时通讯IM聊天交友软件——高性能服务器实现120W并发连接

营运版的即时通讯IM聊天交友系统&#xff1a;特点可发红包&#xff0c;可添加多条链接到用户网站和应用&#xff0c;安卓苹果APPPC端H5四合一 后端开发语言&#xff1a;PHP&#xff0c; 前端开发语言&#xff1a;uniapp混合开发。 集安卓苹果APPPC端H5四合一APP源码&#xff0…

语音转文字免费利器:助力高效办公与学习

语音转文字免费的软件如同一股清流&#xff0c;让我们能够更轻松地将语音信息转化为可编辑的文字内容。今天我们一起来分析它们的功能、特点以及如何为我们的生活和工作带来便利。 1.365在线转文字 链接直达&#xff1a;https://www.pdf365.cn/ 这是一个功能强大的在线工具…

量化必备!股票常用数据批量下载、定时更新,代码打包好了!

上一节课我详细演示了从tushare获取股票列表和基本信息并且配置定时更新任务的详细流程&#xff0c;旨在教会想要学习通过Python获取股票数据并且定期更新的朋友。 不过有很多朋友完全没有Python基础&#xff0c;如果一开始把大量时间花费在搞数据上&#xff0c;本末倒置不说&…

如果您忘记了 Apple ID 和密码,按照指南可重新进入您的设备

即使您的 iPhone 或 iPad 由于各种原因被锁定或禁用&#xff0c;也可以使用 iTunes、“查找我的”、Apple 支持和 iCloud 解锁您的设备。但是&#xff0c;此过程需要您的 Apple ID 和密码来验证所有权并移除激活锁。如果您忘记了 Apple ID 和密码&#xff0c;请按照我们的指南重…

【PyTorch】图像分割

图像分割是什么 Image Segmentation 将图像每一个像素分类 图像分割分类 超像素分割&#xff1a;少量超像素代替大量像素&#xff0c;常用于图像预处理语义分割&#xff1a;逐像素分类&#xff0c;无法区分个体实例分割&#xff1a;对个体目标进行分割全景分割&#xff1a;…

动态库的加载全过程

区分一组概念&#xff1a;逻辑地址&#xff0c;虚拟地址&#xff0c;物理地址。 逻辑地址&#xff1a;是我们的代码在编译过程&#xff0c;编译器帮对每一条代码所生成的指令所编写的地址。 物理地址&#xff1a;当程序被放入到内存中时&#xff0c;内存与每一条指令所对应的…

031集——文本文件按空格分行——C#学习笔记

如下图&#xff0c;读取每行文本&#xff0c;每行文本再按空格分开读取一个字符串&#xff0c;输出到另一个文本&#xff1a; CAD环境下&#xff0c;代码如下&#xff1a; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Runtime; using System; using Sys…

笔记本电脑如何改ip地址:操作指南与注意事项

在信息时代的浪潮中&#xff0c;网络已成为我们日常生活与工作中不可或缺的一部分。对于笔记本电脑用户而言&#xff0c;IP地址作为设备在网络中的唯一标识&#xff0c;其重要性不言而喻。无论是出于网络安全、网络测试还是特殊网络环境等需求&#xff0c;了解如何修改笔记本电…

制造企业各部门如何参与生产成本控制与管理?

​国内制造业的分量可不轻&#xff0c;从日常生活用品到高端工业设备&#xff0c;中国制造几乎涵盖了各个领域。 不过很多制造业企业在管理方面确实存在一些难题&#xff1a;成本控制不容易&#xff0c;产品质量并不稳定&#xff0c;生产周期也常常较长。 一、中国制造业生产管…

仿真设计|基于51单片机的商用电子计价秤设计

目录 具体实现功能 设计介绍 51单片机简介 资料内容 仿真实现&#xff08;protues8.7&#xff09; 程序&#xff08;Keil5&#xff09; 全部内容 资料获取 具体实现功能 &#xff08;1&#xff09;通电时电子秤进入欢迎界面&#xff0c;显示“欢迎使用电子秤 设计学生…

【SQLite】基础操作

数据查询 SELECT 查询所有数据 SELECT *FROM tableName使用AND操作符 SELECT * FROM tableName WHERE id=? AND name=?使用OR操作符 SELECT * FROM tableName WHERE id=? OR name=?组合使用AND和OR SELECT * FROM tableName WHERE (id=? AND name=?) OR status=?多表查询…