零拷贝技术及其运用
一文彻底弄懂零拷贝原理以及java实现

⼀⽂彻底弄懂零拷贝原理以及java实现⽬录零拷贝传统I/O操作存在的性能问题零拷贝技术原理虚拟内存mmap/write ⽅式sendfile ⽅式带有 scatter/gather 的 sendfile⽅式splice ⽅式总结零拷贝零拷贝(Zero-Copy)是⼀种 I/O 操作优化技术,可以快速⾼效地将数据从⽂件系统移动到⽹络接⼝,⽽不需要将其从内核空间复制到⽤户空间。
其在 FTP 或者 HTTP 等协议中可以显著地提升性能。
但是需要注意的是,并不是所有的操作系统都⽀持这⼀特性,⽬前只有在使⽤ NIO 和 Epoll 传输时才可使⽤该特性。
需要注意,它不能⽤于实现了数据加密或者压缩的⽂件系统上,只有传输⽂件的原始内容。
这类原始内容也包括加密了的⽂件内容。
传统I/O操作存在的性能问题如果服务端要提供⽂件传输的功能,我们能想到的最简单的⽅式是:将磁盘上的⽂件读取出来,然后通过⽹络协议发送给客户端。
传统 I/O 的⼯作⽅式是,数据读取和写⼊是从⽤户空间到内核空间来回复制,⽽内核空间的数据是通过操作系统层⾯的 I/O 接⼝从磁盘读取或写⼊。
代码通常如下,⼀般会需要两个系统调⽤:read(file, tmp_buf, len);write(socket, tmp_buf, len);代码很简单,虽然就两⾏代码,但是这⾥⾯发⽣了不少的事情。
⾸先,期间共发⽣了 4 次⽤户态与内核态的上下⽂切换,因为发⽣了两次系统调⽤,⼀次是 read() ,⼀次是 write(),每次系统调⽤都得先从⽤户态切换到内核态,等内核完成任务后,再从内核态切换回⽤户态。
上下⽂切换到成本并不⼩,⼀次切换需要耗时⼏⼗纳秒到⼏微秒,虽然时间看上去很短,但是在⾼并发的场景下,这类时间容易被累积和放⼤,从⽽影响系统的性能。
其次,还发⽣了 4 次数据拷贝,其中两次是 DMA 的拷贝,另外两次则是通过 CPU 拷贝的,下⾯说⼀下这个过程:第⼀次拷贝,把磁盘上的数据拷贝到操作系统内核的缓冲区⾥,这个拷贝的过程是通过 DMA 搬运的。
Linux 中的零拷贝技术

Linux 中的零拷贝技术概述黄晓晨, 软件工程师, IBM黄晓晨,IBM system Z 自动化技术支持软件工程师。
冯瑞, 软件工程师, IBM简介:本系列由两篇文章组成,介绍了当前用于Linux 操作系统上的几种零拷贝技术,简单描述了各种零拷贝技术的实现,以及它们的特点和适用场景。
本文是本系列文章的第一部分,主要是介绍一些零拷贝技术的相关背景知识,简要概述了Linux 为什么需要零拷贝技术以及Linux 中都有哪几种零拷贝技术。
引言传统的Linux 操作系统的标准I/O 接口是基于数据拷贝操作的,即I/O 操作会导致数据在操作系统内核地址空间的缓冲区和应用程序地址空间定义的缓冲区之间进行传输。
这样做最大的好处是可以减少磁盘I/O 的操作,因为如果所请求的数据已经存放在操作系统的高速缓冲存储器中,那么就不需要再进行实际的物理磁盘I/O 操作。
但是数据传输过程中的数据拷贝操作却导致了极大的CPU 开销,限制了操作系统有效进行数据传输操作的能力。
零拷贝(zero-copy )这种技术可以有效地改善数据传输的性能,在内核驱动程序(比如网络堆栈或者磁盘存储驱动程序)处理I/O 数据的时候,零拷贝技术可以在某种程度上减少甚至完全避免不必要CPU 数据拷贝操作。
现代的CPU 和存储体系结构提供了很多特征可以有效地实现零拷贝技术,但是因为存储体系结构非常复杂,而且网络协议栈有时需要对数据进行必要的处理,所以零拷贝技术有可能会产生很多负面的影响,甚至会导致零拷贝技术自身的优点完全丧失。
为什么需要零拷贝技术如今,很多网络服务器都是基于客户端- 服务器这一模型的。
在这种模型中,客户端向服务器端请求数据或者服务;服务器端则需要响应客户端发出的请求,并为客户端提供它所需要的数据。
随着网络服务的逐渐普及,video 这类应用程序发展迅速。
当今的计算机系统已经具备足够的能力去处理video 这类应用程序对客户端所造成的重负荷,但是对于服务器端来说,它应付由video 这类应用程序引起的网络通信量就显得捉襟见肘了。
Linux 中的零拷贝技术,第 2 部分

