10.网络文件IO优化
10. 网络文件IO优化
本地磁盘中文件发送到网络中:
1. 直接 IO 技术

内核缓冲区
又叫做Linux系统的Page Cahe
。 为了加快磁盘的IO,Linux系统会把磁盘上的数据以 Page为单位缓存在操作系统的内存里,这里的Page是 Linux 系统定义的一个逻辑概念,一个Page一般为4K整个过程有四次数据拷贝,读进来两次,写回去又两次:
- 磁盘 –> 内核缓冲区 –> 用户态程序
- 用户态程序 –> Socket缓冲区–> 网络
相关API: ssize_t read(int filedes, void *buf, size_t nbytes); ssize_t write(int filedes, void *buf, size_t nbytes);
### 2. 内存映射文件技术
- 整个过程有三次数据拷贝,不再经过应用程序内存:
- 磁盘 –> 内核缓冲区 –> Socket 缓冲区
- Socket缓冲区 –> 网络
相关API: void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
3. 零拷贝技术

内核缓冲区到 Socket 缓冲区之间并没有做数据的拷贝,只是一个地址的映射。底层的网卡驱动程序要读取数据并发送到网络上的时候,看似读取的是 Socket 的缓冲区中的数据,其实直接读的是内核缓冲区中的数据。
零拷贝中所谓的“零”指的是
内存中数据
拷贝的次数为 0 (磁盘的数据读取到内存还是存在的)整个过程有0次数据拷贝:
- 磁盘 –> 内核缓冲区
- Socket缓冲区 –> 网络
相关API: ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
本文作者:navyum
本文链接:https://www.cnblogs.com/navyum/p/18509328
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步