神经质硬盘
我这个程序一直在硬盘上睡大觉,这个传统的机械硬盘容量超大,但是却非常脆弱。
每当他移动磁头,读取数据的时候,他就在那里不断祈祷:千万别有什么大的震动啊。
时间久了,他就变得神神叨叨的,这也不能怪他,因为他那铝合金制成的盘片在高速旋转,每分钟要转几千甚至上万圈,磁头悬浮在盘片上方滑来滑去,经常需要在毫秒级的时间内滑到指定位置,磁头和盘片之间的距离是以纳米来计算的,实在是太近了,一不小心就会出错。
多个盘片摞在一起(当然对应多个磁头),被封装在硬盘内,在一尘不染的环境内高速旋转。
在盘片上涂着薄薄的一层磁性材料, 这些磁性材料像无数个小磁铁,都有南极和北极。让人惊奇的是,所有的数据,都是由这些“小磁铁”来存储。
硬盘最常做的事情就是用磁头去读写这些“小磁铁”,看看是南极(S)还是北极(N),由此来确定是0还是1。
所有的数据在硬盘中只能以二进制的方式(0或者1)来存储,包括我这段程序。
(图片来源:https://www.computerhope.com/jargon/h/harddriv.htm,这是一种垂直的数据记录方式,还有一种是水平的方式)
健忘症患者内存
整天窝在硬盘上实在是没什么意思,我挺期待出去走走,比如到内存去逛逛。 另外一段程序给我说:“你要小心,到了内存,你的存储形式就要发生变化了。”
“什么变化?”
“内存是个纯电子的结构,没有机械部分,又稳定又快!”
“这不挺好嘛!” 我说道。
“内存中就不是‘小磁铁’了,他是由一个个电容+访问晶体管组成。每个电容可以存储1bit的数据,即0或者1。”
(来源: https://www.youtube.com/watch?v=PVad0c2cljo)
“太好了,我正好想去体验下不同的人生!” 我说。
“你要小心,这些电容中的电荷过一段时间就会丢失,电势不足,数据也就丢失了。因此内存得周期性地读出、然后重写来刷新电容的电荷,这样才能把数据给保持住。可悲的是这个刷新的操作一直要持续到数据改变或者断电。这就是为什么内存被大家称为‘健忘者’的原因。”
我丝毫不担心,人类既然这么设计,肯定能保证数据的完整性。
(码农翻身注:RAM分为两类,一类是静态RAM,一类是动态RAM,前者不用刷新就能保存数据,但是造价高,只在高速缓存中使用。)
CPU阿甘
终于有一天,CPU阿甘又对DMA控制器发出了指令,让他从硬盘把我这个程序搬到内存。
他总是这样,从来不亲力亲为,总是把任务交代给DMA以后,自己就忙着干别的事情去了。
硬盘和内存刚开始还不理解,为什么要这么做呢?后来他们看到了阿甘那令人咂舌的运算速度,比内存快几百倍,比硬盘快几十万倍。 他们俩就明白了,CPU阿甘如果等着他们去搬运数据,那得等好几个月才行。
硬盘找到了我这段程序,判断是南极还是北极,他们是 ......SNNSSSSN......,也就是......01100001......。
DMA控制器把它们搬进入了内存,我摇身一变,成为了电容中的电荷。
内存则开始辛辛苦苦,不断地刷新这些电容,防止数据丢失。
当然,我们这些二进制数据不会在内存的电容中呆着不走,我们马上就通过总线奔向下一个目的地:显卡。
显卡
***次来到显卡这里,我发现简直就是一个独立的王国:有自己的GPU, 显存,甚至还有一个BIOS。
就拿GPU来说吧,居然像阿甘一样配备了高级装备:风扇! 足能显出其高贵的地位。 这也没办法,人家要渲染图形图像,必须执行复杂的数学和几何运算,发热量大嘛。
由于图形图像不是一下子就能生成的,需要有个地方暂存数据,于是显卡就装备了显存。
如果显卡有独立的显存还行,有些集成的显卡居然和内存来争夺地盘,内存还不得不划出来一块儿给他,实在是让人无语。
对了,显存中还有一块区域叫做“帧缓冲区”,这是图像传输的一个关键区域,显卡所生成的一帧画面会先被写入帧缓冲区。而一台 72Hz 的显示器每秒能够显示 72 幅画面,也就是说每 1/72 秒(当显示器刷新完一幅画面时),显卡就需要把缓冲区的内容通过特定接口发给显示器。
如果接口是数字信号,那就比较简单,直接把显存的数据输出即可。
如果接口不幸是模拟的(比如VGA),那显卡还需要完成一个额外的步骤:数模转换。
我比较好奇,问道:“为什么要做数模转换?”
显卡说:“模拟信号你懂不懂?不懂啊,举个例子,假设显示器所要求的电压的变化是[100V ,200V],你不可能从100V一下子跳到200V吧,肯定是连续变化的,这就是模拟的信号。我们整天面对的都是0和1,都是数字信号。肯定需要做数字<->模拟转换才行啊。”
显卡一边说,一边把我这段程序转化成了帧缓冲区的数据,然后进行数模转换,向显示器发送了出去。
***,显示器把我展示给了程序员:
【本文为51CTO专栏作者“刘欣”的原创稿件,转载请通过作者微信公众号coderising获取授权】