网站开发技术实验4盒子模型,中国公关公司前十名,个人ip打造范文,招远网站建设招聘这是本人学习的总结#xff0c;主要学习资料如下
马士兵教育rocketMq官方文档 目录 1、零拷贝技术1.1、什么是零拷贝1.2、mmap()1.3、Java中的零拷贝 1、零拷贝技术
1.1、什么是零拷贝
使用传统的IO#xff0c;从硬盘读取数据然后发送到网络需要经过四个步骤。
通过DMA复…这是本人学习的总结主要学习资料如下
马士兵教育rocketMq官方文档 目录 1、零拷贝技术1.1、什么是零拷贝1.2、mmap()1.3、Java中的零拷贝 1、零拷贝技术
1.1、什么是零拷贝
使用传统的IO从硬盘读取数据然后发送到网络需要经过四个步骤。
通过DMA复制读取硬盘数据复制到系统的内核缓冲区。从内核缓冲区通过CPU将数据复制到应用程序缓冲区。这里涉及到内核态转用户态。从应用程序缓冲区通过CPU复制数据到套接字缓冲区。这里涉及到用户态转内核态。最后通过DMA从套接字缓冲区复制数据到网卡等网络设备。发送数据的事就交给网络设备。 DMADirect Memory Access可以说是一个可以直接访问磁盘等硬件的设备不过速度要比CPU要慢很多。
所以传统的IO有四次复制过程。零拷贝则是利用内存映射等技术减少其中的一两个拷贝过程大大提高效率。
1.2、mmap()
RocketMQ是通过mmap()内存映射技术来实现零拷贝。
mmap将磁盘上的文件位置和应用程序缓冲区做了一个一一对应的映射使应用程序可以像读取应用程序缓冲区一样直接读取到磁盘的文件内容。
使用了mmap后就可以省去一次DMA的复制。变成下面的过程。
通过mmap复制数据到应用程序缓冲区。从应用程序缓冲区通过CPU复制数据到套接字缓冲区。这里涉及到用户态转内核态。最后通过DMA从套接字缓冲区复制数据到网卡等网络设备。发送数据的事就交给网络设备。 1.3、Java中的零拷贝
Java中可以通过MappedByteBuffer来实现mmap但是这种方式一次最多只能映射1.5 ~ 2G的文件这也是RocketMQ的单个CommitLog文件默认是1G的原因。
File file new File(path);
// 通过Channenl进行内存空间和磁盘空间的映射
FileChannel fileChannel new RandomAccessFile(file, rw).getChannel();
// 该Buffer就是映射空间可以看成是磁盘和内存共享的
MappedByteBuffer map fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, 1024);
// 写内容
mmap.put(Content.getBytes());
// 写内容到磁盘
mmap.flip();
byte[] bb new byte[4];
//读取数据
mmap.get(bb, 0, 4);
// 解除mmap
unmap(mmap);