其他
彻底理解高级I/O:零拷贝
大家好,我是小风哥,今天和大家简单聊聊零拷贝。计算机处理的任务大体可以分为两类:CPU密集型与IO密集型。当前流行的互联网应用更多的属于IO密集型,传统的IO标准接口都是基于数据拷贝的,这篇文章我们主要关注该怎样从数据拷贝的角度来优化IO性能。为什么IO接口要基于数据拷贝?为了让广大码农们更好的沉迷于自己的一亩三分地,防止ta们分心去关心计算机中的硬件资源分配问题,操作系统诞生了。操作系统本质上就是一个管家,目的就是更加公平合理的给各个进程分配硬件资源,在操作系统出现之前,程序员需要直面各类硬件,就像这样:在这一时期程序员真可谓掌控全局,掌控全局带来的后果就是你需要掌控所有细节,这显然不利于生产力的释放。操作系统应用而生。计算机系统就变成这样了:现在应用程序不需要和硬件直接交互了,仅从IO的角度上看,操作系统变成了一个类似路由器的角色,把应用程序递交过来的数据分发到具体的硬件上去,或者从硬件接收数据并分发给相应的进程。数据传递是通过什么呢?就是我们常说的buffer,所谓buffer就是一块可用的内存空间,用来暂存数据。操作系统这一中间商导致的问题就是:你需要首先把东西交给操作系统,操作系统再转手交给硬件,这就必然涉及到数据拷贝。这就是为什么传统的IO操作必然需要进行数据拷贝的原因所在。关于操作系统系统完整的阐述请参见博主的《深入理解操作系统》。然而数据拷贝是有性能损耗的,接下来我们用一个实例来让大家对该问题有一个更直观的认知。网络服务器浏览器打开一个网页需要很多数据,包括看到的图片、html文件、css文件、js文件等等,当浏览器请求这类文件时服务器端的工作其实是非常简单的:服务器只需要从磁盘中抓出该文件然后丢给网络发送出去。代码基本上类似这样:read(fileDesc,