Linux 中的直接I/O如果应用程序可以直接访问网络接口存储,那么在应用程序访问数据之前存储总线就不需要被遍历,数据传输所引起的开销将会是最小的。
应用程序或者运行在用户模式下的库函数可以直接访问硬件设备的存储,操作系统内核除了进行必要的虚拟存储配置工作之外,不参与数据传输过程中的其它任何事情。
直接I/O 使得数据可以直接在应用程序和外围设备之间进行传输,完全不需要操作系统内核页缓存的支持。
关于直接I/O 技术的具体实现细节可以参看developerWorks 上的另一篇文章”Linux 中直接I/O 机制的介绍” ,本文不做过多描述。
图 1. 使用直接I/O 的数据传输针对数据传输不需要经过应用程序地址空间的零拷贝技术利用mmap()在Linux 中,减少拷贝次数的一种方法是调用mmap() 来代替调用read,比如:首先,应用程序调用了mmap() 之后,数据会先通过DMA 拷贝到操作系统内核的缓冲区中去。
接着,应用程序跟操作系统共享这个缓冲区,这样,操作系统内核和应用程序存储空间就不需要再进行任何的数据拷贝操作。
应用程序调用了write() 之后,操作系统内核将数据从原来的内核缓冲区中拷贝到与socket 相关的内核缓冲区中。
接下来,数据从内核socket 缓冲区拷贝到协议引擎中去,这是第三次数据拷贝操作。
图 2. 利用mmap() 代替read()通过使用mmap() 来代替read(), 已经可以减半操作系统需要进行数据拷贝的次数。
当大量数据需要传输的时候,这样做就会有一个比较好的效率。
但是,这种改进也是需要代价的,使用mma()p 其实是存在潜在的问题的。
当对文件进行了内存映射,然后调用write() 系统调用,如果此时其他的进程截断了这个文件,那么write() 系统调用将会被总线错误信号SIGBUS 中断,因为此时正在执行的是一个错误的存储访问。
这个信号将会导致进程被杀死,解决这个问题可以通过以下这两种方法:1.为SIGBUS 安装一个新的信号处理器,这样,write() 系统调用在它被中断之前就返回已经写入的字节数目,errno 会被设置成success。
高性能IO背后原理-零拷贝(zerocopy)技术概述

高性能IO背后原理-零拷贝(zerocopy)技术概述预备知识关于I/O内存映射。
设备通过控制总线,数据总线,状态总线与CPU相连。
控制总数传送控制信号。
在传统的操作中,都是通过读写设备寄存器的值来实现。
但是这样耗费了CPU时钟。
而且每取一次值都要读取设备寄存器,造成了效率的低下。
在现代操作系统中。
引用了I/O内存映射。
即把寄存器的值映身到主存。
对设备寄存器的操作,转换为对主存的操作,这样极大的提高了效率。
关于DMA传统的处理方法为:当设备接收到数据,向CPU报告中断。
CPU处理中断,CPU把数据从设备的寄存器数据读到内存。
在现代操作系统中引入的DMA设备,设备接收到数据时,把数据放至DMA内存,再向CPU产生中断。
这样节省了大量的CPU时间什么是零拷贝?零拷贝描述的是CPU不执行拷贝数据从一个存储区域到另一个存储区域的任务,这通常用于通过网络传输一个文件时以减少CPU周期和内存带宽。
避免数据拷贝避免操作系统内核缓冲区之间进行数据拷贝操作。
避免操作系统内核和用户应用程序地址空间这两者之间进行数据拷贝操作。
用户应用程序可以避开操作系统直接访问硬件存储。
零拷贝给我们带来的好处减少甚至完全避免不必要的CPU拷贝,从而让CPU解脱出来去执行其他的任务减少内存带宽的占用通常零拷贝技术还能够减少用户空间和操作系统内核空间之间的上下文切换零拷贝完全依赖于操作系统。
操作系统支持通过sendfile实现的零拷贝I/Osendfile(socket, file, len);//file可以是文件句柄,也可以是socket句柄把文件数据通过网络发送出去,减少了上下文的切换,内核的缓存数据到直接网卡数据也不用CPU去复制,由DMA完成第1步发出sendfile系统调用,导致用户空间到内核空间的上下文切换(第一次上下文切换)。
第2步通过DMA将磁盘文件中的内容拷贝到内核空间缓冲区中(第一次拷贝: hard driver ——>kernel buffer)。
程序员面试之零拷贝技术解析

