struct iovec
struct iovec是用于分散/聚集 I/O (scatter-gather I/O)的数据结构,定义在<sys/uio.h>头文件中,它允许一次性从多个不连续的内存缓冲区读或写入数据,减少系统调用次数,提高i/o的效率
结构定义
struct iovec {void *iov_base; //缓冲区的起始地址size_t iov_len; //缓冲区长度
}
应用场景
struct iovec 是 UNIX/Linux 系统中用于高效I/O操作的关键数据结构
高性能网络编程
- HTTP服务器:同时发送响应头和文件内容
- RPC框架:组合序列化后的多个数据段
- 消息队列:打包发送多个不连续的消息片段
文件i/o优化
- 同时读写文件的多个不连续区域
// 从文件的三个不同位置读取数据
iov[0].iov_base = buf1;
iov[0].iov_len = 100;iov[1].iov_base = buf2;
iov[1].iov_len = 200;iov[2].iov_base = buf3;
iov[2].iov_len = 150;readv(fd, iov, 3);
- 数据库系统:高效读写分散的记录
协议实现
- TCP/IP协议栈:处理分片数据包
- 自定义协议:组合协议头和有效载荷
内存管理
- 零拷贝技术
// 将文件直接发送到网络(无需用户空间拷贝)
splice(file_fd, NULL, socket_fd, NULL, file_size, SPLICE_F_MOVE);
- 配合sendfile()系统调用实现高校文件传输
多缓冲区处理
- 日志系统:同时写入日志头和日志内容
- 数据采集:合并来自不同传感器的数据包
- 视频处理:组合视频帧头和帧数据
性能对比
经典应用案例
- Nginx:发送静态文件时使用writev
- Redis:网络I/O处理
- Kafka:消息批量传输
- 数据库系统(如PostgreSQL)
- 视频流服务器