Linux - 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事件的描述符进行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);

相关推荐

  1. Linux - IO

    2024-03-23 15:42:02       16 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-23 15:42:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-23 15:42:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-23 15:42:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-23 15:42:02       18 阅读

热门阅读

  1. capl实现crc校验码计算

    2024-03-23 15:42:02       19 阅读
  2. 蓝桥杯/减肥/c\c++

    2024-03-23 15:42:02       15 阅读
  3. LeetCode算法(一) 之 Python基础

    2024-03-23 15:42:02       19 阅读
  4. 力扣-字符串的最长公共前缀

    2024-03-23 15:42:02       19 阅读
  5. 力扣由浅至深 每日一题.11 加一

    2024-03-23 15:42:02       18 阅读
  6. 前端面试题整理

    2024-03-23 15:42:02       17 阅读
  7. 解决Linux报错JCE cannot authenticate the provider BC

    2024-03-23 15:42:02       16 阅读