程序员面试之零拷贝技术解析Hey guys,这里是程序员cxuan,欢迎你收看我最新一期的文章,这篇文章给大家分享一篇非常优质的文章-零拷贝技术,零拷贝技术也是面试常考的一个点,比较重要,而这篇文章恰好的解决了所有的疑惑,推荐给你。
1.数据的四次拷贝与四次上下文切换很多应用程序在面临客户端请求时,可以等价为进行如下的系统调用:1.File.read(file,buf,len);2.Socket.send(socket,buf,len);例如消息中间件Kafka就是这个应用场景,从磁盘中读取一批消息后原封不动地写入网卡(NIC,Network interface controller)进行发送。
在没有任何优化技术使用的背景下,操作系统为此会进行4次数据拷贝,以及4次上下文切换,如下图所示:如果没有优化,读取磁盘数据,再通过网卡传输的场景性能比较差:4次copy:1.CPU负责将数据从磁盘搬运到内核空间的Page Cache中;2.CPU负责将数据从内核空间的Socket缓冲区搬运到的网络中;3.CPU负责将数据从内核空间的Page Cache搬运到用户空间的缓冲区;4.CPU负责将数据从用户空间的缓冲区搬运到内核空间的Socket缓冲区中;4次上下文切换:1.read系统调用时:用户态切换到内核态;2.read系统调用完毕:内核态切换回用户态;3.write系统调用时:用户态切换到内核态;4.write系统调用完毕:内核态切换回用户态;我们不免发出抱怨:1.CPU全程负责内存内的数据拷贝还可以接受,因为效率还算可以接受,但是如果要全程负责内存与磁盘、网络的数据拷贝,这将难以接受,因为磁盘、网卡的速度远小于内存,内存又远远小于CPU;2.4次copy太多了,4次上下文切换也太频繁了;2.DMA参与下的数据四次拷贝DMA技术很容易理解,本质上,DMA技术就是我们在主板上放一块独立的芯片。
在进行内存和I/O设备的数据传输的时候,我们不再通过CPU 来控制数据传输,而直接通过DMA控制器(DMA Controller,简称DMAC)。
零拷贝技术在网络行为分析系统中的应用与改进

