前置知识

I/O流

I/O流(输入/输出流)是程序和外部环境(文件,网络连接等)之间传输数据的通道。流提供一种连续的数据传输方式,使程序可以顺序的读取或写入数据。

除了流还有什么数据传输方式 ?

  1. 数据报:数据报是一种无连接的传输方式,每个数据报独立发送,且数据报之间没有固定的顺序。UDP(用户数据报协议)是一种典型的使用数据报的协议。
  2. 数据包:大块数据被切割成小的单元进行传输,这些小的单元成为数据包。
  3. 消息队列:消息队列允许应用程序通过队列发送和接收消息,支持异步通信和数据传输。消息可以在发送者和接收者之间进行缓存。
  4. 共享内存:共享内存是一种允许多个程序访问同一块内存区域的机制,是进程间通信(IPC)的一种形式。
  5. 信号:信号是一种轻量级的IPC机制,用于处理进程间的异步通知。
  6. 管道:管道是一种允许一个进程将输出作为另一个进程输入的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多路复用