- 传统I/O : 硬盘—>内核缓冲区—>用户缓冲区—>内核 Socket 缓冲区—>协议引擎
- sendfile :硬盘—>内核缓冲区—>内核 Socket 缓冲区—>协议引擎
-
sendfile(DMA 收集拷贝):硬盘—>内核缓冲区—>协议引擎
零拷贝(Zero-Copy):一种高效的数据传输机制
- mmap + write
- sendfile
1、传统的数据传输方式(四次上下文切换,四次拷贝)
从某台机器将一份数据通过网络传输到另一台机器,通过Java语言简单描述就是:
public static void transfer() throws IOException {
Socket socket = new Socket(HOST, PORT);
InputStream in = new FileInputStream(FILE_PATH);
OutputStream out = new DataOutputStream(socket.getOutputStream());
byte[] buffer = new byte[1024];
while (in.read(buffer) != -1) {
// 将数据写到 Socket
out.write(buffer);
}
out.close();
socket.close();
in.close();
}
虽然代码操作看起来很简单,但是深入到操作系统层面,就会发现实际的微观操作相当复杂;具体步骤:
- JVM 向 OS 发出 read() 系统调用,触发上下文切换,从用户态切换到内核态
- 从外部存储(如:磁盘)读取文件内容