Linux篇之IO多路复用

前言

你好,我是醉墨居士,今天介绍一下Linux中的IO多路复用机制

流是一种用于在程序与外部数据源(如文件、网络连接、内存等)之间传输数据的机制,表示一种数据的流动和处理方式
文件、管道、套接字、stdin、stdout等等可以表示为一个流
可以通过文件描述符(fd)来进行IO流的操作

IO操作

IO操作是对流的读写操作,流是 IO 操作的抽象表示

IO阻塞

如果流中没有数据,那么此时读取数据的过程就会被阻塞,对于该阻塞事件会延伸出来两种处理方式:

  • 阻塞等待:等待流中存在数据可以读取之后唤醒读取数据的过程,等待过程中不消耗资源,但是同一时刻只能处理一个流的阻塞监听
  • 非阻塞,忙轮询:不断轮询检查流中是否存在数据可以读取,轮询过程中消耗资源

多路IO

能够阻塞等待,并能够同一时刻监听多个流的事件触发

多个流的IO请求处理

  • 方案一
    使用多进程/多线程/多协程,每个进程/线程/协程处理一个流的IO请求
    缺点:进程/线程/协程间的克隆、调度、切换消耗资源

  • 方案二
    依次非阻塞、忙轮询多个流,依次处理每个流的IO请求
    缺点:轮询过程中消耗资源

  • 方案三
    使用select,监听多个流的IO请求,当存在IO请求待处理时触发处理逻辑
    缺点:触发IO请求的逻辑时,不知道是来自哪个文件描述符的IO请求,需要轮询找到待处理的文件描述符中的IO请求进行处理。同时监听文件描述符数量上限有限制

  • 方案四
    使用poll,监听多个流的IO请求,当存在IO请求待处理时触发处理逻辑,相较于select解决监听文件描述符限制的问题
    缺点:和select一样,触发IO请求的逻辑时,不知道是来自哪个文件描述符的IO请求,需要轮询找到待处理的文件描述符中的IO请求进行处理

  • 方案四
    使用epoll,监听多个流的IO请求,当存在IO请求待处理时触发处理逻辑能够获取到哪些流存在待处理的IO请求,我们只需要遍历有待处理事件的流即可

水平触发

只要文件描述符上有可读或可写数据,就会一直触发通知

编程相对简单,因为只要有数据可读或可写,应用程序就会得到通知,不需要特别考虑事件的边界
但是,如果应用程序不及时处理数据,可能会导致频繁触发事件,浪费系统资源

边缘触发

仅在状态发生变化时触发通知。对于可读事件,只有当新数据到达时才触发;对于可写事件,只有当缓冲区从不可写变为可写时才触发

编程相对复杂,需要应用程序确保在触发事件时一次性处理完所有的数据,否则可能会错过事件
由于只在状态变化时触发,所以可以减少不必要的通知,提高系统性能

最后

我是醉墨居士,我们介绍了Linux的IO多路复用,感谢你的浏览,希望多多支持

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醉墨居士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值