mmap 相比 sendFile 有什么优势?

ponponon
  • 316

看到一篇文章:什么是零拷贝?mmap与sendFile的区别是什么?

再稍微讲讲 mmap 和 sendFile 的区别。

mmap 适合小数据量读写,sendFile 适合大文件传输。
mmap 需要 4 次上下文切换,3 次数据拷贝;sendFile 需要 3 次上下文切换,最少 2 次数据拷贝。
sendFile 可以利用 DMA 方式,减少 CPU 拷贝,mmap 则不能(必须从内核拷贝到 Socket 缓冲区)。

在这个选择上:rocketMQ 在消费消息时,使用了 mmap。kafka 使用了 sendFile。

感觉 sendFile 完胜 mmap 呀?

回复
阅读 168
1 个回答

sendFile相当于是原汁原味地读写,直接将硬盘上的文件送给网卡,但这种方式并不一定对所有场景都适用,比如如果你需要从硬盘上读取文件,然后经过一定修改之后再送给网卡的情况下,就不适合用sendFile。

对于RocketMQ来说,因为RocketMQ将所有队列的数据都写入了CommitLog,消费者批量消费时需要读出来进行应用层过滤,所以就不能利用到sendfile+DMA的零拷贝方式,而只能用mmap。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