,由程序地址转为物理地址映射
零拷贝
在上面,我们简单的了解了用户态和内核态的区别,在用户态中,所有的内存地址都是独立的虚拟地址,如果需要读取外部数据时,将由内核态的缓冲区复制一份到用户态内存中,例如下面的这个例子.../test.txt");//在fpm中执行
它的流程为:
1:从硬盘中读取数据到内核态缓冲区,第一次复制拷贝
2:内核态复制数据到用户态,第二次拷贝
3:用户态获取数据之后,echo 发送数据,复制数据到内核态...操作系统会根据读取的文件,预存储到内核态内存中,因为硬盘效率非常慢,所以当有多次相同文件读取请求时,可以将文件数据从内核态缓存中直接复制到用户态内存中,节省文件操作
零拷贝技术就是避免cpu将数据从一块存储位置拷贝到另一块位置...,通过以下技术可以实现零拷贝:
mmap
mmap 可以将一个文件预加载到内核空间中,并于用户空间共享内存地址,这样就可以避免数据从内核态复制到用户态中,可节省一次拷贝.例如:
#include <...2:将内核空间的内存地址以及偏移量传输到socket缓冲区中
3:socket直接从内核空间读取数据
4:将内核空间的数据通过socket复制到网卡中,第二次拷贝
sendfile只能实现文件->socket