IO
一个输入操作通常包括两个阶段:
- 等待数据准备好
- 从内核向进程复制数据
Unix 下有5种 IO 模型
-
阻塞式IO (BIO)
应用进程调用 recvfrom 后被阻塞,直到等待数据和复制数据两个阶段都完成。
效率高。 -
非阻塞式IO (NIO)
应用进程不停地调用 recvfrom 直到操作系统返回OK。
cpu需要处理多次系统调用,效率低。 -
IO复用 (select,poll,epoll)
使用select或者poll等待数据,等待多个套接字中的一个变为可读,然后调用 recvfrom。
IO复用不需要进程线程的创建和切换,系统开销小。 -
信号驱动IO (SIGIO)
数据准备好后内核会给应用进程发送信号,收到信号后调用 recvfrom。
比NIO不停地轮询更加高效合理。 -
异步IO (AIO)
等待数据和复制数据两个阶段都完成后,内核再给应用进程发送信号。
效率最高的方案, BIO,NIO,IO复用,SIGIO 在复制数据阶段都会阻塞,AIO完全无阻塞。
零拷贝
零拷贝(英语: Zero-copy) 技术是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。这种技术通常用于通过网络传输文件时节省CPU周期和内存带宽。
-
mmap 内存映射
数据从磁盘经过DMA加载在内核后,对应用程序缓冲区和内核缓冲区进行映射,省略掉从kernel buffer到 application buffer的复制。
-
sendfile
当进行 sendfile() 系统调用时,数据从磁盘经过DMA加载到 kernel buffer, 然后从 kernel buffer 直接复制到 socket buffer, 再从 socket buffer 拷贝到 网卡buffer, 然后发送到网络上。如果网卡支持 SG-DMA(The Scatter-Gather Direct Memory Access)技术,数据就可以直接从 kernel buffer 复制到 网卡buffer, 完全不通过cpu。
Reactor 模式
- mainReactor对象通过select监听事件
- 如果是建立连接到事件,则由Acceptor进行处理
- 如果不是连接事件,则由subReactor进行处理
- 把读取到的事件通过线程池调用handler进行处理
- 处理完成后发送给subReactor,返回响应