博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Zero Copy
阅读量:6654 次
发布时间:2019-06-25

本文共 1372 字,大约阅读时间需要 4 分钟。

原文出处: http://www.ibm.com/developerworks/library/j-zerocopy/

 

传统的I/O

使用传统的I/O程序读取文件内容, 并写入到另一个文件(或Socket), 如下程序:

File.read(fileDesc, buf, len);Socket.send(socket, buf, len);

会有较大的性能开销, 主要表现在一下两方面:

1. 上下文切换(context switch), 此处有4次用户态和内核态的切换

2. Buffer内存开销, 一个是应用程序buffer, 另一个是系统读取buffer以及socket buffer

其运行示意图如下

 

1) 先将文件内容从磁盘中拷贝到操作系统buffer

2) 再从操作系统buffer拷贝到程序应用buffer

3) 从程序buffer拷贝到socket buffer

4) 从socket buffer拷贝到协议引擎.

 

这是上下文切换图

1) 调用read(), 程序切换到内核态

2) read()调用完毕, 返回数据, 程序切换回用户态

3) 调用send(), 程序切换到内核态

4) send()完毕, 程序切换回用户态

 

操作系统使用 read buffer 的好处是"预读", 当你的程序需要对文件数据做处理, 并且每次读取的数据小于read buffer 的时候, 可以先将多数数据预读到 read buffer, 这样程序在读取的时候效率会更高. 但是当你需要读取的数据大于操作系统的read buffer的时候, read buffer则会成为累赘.

另外, 在你的程序不需要处理数据, 而仅仅只是做数据转移的时候, 程序buffer则会成为不必要的开销.

上面会涉及到多次上下文切换以及多次数据拷贝, 很大一部分cpu及内存开销是可以避免的, 于是有了zerocopy技术. 

 

ZeroCopy

zerocopy技术省去了将操作系统的read buffer拷贝到程序的buffer, 以及从程序buffer拷贝到socket buffer的步骤, 直接将 read buffer 拷贝到 socket buffer. java 的 FileChannel.transferTo() 方法就是这样的实现, 这个实现是依赖于操作系统底层的sendFile()实现的.

public void transferTo(long position, long count, WritableByteChannel target);

他的底层调用的是系统调用sendFile()方法

#include 
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

如下图

 

 

这样, 省去了两次buffer的copy, 并且上下文切换降到了2次(调用transferTo()进入内核态, 调用完毕返回用户态)

Linux 2.4 及以后的内核, 又做了改进, 不再使用socket buffer, 而是直接将read buffer数据拷贝到协议引擎, 而socket buffer只会记录数据位置的描述符和数据长度,如下

 

 

 

转载地址:http://nyjto.baihongyu.com/

你可能感兴趣的文章
2018/03/31
查看>>
ruby学习笔记-基础数据类型
查看>>
nodejs + express windows xp下安装
查看>>
OSChina 周四乱弹 —— 做出这题,分分钟当公务员
查看>>
湖南省第八届大学生计算机程序设计竞赛试题 题目A 三家人 (未测试)
查看>>
MongoDB 下载 安装 启动
查看>>
sharepoint server 2007 可以使用域名访问网站,但无法使用服务器名访问
查看>>
高效会议管理技巧
查看>>
Java 线程状态之 BLOCKED
查看>>
The method of type must override a superclass method解决方式
查看>>
正则表达式——分支条件
查看>>
我的友情链接
查看>>
【小松教你手游开发】【unity实用技能】unity ios快捷打包
查看>>
golang 使用时间通过md5生成token
查看>>
caffe编译的问题解决:“cublas_v2.h: No such file or directory”
查看>>
40岁后才明白的道理:人一生奋斗余地很有限
查看>>
redis进阶
查看>>
Vue相关UI框架整理
查看>>
Eclipse安装SVN
查看>>
正则符号整理
查看>>