【基础知识思考整理 】Zero-copy原理理解(用户角度)
基础知识思考整理
http://blog.csdn.net/aganlengzi/article/details/53332877
关于Zero-Copy的原理。主要参照的是一篇03年的文章[1](Linux Journal),原理讲得很明白。
首先需要知道应用场景:
适用于静态资源从磁盘到网络的发送(中间不对资源进行改变),这在web server提供的功能中很常见,一个例子是:保存在磁盘上的一张图片应某个网络请求被从磁盘中取出并通过socket发送至请求方。
Linux系统分为user space和kernel space,user space中的很多操作需要通过系统调用陷入到内核中操作,比如文件读取操作。程序员通过某种编程语言提供的编程接口进行文件读取操作,比如C中的read,这个C语言的实现是通过调用kernel space提供的系统调用read实现的。在从user space陷入到kernel space的过程中,需要进行contex switch。同理,在从kernel space到user space的过程中也需要进行contex switch。
网络端口发送数据的时候,有一块socket buffer作为要发送数据的缓存,然后驱动从其中读取数据并组包发送。
对于上述的一张图片的请求和发送,从操作结果或者效果的角度看:我需要做的是将磁盘中的一部分数据直接(不加改变地)搬运到socket的buffer中进行组包再送到发送队列中等待发送的。可以想到:我们从user space发起任务到回到user space,至少要经历两次contex switch,数据从磁盘到发送队列,至少也要经过两次copy(磁盘到socket buffer和socket buffer到发送队列)。
Zero在我的理解中是指在上述过程中不存在多余copy的技术。
怎么会存在多余的copy呢?多余的copy有什么坏处吗?直接按照上述的过程进行不是就能够做到没有多余copy了吗?
多余的copy应该是软硬件历史的原因,这在后面的zero-copy的发展过程中可以看到。多余的copy会占用CPU时间片和内存带宽,造成系统性能的降低。Zero-copy就是想做到上述的过程,即最直观的过程。需要说明的是,并不是所有的数据的传输都适用zero-copy的,而且很大程度上不适用zero-copy的计算要比这种数据传输的应用要多得多,我们必须意识到这中占大多数应用的存在,毕竟使用计算机做的事情并不仅限于存储和传输。个人感觉zero-copy是一种具体问题具体分析和精细化功能实现以换取性能的过程。
我们来看看历史上对上述一张图片的响应的实现方式的变化:
实现1:contex switch 4次,copy 4次
read(file, tmp_buf, len);
write(socket, tmp_buf, len);
上面是系统调用,下面是内存copy。这种方式没有什么可说的,是没有技巧性的中规中矩做法。
实现2:contex switch 4次,copy 3次
tmp_buf = mmap(file, len);
write(socket, tmp_buf, len);
使用mmap在kernel space和user space之间构造了一块共享内存空间,相当于user space和kernel space都是访问统一块物理内存(但是在user space和kernel space中分别被映射到各自的虚拟地址空间中)。这种方式因为这块共享内存会产生问题:当另一个进程操作同一个文件的时候,文件更改,kernel buffer中的内容相当于失效,此时,SIGBUS总线错误会终止之前的进程并产生core错误。解决的方法可以是设置信号的处理函数,但是这种方式可能会屏蔽掉真正发生错误的情况;或者是对操作的文件进行类似于加锁的操作(读写锁等)。或者如果真的想减少copy次数,只能让操作系统内核和硬件进行支持了,这就是后面的实现。
实现3:contex switch 2次,copy 3次
sendfile(socket, file, len); //since kernel 2.1
新的系统调用被添加到linux kernel中以支持文件间的copy操作,主要是不用在不必要的时候bother user space。这种方式的好处是减少了contex switch的次数,但是实际上对于实现2中存在的另一个进程修改使用的同一个文件的情况并不能很好地解决。
实现4:contex switch 2次,copy 2次
sendfile(socket, file, len); //since kernel 2.4
在这种方式中,socket适应实现3的方式,并且获得了硬件的相关的支持,在实现3中的第2步的copy在这种方式中只是copy了必要的描述信息:文件描述符和长度。相比于要copy的数据来说,这大大减少了copy需要的时间。
上述基本是对Zero-copy的理解,相关的内容可能比较老旧,在新版本的kernel中可能已经改变,但是不影响对原理的理解。如果后面涉及到相关的知识,比如说在不同编程语言中的使用等,再进行相应补充。
#include <sys/socket.h>
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
参考
[0] https://en.wikipedia.org/wiki/Zero-copy
[1] http://www.linuxjournal.com/article/6345?page=0,2
[2] https://segmentfault.com/a/1190000006114818
[3] http://www.ibm.com/developerworks/cn/linux/l-cn-zerocopy1/
[4] https://www.ibm.com/developerworks/cn/linux/l-cn-zerocopy2/
【基础知识思考整理 】Zero-copy原理理解(用户角度)相关推荐
- 计算机图形学最基本知识,计算机图形学基础知识重点整理.doc
计算机图形学基础知识重点整理 计算机图形学复习资料 第一章 1 图形学定义 ISO的定义:计算机图形学是研究怎样利用计算机表示.生成.处理和显示图形的原理.算法.方法和技术的一门学科. 通俗定义:计算 ...
- numeric比较大小 数据库_数据库基础知识个人整理版-强烈推荐
<数据库基础知识个人整理版-强烈推荐>由会员分享,可在线阅读,更多相关<数据库基础知识个人整理版-强烈推荐(20页珍藏版)>请在人人文库网上搜索. 1.数据库知识要点总结第一章 ...
- 基础知识:电容充电放电原理
标签: 电容 基础知识:电容充电放电原理 电容是一种以电场形式储存能量的无源器件.在有需要的时候,电容能够把储存的能量释出至电路.电容由两块导电的平行板构成,在板之间填充上绝缘物质或介电物质.图1和图 ...
- 炒股入门基础知识之指标公式江恩八线和角度指标解释
对于大多数炒股新人来说都不是很清楚江恩八线和江恩理论,今天就和炒股新人分享一下,炒股入门基础知识之指标公式江恩八线的角度和指标解释,首先先分享一下什么是江恩八线,江恩八线和江恩角的定义: 由Willi ...
- [C#基础知识系列]专题十七:深入理解动态类型
本专题概要: 动态类型介绍 为什么需要动态类型 动态类型的使用 动态类型背后的故事 动态类型的约束 实现动态行为 总结 引言: 终于迎来了我们C# 4中特性了,C# 4主要有两方面的改善--Com 互 ...
- java i 底层原理,《Java基础知识》Java Hash底层原理
前言 了解到JDK8对HashMap进行了优化,就一起了解一下JDK8的HashMap. 原理 1. 哈希表的原理 首先需要一张Hash表,Java通过数据实现:默认长度位16,并且. 第一步插入张三 ...
- 计算机基础知识思考doxc,2021第1章计算机基础知识.docx
第 1 章 计算机基础知识 本章主要内容包括: 计算机的概述 计算机系统的基本组成 键盘的使用和指法 计算机安全 1.1计算机的概述 1.1.1计算机的发展简史 1 ?计算机的概念 计算机是一种能够自 ...
- 【深度学习基础知识 - 07】BN的原理和作用
Batch Normalization也是深度学习中的一个高频词汇,这篇文章将会对其做一个简单介绍. 目录 1. BN的原理 2. BN的作用 3. BN层的可学习参数 4. infer时BN的处理 ...
- 基础知识 | 对目标检测认识及理解
本文分享自华为云社区<目标检测基础知识>,原文作者:lutianfei . 图片分类任务我们已经熟悉了,就是算法对其中的对象进行分类.而今天我们要了解构建神经网络的另一个问题,即目标检测问 ...
最新文章
- Manifest merger failed with multiple errors, see logs
- Windows server 2003 DNS 全攻略(一)
- BC:带你温习并解读《中国区块链技术和应用发展白皮书》—区块链标准体系框架
- 大牛书单 | 迎金秋,与腾讯技术大咖共读好书
- how to find data source of F4 help in web client UI
- grid比flex更强大的属性
- 轻松实现无刷新三级联动菜单[VS2005与AjaxPro]
- 什么是runtime?
- 简明扼要的反射入门教程
- python中astr是啥_python的基本操作
- struts 的action 线性安全问题
- datetime类型保存的时间比实际时间少8小时
- poj 3304 Segments
- vs2015编译vtk
- 云医在线服务器不可用,云医在线app
- EasyRecovery 15 mac中文免费密钥数据恢复 安装软件的方法教程及版本对比
- xxl-job新增执行器
- 【解决方案】智慧工地AI视频远程集中监控解决方案是如何通过EasyCVR视频平台实现的?
- 转载:MATLAB字符串函数
- Nginx限制客户端连接并发及限流的理解