14622010,31(7)计算机工程与设计Computer Engineering and Design0引言由于网络开始充斥着生活的每一个角落,越来越多的网络业务也开始层出不穷的出现在人们面前,在线电视,网上聊天,电子商务等,对于电信运营商来说与日俱增的带宽压力是目前最需要解决的问题,而在可利用的带宽资源里面,又有很大的一部分被BT ,电驴等P2P 业务大量吞噬,在这种网络环境下面,网络行为管理系统应运而生。
网络行为分析系统架设在互联网出口,对网内所有计算机的网络行为进行分析、调整和管理。
它要对所有流经系统的IP 数据包进行分析,在千兆乃至万兆的网络环境里面,这个工作量是相当繁重的。
因此,如何对高速数据流进行处理是提升网络行为分析系统性能的关键点之一。
本文中的网络行为分析系统设计时采用Linux 操作系统,因为操作系统对内存的保护,用户程序无法直接读写处于内核空间的数据,如果无法高效的解决这个问题,必然会影响到网络行为管理系统的吞吐量和时延等性能。
本文从千兆网络环境下网络行为分析系统的性能瓶颈出发,分析了现有的解决方案,在与现有技术比较的基础上采用一种改进型的零拷贝技术,实现网络行为分析系统性能上的优化。
1网络行为分析系统的介绍我们设计的网络行为分析系统采用freescale 公司的MPC8572E 网络处理器,该处理器带有TLU (查找表单元)和PME (模式匹配引擎)两个硬件模块,适用于高速网络环境下网络协议的分析处理[1],操作系统采用Linux 。
系统采用DPI 即深度包检测技术,该技术深入到数据包的应用层来进行协议的识别、分析。
系统软件可以分为数据平面和识别平面两部分。
数据平面负责捕获网络数据包,在对网络数据包进行解包、会话流跟踪、统计后有选择的将网络数据包送往识别模块的PME 处理,选择的依据是判断该会话流是否已经被识别,如无则发送到PME 模块,同时数据平面也要负责转发网络数据包;识别平面主要是对网络数据进行业务、协议的识别等,在本文中不为讨论重点。
多源零拷贝技术在数据存储中起到了怎样的作用?

多源零拷贝技术在数据存储中起到了怎样的作用? 在互联网、云计算、AI、大数据等新智能应用驱动的新数据时代下,数据存储作为一切其他数据行为的基础,扮演着越来越重要的角色。
浪潮软件定义存储AS13000通过模块化定义的方式,基于多源零拷贝技术实现多应用高效共享一套存储系统,提高数据应用效率。
云计算、大数据、AI、物联网等各种新智能应用不断涌现,带来数据需求的改变。
文件、对象等数据类型需求增多。
一方面,传统的文件系统存储服务正被企业广泛应用;另一方面,有着鲜明的互联网、大数据时代特点对象存储,也越来越受到互联网用户青睐。
每一种存储分别对应不同的访问协议,文件存储主要操作对象是文件和文件夹,例如NFS协议;对象存储协议则主要为S3、Swift。
浪潮软件定义存储AS13000的优势即在于,通过模块化定义的方式,实现了在同一存储系统中可以同时支持文件、对象等多种存储协议,让用户通过一套存储系统即可支持企业各种应用访问存储数据,大大节省TCO。
1什幺是对象存储? 对象存储是一种新的采用扁平数据的组织形式,并提供基于HTTP协议的RESTful接口访问的分布式存储系统。
它适用于一次写入,多次读取的非结构化数据存储的需求场景,例如文档、图像、视频等网络媒体文件。
在云计算与大数据时代,对象存储发展迅猛。
不过,目前业界的同类存储产品,每种存储系统只能提供1种或2种存储协议。
对于新增对象存储需求的用户,这就要求在多应用环境中必须部署2套或2套以上的存储系统,无疑增加了用户的初始投资,且增大了后期维护和管理的难度。
浪潮软件定义存储AS13000则通过所提供的多源零拷贝技术,实现了在线存储和大数据分析存储的统一融合。
企业的各种应用在存取数据时,无需在存储集群间进行数据拷贝,而是通过文件系统方便地访问对象存储的数据,同时还可以高效实现大数据的分析和挖掘。
2对象存储:通过多源零拷贝技术,共享一套存储 多源零拷贝技术,是通过对NFS协议、HDFS文件协议和S3/Swift对象协议多种存储协议的融合,来实现多应用存取数据共享一套存储系统的先进技术。
rocketmq零拷贝原理

