什么是零拷贝?


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次

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值