💡 有理想,但不|

navyum

园龄:4个月粉丝:0关注:0

10.网络文件IO优化

10. 网络文件IO优化

本地磁盘中文件发送到网络中:

1. 直接 IO 技术

Img
  • 内核缓冲区又叫做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. 内存映射文件技术 Img

  • 整个过程有三次数据拷贝,不再经过应用程序内存:
    • 磁盘 –> 内核缓冲区 –> Socket 缓冲区
    • Socket缓冲区 –> 网络
相关API:
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

3. 零拷贝技术

Img
  • 内核缓冲区到 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 中国大陆许可协议进行许可。

posted @   navyum  阅读(4)  评论(0编辑  收藏  举报
//自己上传到博客园的js
点击右上角即可分享
微信分享提示