0x201 IO复用
前置知识
I/O流
I/O流(输入/输出流)是程序和外部环境(文件,网络连接等)之间传输数据的通道。流提供一种连续的数据传输方式,使程序可以顺序的读取或写入数据。
除了流还有什么数据传输方式 ?
- 数据报:数据报是一种无连接的传输方式,每个数据报独立发送,且数据报之间没有固定的顺序。UDP(用户数据报协议)是一种典型的使用数据报的协议。
- 数据包:大块数据被切割成小的单元进行传输,这些小的单元成为数据包。
- 消息队列:消息队列允许应用程序通过队列发送和接收消息,支持异步通信和数据传输。消息可以在发送者和接收者之间进行缓存。
- 共享内存:共享内存是一种允许多个程序访问同一块内存区域的机制,是进程间通信(IPC)的一种形式。
- 信号:信号是一种轻量级的IPC机制,用于处理进程间的异步通知。
- 管道:管道是一种允许一个进程将输出作为另一个进程输入的IPC机制。管道可以是匿名的,也可以是有名的(FIFO)。
I/O复用的基础概念
I/O复用是指允许一个进程或单个线程能够监控多个I/O流(例如,文件描述符或套接字)的可用性的技术。他的核心思想是通过某种方式能够通知程序哪些I/O流已经准备好进行读写操作,从而使得程序能够有效地管理多个输入和输出操作,而无需为每个I/O流分别阻塞等待。
I/O复用是基于事件驱动编程模型进行开发的,所以I/O复用的各种具体实现可称之为==事件监听器==
工作原理
在没有I/O多路复用时,程序可能需要在每个I/O请求上阻塞等待,直到I/O请求完成程序才会继续执行。这种模式下在并发处理多个I/O请求时效率低下,因为大量的时间浪费在等待上。
在使用I/O复用时,程序可以在单个阻塞下(select、poll、epoll等系统调用)来监控多个I/O流。当至少一个I/O流准备好读写操作时时,调用返回。随后程序可以立即处理这些已经准备好读写操作的I/O流,无需再每个I/O操作上阻塞等待。
[!NOTE] I/O复用和I/O多路复用
这两个是同一个概念
select 、poll、epoll系统调用的功能是什么?
select 、poll、epoll系统调用的功能主要是实现I/O多路复用,它们帮助一个进程或线程同时监控多个文件描述符的状态,比如可读,可写或者异常,直到一个或者多个I/O流准备就绪。这样程序可以在不被阻塞的情况下监控多个I/O流。
| \ | select | poll | epoll |
|---|---|---|---|
| 操作方式 | 遍历 | 遍历 | 回调 |
| 底层实现 | 数组 | 链表 | 哈希表 |
| IO效率 | 每次调用都需要进行线性遍历,时间复杂度为O(n) | 每次调用都需要进行线性遍历,时间复杂度为O(n) | 事件通知方式,每当fd就绪,系统注册的回调函数就会被调用,将就绪的fd方法rdlist里面。时间复杂度O(1) |
| 最大连接数 | 1024(X86)或2048(X64) | 无上限 | 无上限 |
| fd拷贝 | 每次调用select,都需要将fd集合从用户态拷贝到内核态 | 每次调用select,都需要将fd集合从用户态拷贝到内核态 | 调用epoll_ctl时将fd集合拷贝进内核并保存,之后每次epoll_wait不进行拷贝 |
Epoll是事件驱动的IO多路复用
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 程序员小航
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果