查看原文
其他

一段程序的奇妙旅行(附送10本码农翻身签名版)

码农翻身刘欣 码农翻身 2021-04-27
神经质硬盘


我这个程序一直在硬盘上睡大觉,这个传统的机械硬盘容量超大,但是却非常脆弱。


每当他移动磁头,读取数据的时候,他就在那里不断祈祷:千万别有什么大的震动啊。


时间久了,他就变得神神叨叨的,这也不能怪他,因为他那铝合金制成的盘片在高速旋转,每分钟要转几千甚至上万圈,磁头悬浮在盘片上方滑来滑去,经常需要在毫秒级的时间内滑到指定位置,磁头和盘片之间的距离是以纳米来计算的,实在是太近了,一不小心就会出错。


多个盘片摞在一起(当然对应多个磁头),被封装在硬盘内,在一尘不染的环境内高速旋转。


在盘片上涂着薄薄的一层磁性材料, 这些磁性材料像无数个小磁铁,都有南极和北极。让人惊奇的是,所有的数据,都是由这些“小磁铁”来存储。


硬盘最常做的事情就是用磁头去读写这些“小磁铁”,看看是南极(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,都是数字信号。肯定需要做数字<->模拟转换才行啊。”


显卡一边说,一边把我这段程序转化成了帧缓冲区的数据,然后进行数模转换,向显示器发送了出去。


最后,显示器把我展示给了程序员:


相关阅读


CPU阿甘

我是一块硬盘

我是一个键盘

我是一个线程



双11快到了,先送码农翻身的粉丝们一波福利!10本签名版码农翻身。


关注公众号“码农翻身”,后台回复消息“1111”(注意:不是在文中后面留言啊),获取“抽奖助手小程序二维码”参与活动。

(长按二维码即可关注“码农翻身")


11月2号晚上8点开奖,中奖者请在“抽奖助手”中详细填写联系方式


没有中奖的同学也不用沮丧,京东正在搞“自营好书每满199减100”的活动,非常划算,活动好像是11.11号结束,想入手的要趁早。


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存