零拷贝个人笔记

74 阅读2分钟

前言

  • 应用程序要访问物理设备只能通过系统调用的方式来工作。读和写分别对应read()和write()两个系统调用。而只要是系统调用就可能存在内核空间地址和用户空间地址切换的问题,这是操作系统为了保护系统本身的运行安全,而将内核程序运行使用的内存空间和用户程序运行的内存空间进行隔离造成的。但是这样虽然保证了内核程序运行的安全性,但是也必然存在数据可能需要从内核空间向用户空间复制的问题。
  • 当一个进程执行系统调用而陷入内核代码中执行时,就称进程处于内核运行态(或简称为内核态),当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。
  • 直接内存访问(DMA,Direct Memory Access)是一些计算机总线架构提供的功能,它能使数据从附加设备(如磁盘驱动器)直接发送到计算机主板的内存上。(帮助CPU拷贝数据到内核缓冲区,释放CPU做其他事情)
  • 虚拟内存,多个虚拟内存可以指向同一个物理地址,可以把内核空间和用户空间的虚拟地址映射到同一个物理地址。

image.png

传统IO

image.png

  • 用户应用进程调用read函数,向操作系统发起IO调用,上下文从用户态转换为内核态;
  • DMA控制器把数据从磁盘中读取到内核缓冲区;
  • CPU把内核缓冲区数据拷贝到用户应用缓冲区,上下文从内核态转换为用户态,read函数返回;
  • 用户应用进程调用write函数,发起IO调用,上下文从用户态转为内核态;
  • CPU将用户缓冲区中的数据,拷贝到socket缓冲区;
  • DMA控制器把数据从socket缓冲区拷贝到网卡设备,上下文呢从内核态转为用户态,write函数返回。

mmap

利用虚拟内存,内核空间和用户空间的虚拟地址映射到同一个物理地址

image.png

image.png

image.png

sendfile

image.png

image.png

image.png

sendfile+DMA scatter/gather

image.png

image.png

java 对零拷贝的支持

image.png

image.png

图片来自于b站捡田螺的小男孩啊,如有侵权马上删除