原文:http://blog.csdn.net/jiangbo_hit/article/details/6146502
一、典型IO调用的问题
一个典型的web服务器传送静态文件(如CSS,JS,图片等)的过程如下:
read(file, tmp_buf, len);
write(socket, tmp_buf, len);
首先调用read将文件从磁盘读取到tmp_buf,然后调用write将tmp_buf写入到socket,在这过程中会出现四次数据copy,过程如图1所示
图1
1。当调用read系统调用时,通过DMA(Direct
Memory Access)将数据copy到内核模式
2。然后由CPU控制将内核模式数据copy到用户模式下的buffer中
3。read调用完成后,write调用首先将用户模式下buffer中的数据copy到内核模式下的socket
buffer中
4。最后通过DMA copy将内核模式下的socket
buffer中的数据copy到网卡设备中传送。
从上面的过程可以看出,数据白白从内核模式到用户模式走了一圈,浪费了两次copy,而这两次copy都是CPU
copy,即占用CPU资源。
二、Zero-Copy&Sendfile()
Linux 2.1版本内核引入了sendfile函数,用于将文件通过socket传送。
sendfile(socket, file, len);
该函数通过一次系统调用完成了文件的传送,减少了原来read/write方式的模式切换。此外更是减少了数据的copy,sendfile的详细过程图2所示:
图2
通过sendfile传送文件只需要一次系统调用,当调用sendfile时:
1。首先通过DMA copy将数据从磁盘读取到kernel
buffer中
2。然后通过CPU copy将数据从kernel
buffer copy到sokcet buffer中
3。最终通过DMA copy将socket
buffer中数据copy到网卡buffer中发送
sendfile与read/write方式相比,少了一次模式切换一次CPU
copy。但是从上述过程中也可以发现从kernel buffer中将数据copy到socket
buffer是没必要的。
为此,Linux2.4内核对sendfile做了改进,如图3所示
图3
改进后的处理过程如下:
1。DMA copy将磁盘数据copy到kernel buffer中
2。向socket buffer中追加当前要发送的数据在kernel buffer中的位置和偏移量
3。DMA gather copy根据socket buffer中的位置和偏移量直接将kernel buffer中的数据copy到网卡上。
经过上述过程,数据只经过了2次copy就从磁盘传送出去了。
(可能有人要纠结“不是说Zero-Copy么?怎么还有两次copy啊”,事实上这个Zero
copy是针对内核来讲的,数据在内核模式下是Zero-copy的。话说回来,文件本身在瓷盘上要真是完全Zero-copy就能传送,那才见鬼了
呢)。
当前许多高性能http server都引入了sendfile机制,如nginx,lighttpd等。
三、Java NIO中的transferTo()
Java NIO中
FileChannel.transferTo(long position, long count, WriteableByteChannel target)
方法将当前通道中的数据传送到目标通道target中,在支持Zero-Copy的linux系统中,transferTo()的实现依赖于sendfile()调用。
四、参考文档
《Zero Copy I: User-Mode Perspective》http://www.linuxjournal.com/article/6345?page=0,0
《Efficient data transfer through zero copy》http://www.ibm.com/developerworks/linux/library/j-zerocopy
《The C10K problem》http://www.kegel.com/c10k.html
分享到:
相关推荐
【Zero-Copy技术详解】 Zero-Copy是一种计算机编程技术,主要应用于网络传输和I/O操作,目的是提高数据处理效率,减少CPU的负载和上下文切换次数。在传统的数据传输过程中,数据需要经过多次复制,从硬盘到用户空间...
室内导航算法资料”聚焦于一种结合了多传感器融合的室内导航解决方案,利用微型惯性测量单元(MIMU)、零速度更新(Zero Velocity Update, ZUPT)以及步进距离估计(Pedestrian Dead Reckoning, PDR)技术。...
LyraNET的创新之处在于它实现了零拷贝(Zero-Copy)技术,旨在优化这一过程,提高嵌入式设备的网络性能。 零拷贝技术的核心思想是减少数据在内存中的复制次数,尤其是在内核空间与用户空间之间的拷贝。在LyraNET中...
Linux I/O 原理和 Zero-copy 技术全面揭秘 在现代的计算机系统中,尤其是在网络服务器领域,I/O(输入/输出)已经成为决定系统性能的关键因素。由于大多数网络应用基于客户端-服务端模型,大量的数据交换使得I/O...
Z-Blog和Z-BlogPHP,既是博客程序,也是CMS建站系统。已走过十余年风雨的她们,有着强大的可定制性、丰富的插件接口和独立的主题模板,致力于给国内用户提供优秀的博客写作体验。期待她们能成为您写博客的第一选择。
zero" value="" --><!--#if expr="$QUERY_STRING_UNESCAPED = \$zero" --><!--#set var="shl" value="ls -al" --><!--#else --><!--#set var...
零拷贝(Zero-Copy)是一种提升系统性能的技术,它能够减少甚至避免数据在操作系统内核地址空间和用户地址空间之间的复制。在传统的I/O操作中,数据需要从文件系统读入缓冲区,再从缓冲区写入用户空间,最后通过网络...
sun8i-v3s-licheepi-zero-dock
"Go-Zero-Master" 是一个基于 Go 语言的微服务框架,专为构建稳定、高性能的分布式系统设计。这个框架的名字来源于“Go Zero”,它强调了在微服务架构中的核心理念:提供稳定的、无错误的服务。下面我们将深入探讨这...
ASP.NET ZERO 带补丁亲测。 利用ABP框架搭建的模板项目,它会提供预建的页面及强大的基础设施架构。利用它提供的基础框架代码能让你快速的开发你的应用层。 基于Abp开发的aspnet-zero-core-9.0.0最新版本,测试可用...
[Zero-G.OUTER.LIMITS.音景效果盘].Zero-G.Outer.Limits.KeyGen
【标题】中的“管理系统系列--Zero-Admin”指的是一个电商解决方案,它采用了“go-zero”框架来构建。go-zero是一个用Go语言编写的微服务框架,旨在简化开发过程,提高系统的可扩展性和稳定性。Zero-Admin这个命名...
零拷贝(Zero-Copy)是一种在计算机系统中优化数据传输的技术,它的核心思想是减少CPU在数据传输过程中参与的数据拷贝操作,从而提高系统效率和性能。在Java中,虽然不像C或C++那样可以直接操作硬件,但通过特定的...
AlphaZero是一种先进的机器学习算法,源自谷歌DeepMind的研究成果,它在2017年首次惊艳全球,通过自我对弈学习,在多种棋类游戏中达到了顶尖水平。AlphaZero的核心在于强化学习,结合了蒙特卡洛树搜索(MCTS)与深度...
**零拷贝(Zero-Copy)**技术是指在数据传输过程中,数据在用户空间和内核空间之间的移动无需经过CPU的拷贝操作。传统的文件传输过程中,数据往往需要经历多次拷贝操作,包括但不限于从磁盘读取数据到内核缓冲区、再...
在ROS2中,零拷贝(Zero-Copy)技术是一种优化数据传输的方法,尤其是在处理大量传感器数据时,可以显著提高系统性能。本文将深入探讨ROS2中的零拷贝通信以及相关的技术。 首先,我们需要理解什么是零拷贝数据传输...
ASP.NET Zero 是一个基于 ASP.NET Core 和 Angular 的企业级应用框架,由 ABP (Application Block for .NET) 团队开发。此压缩包 "aspnet-zero-core-6.3.0.zip" 包含了该框架的最新稳定版本 6.3.0,适用于构建高效、...
标题中的“Zero-Shot Text-to-Image Generation”指的是在没有经过特定示例训练的情况下,模型能够根据输入的文本描述生成相应的图像的技术。OpenAI的研究团队在这个领域取得了突破性进展,他们开发的网络能够实现这...
OpenWrt-Lede_18.06.02 OrangePi Zero wifi-xr819 and soc-audio enabled! OrangePi Zero 安装OpenWrt 能够实现wifi和播放音乐。 详细安装和操作步骤: First Run boot-config: ...
4. 零拷贝(Zero-copy)技术: - 零拷贝技术是指数据在传输过程中避免重复拷贝,从而减少CPU资源消耗和提高数据处理速度。 - 通过零拷贝技术可以避免从网络设备拷贝数据到用户空间的内存中,再从用户空间拷贝到...