一段程序的奇妙旅行

企业动态
这个程序一直在硬盘上睡大觉,这个传统的机械硬盘容量超大,但是却非常脆弱。每当他移动磁头,读取数据的时候,他就在那里不断祈祷:千万别有什么大的震动啊。

 神经质硬盘

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

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

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

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

[[248508]]

 

 

[[248509]]

 

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

硬盘最常做的事情就是用磁头去读写这些“小磁铁”,看看是南极(S)还是北极(N),由此来确定是0还是1。

所有的数据在硬盘中只能以二进制的方式(0或者1)来存储,包括我这段程序。

 

 

[[248509]]

 

(图片来源:https://www.computerhope.com/jargon/h/harddriv.htm,这是一种垂直的数据记录方式,还有一种是水平的方式)

健忘症患者内存

整天窝在硬盘上实在是没什么意思,我挺期待出去走走,比如到内存去逛逛。 另外一段程序给我说:“你要小心,到了内存,你的存储形式就要发生变化了。”

“什么变化?”

“内存是个纯电子的结构,没有机械部分,又稳定又快!”

“这不挺好嘛!” 我说道。

“内存中就不是‘小磁铁’了,他是由一个个电容+访问晶体管组成。每个电容可以存储1bit的数据,即0或者1。”

[[248510]]

 

 

[[248509]]

 

(来源: 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获取授权】

 

戳这里,看该作者更多好文

责任编辑:武晓燕 来源: 51CTO专栏
相关推荐

2014-03-21 09:58:08

比特币

2012-03-01 14:13:36

Java

2020-04-03 10:14:57

内存蠕虫代码web安全

2020-12-31 10:14:42

防注入代码绕过

2022-06-21 12:27:12

JavaScript前端

2014-09-09 14:47:20

2021-01-18 08:09:20

Java程序JIT

2014-07-08 09:21:10

死代码创意歌曲

2018-06-19 08:02:00

统计程序微信

2021-04-08 09:14:24

js前端函数

2017-11-20 16:44:59

云端算力

2017-11-27 10:52:44

混合云京东云

2023-09-05 09:42:18

if分支源码

2023-12-22 18:04:26

HiCar

2018-06-23 08:02:31

程序员代码故事

2021-02-04 07:55:28

代码离职互联网

2021-01-04 05:58:57

WindowsXP微软操作系统

2011-07-12 09:33:43

SQL Azure

2022-02-08 09:00:00

智能自动化人工智能RPA

2011-07-11 09:51:06

专利微软Android
点赞
收藏

51CTO技术栈公众号