后端进阶8.24日课程总结(上) | 青训营

95 阅读2分钟

8.24日的课程主要分为一个部分:
1.深入简出零拷贝及应用

课程目录:
1.传统文件传输过程
2.零拷贝的实现方式
3.GO语言中的实现
4.零拷贝的应用

1.传统文件传输过程
其具备上下文切换的区别,用于区分用户空间和内核空间,目的是隔离操作系统程序和应用程序,内核不应该信任任何用户空间的指针,从安全性角度出发。
CPU的数据拷贝方式有I/O轮询(特点是实现简单,占用全部CPU资源,效率低),I/O中断(特点是在前者的基础上一定程度上释放了CPU资源,缺点是在大文件流量传输的情况下,CPU会反复中断),DMA传输(特点是彻底减少了一次CPU拷贝,缺点是很吃设备硬件支持)

2.零拷贝的实现方式

概念剖析:零拷贝并不是0次考虑数据,而是减少用户空间和CPU空间的CPU拷贝次数,即减少上下文切换的次数
提供的几种方案:a.mmap+write

  1. 调用mmap()系统调用,将文件映射到内存地址空间,实现文件数据的零拷贝。
  2. 调用write()系统调用,直接将mmap得到的内存地址空间的数据写入socket。这样避免了从用户空间到内核空间的冗余拷贝。
  3. 调用msync()刷新修改到mapped file中。
  4. 优点:内核可以直接访问用户空间映射的文件内容,不需要进行数据拷贝,socket也可以直接访问用户空间映射的内存,也不需要数据拷贝,只在mapped file刷新时才会发生实际的数据拷贝,减少了用户态与内核态之间的上下文切换,可以大幅提高文件发送效率。
  5. 缺点:同步文件问题

b.sendfile

  1. 通过mmap将文件映射到用户内存空间。
  2. 调用sendfile系统调用,指定目标socket和要发送的文件对应的mmap区域
  3. 内核直接将mmap区域的数据拷贝到socket缓冲区。
  4. 内核直接在socket上发送数据。
  5. 优点:简化了从文件到socket的零拷贝过程,只需要一个系统调用。内核可以直接访问mmap区域,不需要到用户状态拷贝数据。利用DMA方式可以进一步加速内核的文件数据拷贝。内核可以适时发送socket数据,不需要等到全部mmap完成。减少了用户态与内核态的上下文切换。sendfile系统调用封装了文件映射、数据拷贝和发送等复杂过程。可以大幅提高文件发送性能。
  6. 缺点:需要较大的带宽,socket发送缓冲区等