从read函数到零拷贝

操作系统分为“用户态”和“内核态”,文件操作、网络
操作需要涉及这两种形态的切换,免不了进行数据复制,一台服务器把本机磁 盘文件的内容发送到客户端 一般分为两个步骤:
1 ) read(file, tmp buf, len);,读取本地文件内容;
2) write(socket, tmp_buf, len);,,将读取的内容通过网络发送出去。
tmp_buf是预先申请的内存,这两个看似简单的操作,实际进行了 4 次数 据复制,分别是:从磁盘复制数据到内核态内存,从内核态内存复制到用户 态内存(完成了 read(file, tmp_b叫 len));然后从用户态内存复制到网络驱动 的内核态内存,最后是从网络驱动的内核态内存复制到网卡中进行传输(完成write(socket, tmp_buf, len)) 。


通过使用 mmap 的方式,可以省去向用户态的内存复制,提高速度。 这 种机制在 Java 中是通过 MappedByteBuffer 实现的,具体可以参考 Java 7 的文 档: https:// docs.oracle.com/j avase/7 I docs/api/j ava/nio/MappedByteBuffer.html。 RocketMQ 充分利用了上述特性,也就是所谓的“零拷贝”技术,提高消息存 盘和网络发送的速度。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章