创业网站建设政策,app开发公司需要多少人,网站不备案会有什么影响吗,app推广在哪里可以接单一、传统拷贝方式#xff08;一#xff09;操作系统经过4次拷贝CPU 负责将数据从磁盘搬运到内核空间的 Page Cache 中#xff1b;CPU 负责将数据从内核空间的 Page Cache 搬运到用户空间的缓冲区#xff1b;CPU 负责将数据从用户空间的缓冲区搬运到内核空间的 Socket 缓冲区…一、传统拷贝方式一操作系统经过4次拷贝CPU 负责将数据从磁盘搬运到内核空间的 Page Cache 中CPU 负责将数据从内核空间的 Page Cache 搬运到用户空间的缓冲区CPU 负责将数据从用户空间的缓冲区搬运到内核空间的 Socket 缓冲区中CPU 负责将数据从内核空间的 Socket 缓冲区搬运到的网络中二4 次上下文切换read 系统调用时用户态切换到内核态read 系统调用完毕内核态切换回用户态write 系统调用时用户态切换到内核态write 系统调用完毕内核态切换回用户态二、DMA参与下的数据拷贝DMA参与后只是在”拷贝1“的位置暂时交给DMA来控制可以暂时释放CPU去做别的事情。三、mmapwrite方式实现的零拷贝一上下文状态切换1.用户进程通过mmap方法向操作系统内核发起IO调用用户态切换内核态2.内核态切换回用户态mmap方法返回3.用户进程通过write方法向操作系统内核发起IO调用上下文从用户态切换为内核态4.数据从socket缓冲区拷贝到网卡结束后上下文从内核态切换回用户态write调用返回。二数据拷贝1. CPU利用DMA控制器把数据从硬盘中拷贝到内核缓冲区2.CPU将内核缓冲区的数据拷贝到socket缓冲区3.CPU利用DMA控制器把数据从socket缓冲区拷贝到网卡mmapwrite方式的实现的零拷贝IO发生了4次用户空间和内核空间的上下文切换这个并没有节省但是数据拷贝减少了一次。其中2次DMA拷贝和1次CPU拷贝。mmap是将读缓冲区的地址和用户缓冲区的地址进行映射内核缓冲区和应用缓冲区共享所以节省了一次CPU拷贝并且用户京城内存是虚拟的在只是映射到内核读缓冲区可以节省一半的内存空间。四、sendfile实现的零拷贝sendfile是Linux2.1内核版本后引入的一个系统调用函数API如下ssize_t sendfile(int out_fd,int in_fd,off_t *offset,size_t count)out_fd为待写入内容的文件描述符一个socket描述符in_fd为待读出内容的文件描述符必须是真实的文件不能是socket和管道offset制定从读入文件的哪个位置开始读如果为NULL表示文件的默认起始位置count 制定在fdout 和 fdin之间传输的字节数。sendfile表示两个文件描述符之间传输数据它是在操作系统内核中操作的避免了数据从内核缓冲区和用户缓冲区之间的拷贝操作因此可使用他来实现零拷贝。一上下文状态切换数据拷贝1.用户进程发起sendfile系统调用上下文从用户态转向内核态2.DMA控制器把数据从硬盘中拷贝到内核缓冲区3.CPU将读缓冲区中的数据拷贝到socket缓冲区4.DMA控制器异步将数据从socket缓冲区拷贝到网卡5.上下文从内核态切换回用户态sendfile返回。sendfile实现的零拷贝IO发生了两次用户空间与内核空间的上下文切换以及3次数据拷贝其中3次数据拷贝中包括了2次DMA拷贝和1次CPU拷贝。那能不能把CPU的拷贝次数减少到0次呢有的即带有DMA手机拷贝功能的sendfile五、sendfileDMA scatter/gather实现的零拷贝Linux2.4之后对sendfile做了优化升级引入SG-DMA技术其实就是对DMA拷贝加入了scatter/gather操作它可以直接从内核空间缓冲区中将数据读取到网卡。使用这个特点做零拷贝还可以少一次CPU拷贝。一上下文状态切换数据拷贝1.用户进程发起sendfile系统调用上下文从用户态切换为内核态2.DMA控制器把数据从硬盘中拷贝到内核缓冲区3.CPU把内核换乘功能区重点 文件描述信息内核缓冲区的内存地址和偏移量发送到socket缓冲区4.DMA控制器根据文件描述信息直接把数据从内核缓冲区拷贝到网卡5.上下文从内核态奇幻回用户态sendfile调用返回。可以发现sendfileDMA scatter/gather实现的零拷贝IO发生了2次用户空间与内核空间的上下文切换以及2次数据拷贝。其中2次数据拷贝都是DMA拷贝这就是真正的零拷贝技术全程都没有通过CPU来搬运数据所有的数据都是通过DMA来传输的。参考https://heapdump.cn/article/3290793