一、什么是零拷贝
零拷贝是指CPU不需要在用户空间和用户空间、用户空间和内核空间之间拷贝数据,消耗资源。
二、用户空间,内核空间,内核缓存,进程缓存
操作系统将虚拟内存分为两部分,应用程序只能访问用户空间
用户空间:应用程序只能访问用户空间
内核空间:内核程序都可以访问用户空间和内核空间
应用程序通过系统调用的方式,向内核空间发出指令,完成内核空间的访问。
缓冲区:为了低速设备的缓冲,外部的物理设备太慢了,磁盘,网卡的数据需要先放入到缓冲区。缓冲区会映射到虚拟内存,最终要落在物理内存
内核缓冲区:内核程序都可以访问内核缓冲区和进程缓冲区。
进程缓冲区:用户程序只能访问的进程缓冲区。
三、传统C程序IO过程中的4次数据拷贝,4次模式切换
1、如果该内核地址缓冲区与套接字相关,叫做socket send buffer,如果与文件系统相关,叫做filesystem cache。
2、如果数据非常大的话,是很耗费时间的,因为一个字节一个字节copy的
3、DMA物理硬件上,复制的是内核空间来做的。从内核缓冲区传递到协议引擎栈:也是有一点缓存的。
为什么内核缓冲区不可以去掉:
(1)、因为用户空间对应的物理内存有关的,假设用户缓冲区映射到硬盘里面的,用户缓冲区的数据不一定在物理上存在可能在硬盘上的,但是不影响代码去访问。如果不存在物理内存里面的话,这个时候内核会产生缺页异常,然后内核程序偷偷的从物理硬盘读取到物理内存来而这个时候对用户程序不可见。
(2)、这种的调拨 是在内核缓冲区里面是不可以的,必须要求内核缓冲区的数据对应到物理内存,必须是一对一存在的。否则就报错。
(3)、用户空间里面的数据是可以调拨的,是可以从硬盘调拨到物理内存来。所以要进行用户缓冲区到内核缓冲区的cpu复制,如果用户缓冲区的数据在物理内存上没有,还在硬盘上,是有问题的。sys_write发现数据没在物理内存。所以copy到内核缓冲区的数据的步骤是必须存在的。