请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

Java零拷贝问题

老师:请教您一个关于零拷贝的问题。
这个transferTo()方法。底层说是用的sendFile() 。数据上下文切换少,少复制数据。我用上面的代码测试,如果只是一个文件的话,那么飞快,当时当文件数是3个以上时候,就变得特别慢。每个文件几乎都很慢?这是什么原因。不清楚是操作系统限制。还是我的用法不对,或者说理解不对。在服务端程序里,多线程,高并发的 环境下,如何正确使用这个方法进行数据发送和写入呢?
图片描述

问题2:mmap的问题:
在mmap文件映射时候,如果写入的数据速度很快。规定超过一定大小重新建立新文件。那么旧的映射区就要关闭。
我自己写的关闭方法,我观察内存好像并没有很快清理完成。内存 会很快爆表,如果调用force强制刷盘的话,那么就和直接使用普通IO没有多少区别了。请问老师,如果在这种场景下应该如何保障内存不爆表,且写入性能高呢?
图片描述

希望老师百忙之中不吝赐教啊!!!

正在回答 回答被采纳积分+3

1回答

悟空 2021-03-09 17:02:33

同学,不好意思,由于术业有专攻,关于零拷贝的知识,目前我的理解还不够深,抱歉不能解答你的问题,我在网上找到了sendFile和mmap的区别:

mmap 适合小数据量读写,sendFile 适合大文件传输。

mmap 需要 4 次上下文切换,3 次数据拷贝;sendFile 需要 3 次上下文切换,最少 2 次数据拷贝。

sendFile 可以利用 DMA 方式,减少 CPU 拷贝,mmap 则不能(必须从内核拷贝到 Socket 缓冲区)。

推荐同学再去搜一下其他资料,来综合理解。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号