本文是自己学习的总结,应对面试足够,建议收藏保存
水平触发:socket的接收缓冲区里有数据来了,只要缓冲里有数据,select、poll或者epoll就都会一直收到通知
边缘触发:只有在有新数据到达socket的缓冲区时才会触发
直接内存避免了二次拷贝,如果buffer在堆上,就需要先从堆拷贝到应用进程缓冲区,再从应用进程缓冲区拷贝到内核套接字缓冲区,再发送到网络,直接内存少了从堆拷贝到应用进程的这一步。
数据从应用进程缓冲区拷贝到套接字发送缓冲区时,内存是不允许发生变化的,不能失效的
指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。
DMA:direct memory access,用于接收CPU的指令负责去IO拷贝。会把文件数据拷贝到内核缓冲区,再拷贝到用户空间
零拷贝技术可以减少数据拷贝和共享总线操作的次数,消除传输数据在存储器之间不必要的中间拷贝次数,从而提高数据传输效率
磁盘 -->DMA拷贝到内核文件读取缓冲区 -->CPU拷贝到应用进程缓冲区 --> CPU拷贝到套接字发送缓冲区(应用进程到内核进程) --> DMA拷贝到网络设备(网卡)
4次拷贝,4次上下文切换
把文件映射到应用进程的某段内存区域里面,减少CPU拷贝到应用进程的步骤
DMA将文件拷贝到文件读取缓冲区后,直接进行CPU拷贝到套接字发送缓冲区,都在内核空间中,省去了从应用进程周转的拷贝
3(2)次拷贝2次上下文切换
在上面的基础上,文件缓冲区和套接字缓冲区之间用了管道机制PIPE,管道实际上就是共用了一段内存
2次拷贝,2次上下文切换
Java JDK里面的零拷贝主要是MMAP和sendfile,sendfile比如FileChannel的transferFrom
END
点亮【赞和在看】,让钱和爱都流向你。
作者介绍
中年程序猿,十年移动端开发老司机,分享一线开发经验和知识,正在探索通过副业渡过中年危机
越努力越幸运,加油💪,一起遇见更好的自己