rocketmq中零拷贝深入

来源:互联网 发布:淘宝黑曜石哪家好 编辑:程序博客网 时间:2024/06/07 01:57
比较好的文章:http://www.linuxjournal.com/article/6345?page=0,2

所谓零拷贝,指的是应用内存与内核内存不存在拷贝。
对应零拷贝技术有mmap及sendfile。

一.mmap优点:
小文件传输快,需要四次用户态与内核态的切换。文件到内核缓存,内核缓存到socket buffer,socket buffer到网卡内存。cpu介入多,用户态与内核态切换多。
分成两个阶段,
阶段一:调用map方法,建立用户进程与内核内存的映射,映射范围是某个文件。这个是阻塞的。
阶段二:调用write方法,将之前建立的映射,写到socket。
阶段二可以设计成nio形式。实现就是将要写的内容封装成消息发给io线程。io线程异步去做。这方面netty框架就是这么做的。



二.sendfile优点:
大文件传输比mmap快,原因是只存在二次用户态与内核态的切换。并且之后少了内核缓存到socket buffer的拷贝。
分成一个阶段:
发送者阻塞调用sendfile方法,sendfile(socket, file, len);
接着会完成file到内核缓存,内核缓存拷贝个消息在内核缓存的地址到socket buffer。然后dma从socket buffer指示的内核缓存拷贝数据到网卡内存。
这里分成一个阶段,优点很明显少了用户态与内核态切换,及内核到socket buffer的拷贝,并且相应的cpu介入少了。但缺点也是因为这个原因,导致不能nio进行消息发送。





原创粉丝点击