title: java之零拷贝
categories: java基础
一、什么是零拷贝
零拷贝并不是完全的没有拷贝,而是CPU不进行拷贝操作,即CPU进行了零次拷贝
二、传统IO的拷贝次数
当我们从磁盘读取一个文件后通过socket发送出去,经过了几次拷贝呢
// 简答的示意代码,无法运行
FileInputStream fileInputStream = new FileInputStream("");
byte[] bytes = new byte[1024 * 8];
fileInputStream.read(bytes);
Socket socket = new Socket();
socket.getOutputStream().write(bytes);
收到操作系统的限制,应用程序在进行文件读操作时,数据都会先到达内核缓冲区,再到达应用程序,而写操作则相反,所以上述代码一次读写操作共经过四次拷贝
1. 拷贝次数

2. 模式切换次数(上下文)

三、零拷贝
零拷贝技术减少了从内核缓冲区拷贝到用户缓冲区的操作,减少了模式切换的次数(上下文切换),提高了性能
File file = new File("");
FileOutputStream fileOutputStream = new FileOutputStream(file);
FileChannel fileChannel = fileOutputStream.getChannel();
SocketChannel socketChannel = SocketChannel.open();
fileChannel.transferTo(0, fileChannel.size(), socketChannel);
1. 拷贝次数
拷贝次数从4次减少到三次,但仍有一次CPU拷贝,不是完美的零拷贝

2. 模式切换
模式切换次数从4次变成2次,大大提高了性能

四、优化的零拷贝
在linux2,4及以上版本中,内核中缓冲到缓冲的复制操作被减免了,是得只剩下两次DMA拷贝,没有了CPU拷贝,减少了CPU资源的浪费
1. 拷贝次数

2. 模式切换
同零拷贝的模式切换,2次
1108

被折叠的 条评论
为什么被折叠?



