程序员|为什么 P8 程序员的代码你写不出来?零拷贝了解一下
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
计算机处理的任务大体可以分为两类:CPU密集型与IO密集型 。
当前流行的互联网应用更多的属于IO密集型 , 传统的IO标准接口都是基于数据拷贝的 , 这篇文章我们主要关注该怎样从数据拷贝的角度来优化IO性能 , 让你的程序在IO性能方面赶超P8 。
为什么IO接口要基于数据拷贝?为了让广大码农们更好地沉迷于自己的一亩三分地 , 防止ta们分心去关心计算机中的硬件资源分配问题 , 操作系统诞生了 。
操作系统本质上就是一个管家 , 目的就是更加公平合理地给各个进程分配硬件资源 , 在操作系统出现之前 , 程序员需要直面各类硬件 , 就像这样:
在这一时期程序员真可谓掌控全局 , 掌控全局带来的后果就是你需要掌控所有细节 , 这显然不利于生产力的释放 。
操作系统应用而生 。
计算机系统就变成这样了:
现在应用程序不需要和硬件直接交互了 , 仅从IO的角度上看 , 操作系统变成了一个类似路由器的角色 , 把应用程序递交过来的数据分发到具体的硬件上去 , 或者从硬件接收数据并分发给相应的进程 。
数据传递是通过什么呢?就是我们常说的buffer , 所谓buffer就是一块可用的内存空间 , 用来暂存数据 。
操作系统这一中间商导致的问题就是:你需要首先把东西交给操作系统 , 操作系统再转手交给硬件 , 这就必然涉及到数据拷贝 。
这就是为什么传统的IO操作必然需要进行数据拷贝的原因所在 。
然而数据拷贝是有性能损耗的 , 接下来我们用一个实例来让大家对该问题有一个更直观的认知 。
网络服务器浏览器打开一个网页需要很多数据 , 包括看到的图片、html文件、css文件、js文件等等 , 当浏览器请求这类文件时服务器端的工作其实是非常简单的:服务器只需要从磁盘中抓出该文件然后丢给网络发送出去 。
代码基本上类似这样:
read(fileDesc buf len);write(socket buf len);
这两段代码非常简单 , 第一行代码从文件中读取数据存放在buf中 , 然后将buf中的数据通过网络发送出去 。
注意观察buf , 服务器全程没有对buf中的数据进行任何修改 , buf里的数据在用户态逛了一圈后挥一挥衣袖没有带走半点云彩就回到了内核态 。
这两行看似简单的代码实际上在底层发生了什么呢?
答案是这样的:
在程序看来简单的两行代码在底层是比较复杂的 , 看到这张图你应该真心感激操作系统 , 操作系统就像一个无比称职的管家 , 替你把所有脏活累活都承担下来 , 好让你悠闲的在用户态指点江山 。
这简单的两行代码涉及:四次数据拷贝以及四次上下文切换:
- 副董事长|京东方A董秘回复:公司与全球数千家供应商保持着良好的合作关系
- 电池|vivoY55s,能有效解决你的续航焦虑!
- 加盟行业|原来加盟行业是这么玩的!
- 京东|适合过年送长辈的数码好物,好用不贵+大牌保障,最后一个太实用
- 儿童教育|首个播放量破 100 亿的 YouTube 视频诞生,竟然是儿歌
- 苹果|国内首款支持苹果HomeKit的智能门锁发布:iPhone一碰即开门
- 小米科技|预算只有两三千买这三款,颜值性能卓越,没有超高预算的用户看看
- 苹果|苹果最巅峰产品就是8,之后的产品,多少都有出现问题
- 普莉希拉|祖籍徐州的普莉希拉,嫁全球第5富豪扎克伯格,坐拥6530亿被说丑
- 攻克|打破日本垄断!售价7亿元的设备被中企攻克,已开始量产