首页   快速返回

sendfile 零拷贝机制     所属分类 architecture
普通的网络传输步骤

操作系统将数据从磁盘复制到操作系统内核的页缓存中
应用将数据从内核缓存复制到应用的缓存中
应用将数据写回内核的Socket缓存中
操作系统将数据从Socket缓存区复制到网卡缓存,然后将其通过网络发出

数据从内核模式到用户模式走了一圈,浪费了两次copy


通过sendfile传送文件只需要一次系统调用 
将数据从磁盘读取到kernel buffer中
将数据从kernel buffer copy到sokcet buffer中
将socket buffer中数据copy到网卡buffer中发送

Linux2.4内核对sendfile做了进一步改进

将磁盘数据copy到kernel buffer中
向socket buffer中追加当前要发送的数据在kernel buffer中的位置和偏移量
根据socket buffer中的位置和偏移量直接将kernel buffer中的数据copy到网卡上


Java中的零拷贝
FileChannel.transferTo()

NIO
FileChannel.transferTo(long position, long count, WriteableByteChannel target)

上一篇     下一篇
java版hyperLogLog

磁盘io与直接io

Linux IO sync fsync与fdatasync

区块链简介

文字与货币

内存映射文件