操作系统基本知识
在讲述零拷贝之前需要先明白操作系统中的几个概念:用户态、内核态、用户空间、内核空间、CPU上下文、DMA
用户空间和内核空间
应用程序需要通过操作系统提供的一些函数才能完成对磁盘、网络的访问,这些操作都是由底层操作系统来完成的。
操作系统为每个进程分配内存时,会分为两个部分:一部分是用户内存空间(用户空间)、另一部分是内核内存空间(内核空间)。内核空间是操作系统内核访问的区域,是受保护的内存空间,而用户空间是用户应用程序访问的内存区域
直白一点说:当进程运行应用程序的代码时,进程只能使用用户空间的这块内存,当应用程序发生系统调用时,进程才可以访问内核空间的这块内存。
用户态和内核态
DMA技术
Direct Memory Access,直接内存访问
- 在没DMA时
- 在有DMA时
DMA的出现减少了CPU将数据拷贝到内核态的过程
零拷贝
零拷贝的方式有:
sendfile方式
- 2次上下文切换
- 3次拷贝
sendfile直接从内核态写入socket缓冲区再到网卡
sendfile+支持SG-DMA的网卡
- 2次上下文切换
- 2次数据拷贝
省去了缓冲区->socket缓冲区的赋值
参考资料
- https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247496788&idx=1&sn=f65ddd10d16d8376efa0037762153932&chksm=cf222b7df855a26bad76249e7b77e28da3097b226f9165d79f5031516d9c345827fca901559c&token=2001057130&lang=zh_CN&scene=21#wechat_redirect
- https://xiaolincoding.com/os/8_network_system/zero_copy.html#%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E6%9C%89-dma-%E6%8A%80%E6%9C%AF