当前位置: 首页 > news >正文

Linux - IO

目录

  • 四种典型IO方式
    • 阻塞IO
    • 非阻塞IO
    • 信号驱动
    • 异步IO
  • 多路转接IO
    • select模型
      • 接口

四种典型IO方式

IO:输入输出–过程:等待IO就绪,进行数据拷贝

阻塞:为了完成某功能,发起一个调用,若完成功能条件不具备,则一直等待
非阻塞:发起一个调用,若完成功能条件不具备,则立即报错返回
阻塞与非阻塞:通常用于描述某个接口发起调用后是否能够立即返回
同步:一个功能完成后,才能进行下一个,若不能立即完成则一直等待
异步:发起一个调用,让别人完成具体功能,不用等待功能完成后才能继续推进
同步与异步:通常用于描述功能的完成流程。(外部体现就是功能是否是自己完成的)
异步阻塞与异步非阻塞:
异步阻塞:发起一个调用,让系统完成任务,进程一直等着系统完成任务。
异步非阻塞:发起一个调用,让系统完成任务,进程继续做自己的事情

阻塞IO

阻塞IO:发起IO调用,若IO未就绪(IO条件不具备)则一直等待
优点:流程最为简单
缺点:效率较为低下

非阻塞IO

非阻塞:发起IO调用,若IO未就绪,则立即报错返回
优点:效率相较于阻塞有所提高
缺点:需要循环进行操作,不够实时

信号驱动

信号驱动:自定义IO信号处理,等待IO就绪收到信号打断当前操作进行IO
优点:效率更高,实时性更强
缺点:操作流程更为复杂-需要定于信号处理

异步IO

异步IO:自定义IO信号处理,发起IO调用,调用后立即返回,让系统完成IO,完成后通过信号通知进程。
优点:对于资源利用率极高,效率极高。
缺点:流程最为复杂

多路转接IO

IO多路转接:IO多路复用
作用:针对大量描述符进行IO就绪事件监控,让进程仅仅针对已经就绪了IO事件的描述符进行IO操作,避免了进程对未就绪的描述符进行操作所带来的性能损失或者阻塞。
实现:select、poll、epoll
IO就绪事件:可读,可写,异常

select模型

select模型:针对大量描述符进行IO就绪事件监控
操作流程:
1.定义指定IO事件的描述符集合,将需要监控指定时间的描述符添加到对应集合中
2.发起调用,将需要监控的事件描述符集合拷贝到内核,进行事件监控。若监控超时了都没有描述符就绪则返回,若有描述符就绪了指定监控的事件则返回。在监控调用返回前,都会将描述符集合中没有就绪事件的描述符移除。也就是说,调用返回后,集合中保留的只有就绪的描述符。
3.判断哪个描述符还在哪个集合中,就知道哪个描述符就绪了什么事件,进而进行对应IO操作。

接口

1.定义集合:fd_set rfds, wfds, efds;
2.清空集合:void FD_ZERO(fd_set *set);
3.将描述符添加到集合中:void FD_SET(int fd, fd_set *set);
4.发起监控调用

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

nfds:所有集合中最大的描述符的值+1
readfds / writefds / exceptfds:可读,可写,异常,不监控置空
timeout:监控超时等待时间 struct timeval{tv_usec, tv_sec} 一直等待则置NULL,非阻塞则数据置0
返回值:返回实际就绪的描述符个数;出错返回-1;超时返回0;

5.调用返回后,判断哪个描述符还在集合中确定哪个描述符就绪了什么事件

int FD_ISSET(int fd, fd_set *set);

6.从指定集合中移除指定的描述符

void FD_CLR(int fd, fd_set *set);
http://www.lryc.cn/news/323733.html

相关文章:

  • Cmake和opencv环境安装
  • Redis是如何避免“数组+链表”的过长问题
  • Grass手机注册使用教程,利用闲置手机WiFi带宽赚钱
  • java NIO群聊系统
  • ZCC5429 异步升压芯片
  • 复试专业前沿问题问答合集10-1——区块链与加密货币
  • redis【面试题】
  • linux下使用 tar 来压缩和解压 tar.gz 和 tar.xz 文件
  • Python环境下基于1D-CNN的轴承故障诊断及TSNE特征可视化
  • 进程的调度,原则,算法
  • 瑞_23种设计模式_状态模式
  • system Verilog:clocking中定义信号为input和output的区别
  • JAVA_Tomcat
  • uniapp运行项目到微信小程序报错——未找到[“sitemapLocation“]
  • pytorch升级打怪(八)
  • 全智能深度演进,一键成片让视频创作颠覆式提效
  • uniapp(vue3) H5页面连接打印机并打印
  • Android视角看鸿蒙第八课(module.json5中的各字段含义之abilities)下
  • 设计模式 适配器模式
  • 前端面试题详解
  • 抖音,剪映,TikTok,竖屏短视频转场pr模板视频素材
  • python网络相册设计与实现flask-django-nodejs-php
  • 设计模式: 外观模式
  • Samba局域网共享文件
  • 基于FPGA实现的UDP协议栈设计_汇总
  • maven手动上传的第三方包 打包项目报错 Could not find xxx in central 解决办法
  • 利用Scala与Apache HttpClient实现网络音频流的抓取
  • Linux(openEuler)部署SpringBoot前后端分离项目(Nginx负载均衡)
  • InnoDB 缓存
  • 目标检测——PP-YOLOE-R算法解读