rocketmq零拷贝原理一、零拷贝技术概述零拷贝技术是一种高效且可靠的数据传输方式。
通过减少不必要的数据拷贝操作,降低了CPU负载和内存使用,从而提升了传输效率与吞吐率。
在消息系统中,传输效率和吞吐率都是关键指标,因此零拷贝技术被广泛应用于消息传输领域。
而RocketMQ作为一款优秀的消息队列软件,在实现高效传输的过程中也运用了零拷贝技术。
二、RocketMQ零拷贝原理在消息队列中,数据往往需要从生产者发送到消费者。
在传输过程中,如果每次都需要先将数据从内存中拷贝至操作系统内核空间,再从内核空间拷贝至接收缓冲区,最后再拷贝至用户空间,这种数据复制机制就会导致CPU的负载增加,同时也会占用大量内存。
而利用零拷贝技术,可以减少或者避免这种数据拷贝过程,从而提高传输效率。
RocketMQ的零拷贝原理是基于操作系统中的mmap技术实现的。
mmap是内核提供的一种在用户空间和内核空间之间共享内存的技术,可以将文件映射至内存中,从而实现文件与内存之间的数据交互。
在RocketMQ中,生产者和消费者都会利用mmap技术将消息内容映射到内存中。
具体过程如下:1. 生产者将待发送的消息写入内存中的writeBuffer,该buffer是基于堆内存的,即基于JVM内存的。
2. 生产者将writeBuffer中的待发送消息拷贝至直接内存中的sendBuffer。
这里直接内存指的是通过JVM提供的ByteBuffer.allocateDirect()方法所分配的内存区域,这种内存区域不受JVM垃圾回收机制的影响。
直接内存的好处在于可以减少数据拷贝的次数和内存使用量,从而提高了发送效率和性能。
3. 生产者将sendBuffer中的数据通过网络协议发送至RocketMQ服务器。
4. 服务器接收到消息后,将消息存储于磁盘上,并返回持久化消息的物理存储位置。
此时,生产者的sendBuffer中的消息实际上在内存中没有被删除,还可以供其他消息消费者使用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
零拷贝技术及其运用Zero-Copy Technique and its Usage李星辰夏浩茗廖山河Li Xingchen,Xia Haoming and Liao Shanhe摘要:零拷贝(zero-copy)是实现主机或路由器等设备高速网络接口的主要技术。
零拷贝技术通过减少或消除关键通信路径影响速度的操作,降低数据传输的操作系统开销和协议处理开销,从而有效提高通信性能,实现高速数据传输。
Abstract: Zero-copy is an important technology to realize high-speed network interfacing forhosts and routers. It achieves high-speed data transfer through decreasing the overhead ofdata transm issioncaused by the operating system and transm ission protocols. Itsmain idea is to reduce orelim inate somemanipulations that affect speed in the critical transm ission path.关键词: 零拷贝; 高速网络接口; 操作系统; 协议; 网络处理器; RAID;Keywords: zero-copy; high-speed network interfacing; OS; protocol;network conductor;RAID1引言新的应用需求如多媒体、VOD以及WEB服务等加重了通信负载,要求网络具有更多的带宽和更短的传输延迟。
高速网络链路技术(SDH、光互连等)的发展提供了高带宽的网络。
信息传输更加关注数据从主机或其他设备到网络接口的有效移动。
零拷贝技术可以减少数据拷贝和共享总线操作的次数,消除通信数据在存储器之间不必要的中间拷贝过程,有效地提高通信效率,是设计高速接口通道、实现高速服务器和路由器的关键技术之一。
数据拷贝受制于传统的操作系统或通信协议,限制了通信性能。
采用零拷贝技术,通过减少数据拷贝次数,简化协议处理的层次,在应用和网络间提供更快的数据通路,可以有效地降低通信延迟,增加网络吞吐率。
零拷贝技术的主要研究涉及到数据的传输途径、传输控制、缓冲区管理机制、地址变换和地址空间的保护机制等设计问题,并且需要考虑与操作系统或协议的结合关系。
目前零拷贝技术的主要实现是用户级的高速网络通信接口。
2零拷贝的主要技术研究零拷贝技术的研究主要针对以下两个方面:(1)创建有效的用户级通信接口,即应用程序直接将数据从通信接口发送出去或接收进来,消除系统内核中不必要的拷贝过程; (2)路由器的入端到出端的直接数据传输,即接收的报文只经过一次存储器缓冲,而缓冲队列中的报文经过必要的控制信息处理后,直接传送到输出端口发送出去,实现报文快速转发。
用户级网络接口的设计和实现的关键在于应用和网络间的接口,为此需要考虑以下一些关键问题。
2.1数据传输机制通常,协议优化的数据传输过程至少涉及到三次传送。
每一个发送或接收数据的应用,其传输缓冲区在网络接口都有对应的传输描述块(发送或接收环中),它包含传输报文的目标地址、缓冲区起始地址和缓冲区大小等信息。
进一步优化则无需经过网络接口的存储,应用程序直接将数据从自己的缓冲区通过网络接口发送出去,不在NIC的存储器中停留;而接收端将收到的报文直接传送给应用处理,如图1所示。
主机至接口的数据传输机制可使用DMA或可编程I/O(PIO)方法。
PIO方式通常一次传送1~2个字,涉及到许多总线操作。
而DMA使用专门的DMA引擎突发性地传送整个报文,并可与主机并行操作。
用户进程和网络接口都可以启动DMA而无需操作系统的干预。
由于DMA 是异步完成的,操作系统在进行页交换时,可能会把正在进行DMA传输的信息交换出去,从而使部分传送的目标信息受到损坏。
解决这一问题的方法之一是让应用程序将用于数据传送的页帧固定于其地址空间,从而避开页交换。
接口至接口传输机制使用接口的DMA引擎或PIO发送和接收网络数据,采用DMA传输较快。
在流控方面,如果接收方没有取走数据,则发送方暂停网络接口数据的发送。
为了防止死锁,暂停有一个时间限制,如果接收方在该时间限制内没有取走所有阻塞的网络数据,则网络接口就会复位,放弃阻塞的报文。
为避免复位,接收方拷贝应足够快。
接收方网络接口至主机的传输同样可以使用DMA或PIO。
大多数协议都使用DMA,也有少数协议使用主机PIO接收小信息,而用DMA传送大块数据。
2.2地址变换技术集成应用和网络接口间的缓冲区管理带来了另外的问题,因为应用使用的是缓冲区的虚拟地址,而网络接口的DMA引擎则需要用物理存储器地址进行传输。
因此,必须有一个可信任的实体将虚拟地址变换为物理地址,再交给网络接口。
此外,操作系统必须跟踪接口用来进行DMA传输的内存页,以便保持映射的进行。
地址变换可采用: (1)由应用管理虚拟地址到物理地址的变换。
用户从操作系统取得内存区的映射,并使用其作为缓冲区,其优点是将所有映射装在网络接口后,即可使用简单查找实现变换,但应用必须小心而理智地管理其内存区。
(2)由网络接口完成虚拟地址到物理地址的变换。
用户可将其缓冲区设在其虚拟地址空间的任何地方,网络接口包含一个TLB,负责将<进程ID,虚拟地址>映射为物理页帧和读/写访问权。
(3)编制一个简单的内核附加模块实现虚拟地址到物理地址的变换。
用户负责固定其页帧并从该模块取得物理地址,该方法的缺点是网络接口无法检查其接收的物理地址的合法性。
解决方法之一是让网络接口与该内核模块协同以便跟踪有效的地址变换。
网络接口可以缓存部分有效地址变换,以便快速引用页帧。
当网络接口在其缓存中发现用户指定的地址变换时,就可以使用DMA直接访问。
当网络接口无法变换一个地址时,则产生一个中断,内核模块接收该中断,在页表中查找该地址,固定该页,并将变换信息传给网络接口。
2.3保护机制当初始化发送描述块时,如果多个应用共享网络接口,某个应用可能会破坏另一个应用的发送描述块。
可使用一部分网络接口存储器作为高速缓存,存放活跃的通信端点,将非活跃的端点存放于主机内存。
当一个进程想通过非活跃端点发送信息时,网络接口和操作系统协作激活该端点,将其状态移到网络接口存储器中。
另一种方法是将通信建立和数据传输分开。
在建立期间,操作系统介入完成保护检查以确保应用彼此不会相互干扰。
在数据传输期间,网络接口旁路操作系统并进行简单检查以加强保护。
2.4传输控制传输控制一般采用中断或轮询方式。
中断方式通常开销比较大,故需要结合一定形式的轮询。
轮询是一种快速而开销低的机制,能够及时检查到达信息。
方法之一:让网络接口在其存储器中设置标志,并让主机检测之。
由于I/O总线存在开销,这一方法是低效的。
方法之二:当信息到达时,网络接口将标志写入主机内存,主机就地进行轮询,减少I/O总线传输开销。
由于标志通常驻留于Cache中,这样,频繁执行轮询时,不成功的轮询就不会产生访存。
可以综合使用中断和轮询:在网络接口中设置一个轮询守护机制,当报文到达时,启动一个定时器,定时器计时到零时,如果主机还没有发出轮询,则产生一个中断。
2.5可靠性基于可靠网络假设的可靠性处理较简单,不需要重发和超时机制,罕见的错误可交由高层软件处理或者只设应答重发机制而不设超时机制。
对于信息量大的通信,系统可采用主机级信用卡机制实现流控:信用卡代表接收方的报文缓冲区量,必须执有接收方的信用卡,才能发送报文。
一旦发送方用完信用卡,则必须阻塞以等待新的信用卡。
基于网络不可靠的系统则在主机或网络接口中实现重发机制,设置定时器和应答处理。
2.6多播实现考虑可以将所有多播目的地址传送到网络接口,然后在网络接口将同一报文发往每一个多播目的。
这一方法在网络接口形成串行发送的瓶颈。
通过在网络接口转发多播报文,可有效地实现基于生成树的协议,当它与中断驱动的报文传递方式相结合时,则更加有效,因为它消除了转发路径上的中断处理代价。
3网络设备中零拷贝技术的实现3.1用户级网络接口设计实现3. 1. 1U-NetU-Net由美国康耐尔大学研制,是基于信息的用户级网络接口,它定义了一个很薄的软件层而对网络硬件呈现出一致的接口。
U-Νet描述硬件操作,直接提供给应用一个标准硬件接口。
在U-Net中,端节点作为应用进入网络的句柄,包含三个环形队列,分别保存各自的信息缓冲区描述块:发送队列、可接收信息的空闲队列和已接收信息的接收队列。
网络接口读取描述块,验证应用的目的地址,将虚拟缓冲区地址变换为物理地址,并使用DMA传送数据。
每一个端节点的队列只映射到对应进程的地址空间。
3. 1. 2VMMC-2和AM-Ⅱ由美国普林斯顿大学实现的VMMC-2和由伯克利大学实现的AM-Ⅱ(ActiveMessage)均使用通信原语与虚拟共享存储器结合的方法,消除了接收端的一次拷贝:将接收信息放入缓冲区并使应用程序可访问之,应用将其数据拷贝到最终目的以释放缓冲区。
AM-Ⅱ使用通信原语put将本地内存块传送给远端地址, get读取远端块。
只要发送者和接收者预先协调好远端内存地址,则无需接收方干预,即可将数据移动到最终位置。
VMMC-2使用了一个用户TLB (UTLB)进行存储管理,要求通信过程使用的内存必须先进行注册登记(固定)以避开内核的页交换。
3. 1. 3VIA虚拟接口体系结构VIA是用户级网络接口的工业标准。
在VIA中,进程首先打开VI(到网络的句柄),每一个VI有两个队列:发送和接收信息描述块链表,每一个描述块指向一个和多个缓存区。
信息发送后,VIA置描述块中的完成位,从而应用可最终释放描述块。
VIA也提供本地内存与远端内存间的直接传输,即远端DMA(RDMA)读和写。
VIA的地址变换机制位于网络接口,所有用于通信的内存(队列、描述块和缓冲区)在使用前必须进行注册。
注册一个内存区返回一个句柄,句柄和虚拟地址共同描述通信的区域。
3.2主机式路由器中的零拷贝实现基于主机的路由器采用商品化的主机平台和网络接口,它比专用路由器产品更为便宜,其安全性、可配置性和可编程性更好,常常作为路由测试床以及动态可重编程的路由器。
主机式路由器的主要缺点是缺乏高带宽接口的支持。
主机式路由器由主机和至少两块网络接口卡(NIC)组成。
每一块NIC都有一个DMA控制器和一些存储器。
DMA控制器管理从NIC RAM直接到主机RAM的数据传输,无需主机CPU 的干预。
在传统的基于主机的转发处理中,数据通路是低效的,因为报文必须拷贝两次:一次进入主机存储器,一次从主机存储器中拷贝出来。