IO数据拷贝的几种方式——传统、mmap、sendFile、splice

IO数据拷贝的几种方式——传统、mmap、sendFile、splice

1. 传统IO数据拷贝方式

img
该方式下进行一次读写操作,操作系统产生了四次状态切换和四次拷贝(两次DMA两次CPU)。

2. mmap方式

mmap方法利用了操作系统虚拟内存技术,通过虚拟内存技术让用户堆缓存和内核空间的页表缓存指向同一物理地址空间,从而实现了内存映射。

在该方式下进行一次读写,操作系统产生了四次状态切换和三次拷贝(两次DMA一次CPU)。
该方式在Java中仅有一处实现,通过 FileChannelmap 函数获取 MappedByteBuffer 对象,该对象将文件数据和缓冲区进行了绑定,通过对该缓存对象进行读写,即可完成读写文件操作。
img

3. sendFile方式

Java 1.4引入了 NIO,其中 FileChannel类的 transferTo方法采用了sendFile方式来进行数据传输,而sendFile是操作系统提供的方法,可实现通道间的高效数据传输。

其中sendFile有好几个版本,早期版本中(Linux 2.1以后),sendFile仍需从页表缓存到Socket缓存的CPU拷贝。但从Linux 2.4开始,提供了带有Scatter/Gather的sendFile操作,在进行页表缓存到Socket缓存的拷贝时,仅拷贝了长度、偏移量等信息,没有对数据进行拷贝。流程如下图:
img

4. splice方式

Linux 2.6.17版本引入了splice方式,用户程序只需要提供两个已经打开的文件描述符,splice允许任意两个文件之间的连接,不限于从文件到socket,因此sendFile只是splice的一个子集。且sendFile需要硬件提供支持,而splice不需要硬件支持。


__EOF__

本文作者ZOLMK
本文链接https://www.cnblogs.com/zolmk/p/17535444.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   zolmk  阅读(335)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示