
文章插图
4.3 sendfile
通过 sendfile 系统调用,数据可以直接在内核空间内部进行 I/O 传输,从而省去了数据在用户空间和内核空间之间的来回拷贝,sendfile 调用中 I/O 数据对用户空间是完全不可见的,整个拷贝过程会发生 2 次上下文切换,1 次 CPU 拷贝和 2 次 DMA 拷贝 。

文章插图
4.4 Sendfile + DMA gather copy
Linux2.4 引入,将内核空间的读缓冲区(read buffer)中对应的数据描述信息(内存地址、地址偏移量)记录到相应的网络缓冲区(socketbuffer)中,由 DMA 根据内存地址、地址偏移量将数据批量地从读缓冲区(read buffer)拷贝到网卡设备中,这样就省去了内核空间中仅剩的 1 次 CPU 拷贝操作,发生 2 次上下文切换、0 次 CPU 拷贝以及 2 次 DMA 拷贝;

文章插图
4.5 splice
Linux2.6.17 版本引入,在内核空间的读缓冲区(read buffer)和网络缓冲区(socket buffer)之间建立管道(pipeline),从而避免了两者之间的 CPU 拷贝操作,2 次上下文切换,0 次 CPU 拷贝以及 2 次 DMA 拷贝 。

文章插图
4.6 写时复制

文章插图
通过尽量延迟产生私有对象中的副本,写时复制最充分地利用了稀有的物理资源 。
4.7 JAVA 中零拷贝
MAppedByteBuffer:基于内存映射(mmap)这种零拷贝方式的提供的一种实现 。

文章插图
FileChannel 基于 sendfile 定义了 transferFrom 和 transferTo 两个抽象方法,它通过在通道和通道之间建立连接实现数据传输的 。

文章插图
五、参考
https://mp.weixin.qq.com/s/c81Fvws0J2tHjcdTgxvv6g
https://mp.weixin.qq.com/s/EDzFOo3gcivOe_RgipkTkQ
https://mp.weixin.qq.com/s/G6TfGbc4U8Zhv30wnN0HIg
https://mp.weixin.qq.com/s/r9RU4RoE-qrzXPAwiej5sw
推荐阅读
- 李沁|网传杨紫《青簪行》2023将播,男主真人补拍,还是AI换脸或虚拟人
- 虚拟光驱软件使用图文教程 虚拟光驱软件怎么用
- 虚拟机的作用知乎-虚拟机有什么好处和缺点?
- StampedLock:一个并发编程中非常重要的票据锁
- 女浩克|千呼万唤「超胆侠」终于登场!《女浩克》第7&8集彩蛋与细节分析!
- 虚拟内存能起到多大作用 电脑虚拟内存不足怎么办
- sd卡写保护了如何去掉? 手机内存卡被写保护
- 内存卡提示要格式化怎么办?
- 坐井观天的:进程 | 虚拟内存 | 虚拟地址
- 为什么不建议选512G内存手机?内行人给出了4个忠告,望周知
