8

一个故事看懂内存条工作原理

 3 years ago
source link: https://www.cnblogs.com/xuanyuan/p/14467387.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

我是内存条

我是一个内存条,刚刚从深圳的一个工厂里被生产出来,跟我一起的还有一批小伙伴,长得跟我一模一样,下了流水线后我们就被扔进了一处黑暗的角落。

“这是哪里啊,黑漆漆的”,一个小伙伴说到。

“这里是内存条仓库”,黑暗中有人在说话,声音中略有一丝沧桑,像是一个老头。

 659280-20210302094816729-1706555139.png

“谁?谁在那里”

“别怕,我也是一个内存条,比你们早几个月被生产出来”,那老头说到。

“啥,你都被关在这里几个月了,完了完了”,小伙伴急了。

“不是的,我出去过,后来被发现是残次品,又被回收了关在了这里,你们跟我不一样,刚刚生产出来,应该很快就能出去,被安装到电脑主板上,实现你们的价值。”

“电脑主板?那是什么地方?”,我好奇的问到。

659280-20210302094824154-1881547135.png

那声音继续说到:“那是计算机最核心的地方,是一个巨大的电路板,上面住着CPU、硬盘、网卡、显卡、声卡,当然,还有我们内存条。计算机必须有我们才能正常运转,因为CPU工作需要的指令和数据都存储在咱们内存中”

刚说完,我们身边亮起了灯光,这时,我们才看清我和小伙伴们的样子。

659280-20210302094830067-1592021681.png

“我们身上那几块黑乎乎的东西是什么,真是有点拉低颜值啊!”

“你可别小瞧了它们,那可是咱们内存条的核心存储芯片,我们的数据都是放在这里面的,它们一个就是1GB,总共16个,就是16GB的空间呢!”,那老头又开口说到。

奇怪的是,我们还是看不到他。

“你在哪里,怎么亮了灯还是看不到你呢?”,一个小伙伴问到。

“我在隔壁的柜子里,像我这种残次品估计是没机会出去了”

“你刚才说16个存储芯片,这不是明明只有8个吗?”

“你转过身去看看,背上还有8个呢”

我们几个纷纷转身看去,果然如此。

老头继续说到:“除了存储芯片,还有PCB电路板金手指,这三部分共同构成了我们的身体。”

“金手指是什么东西?”

“就是脚下那一排土豪金颜色的部分了,那是我们连接主板插槽的接触点,一面有120个,两面就是240个,因为每个点看起来像手指,人们就把这叫做金手指了”。

“那为什么中间留了一个缺口呢?”

“我们的每个金手指都有不同的功能,正反面可不能弄混,为了防止愚蠢的人类把我们插错,所以中间留了一个缺口,要是弄反了可是插不进去的。通过主板上的电路,我们就能接通到计算机的总线系统上,可以和CPU对话了。”

原来如此,我们都若有所思的点点头。

接下来,这位老头还讲了很多我们内存条先辈的故事。

原来,我们还有一个更专业的名字:RAM,随机存储器,因为我们可以随意读写任意位置的数据。

老头还说,现在计算机基本上都是二进制的,不管什么样的数据或者代码指令,在我们这里都是一串串的0和1的比特位。

为了存储这一个比特位,我们的先辈们可是费了不少功夫!

曾经有两种电路方案摆在先辈们的面前,第一种是静态方案:

659280-20210302094840902-1255493432.png

是不是很复杂?我也觉得。这种电路方案的好处是可以稳定的维持在0和1之间的某个状态,所以叫静态SRAM

但是需要用到的晶体管实在太多了,一个比特位就要用好几个晶体管,16GB那得用多少才够啊,成本太高了,造出来我们的个头肯定会特别大,主板上空间这么局促,哪里装得下啊。

先辈们没有选择这种方案,用了第二种方案:

659280-20210302094851430-561469005.png

看,是不是简单了许多?通过一个电容器的电荷就能决定这是一个1还是一个0。

在我们身上的每一个存储芯片里,这样的比特位存储单元都有很多:

再缩小一下看,它们密密麻麻的排列着,每一个位都由行地址和列地址来确定的:

659280-20210302094907826-1293054913.png

图源知乎@老狼

但这种电路方案有个毛病,就是里面的那个电容会“漏电”,电容中的电荷会慢慢消失,电压也就变小了,这样就没办法区分这是表示的1还是0了,为了解决这个问题,必须得周期性的去给它们充电,才能维持数据的稳定,这叫动态数据刷新,所以这种方案叫动态DRAM

老头正给我们讲的兴起,突然有人把我们打包起来,所有的小伙伴都被分开了。

又经过了好长一段日子的黑暗和孤独,那一天突然咔嚓一声,我的金手指和卡槽连接了起来,难道这就是传说中的主板吗?

659280-20210302094922314-1736791679.png

“你就是内存啊,我们可等你好久了,你来了我们总算可以开始工作了!”,旁边一个家伙跟我打起了招呼。

“你哪位啊?”

“你好,我是CPU里的阿Q,你看就在你隔壁,咱们以后少不了要天天打交道了。对了,快告诉我,你有多大存储空间?”

我检查了一下,回答道:“我有16GB空间,也就是137438953472个比特位!”

“哇,这么多!太给力了!不过我该怎么使用你来存储数据呢?”

“这简单,你要访问哪个bit位,告诉我芯片号、bank号、行地址、列地址,我把数据取给你不就行了吗!”

“怎么这么麻烦?你这不讲武德啊,这些内部细节应该封装一下啊,提供给我一个简单接口就是了”,阿Q吐槽道。

“两位大哥,看这里”,这时,主板上不远处又有一个家伙开口了。

“你是谁?”我和阿Q异口同声的问到。

这家伙眯着眼说到:“我是内存控制器,专门为二位服务的。”

“啥,你要控制我?”

“您别误会,我就是一个中介,为两位提供服务而已”

见我俩一头雾水,这家伙接着说到:“内存老哥,你的存储数据电路单元中的电容是不是经常漏电,需要定时刷新?而且按照规定,最多64ms就得要刷新一次?你放心,这数据刷新的工作以后就交给我了”

“你怎么知道的?”

这家伙笑了笑继续说道:“这算啥,我还知道你的数据存储在你身上的每一个存储芯片之上,每一个芯片里面又分了很多个分片,每个分片里面又有很多的比特位存储格子。想要访问哪个比特位,就得指定对应的芯片、对应的分片、对应格子的行地址和列地址,我说的对不对?”

659280-20210302094930364-704993195.png

我点了点头,没想到这家伙居然对我了解的这么清楚。

“阿Q啊,你们CPU这边想要访问数据,肯定不想这么麻烦吧?”,这家伙笑着问到。

“那当然!”

“所以啊,我就派上用场了啊,用比特位作为读写单元太麻烦了,咱们按8个比特位为一组,叫做一个字节,你们CPU这边统一给内存兄弟的存储空间编址,以后要读取数据的时候呢,就把地址交给我,我再告诉内存兄弟具体是读写哪个芯片哪个分片的哪些位置,怎么样,是不是为你们解决了大麻烦?”,说完,内存控制器露出了得意的笑容。

“听上去不错啊,咱们开始吧!”

“现在还不行,还没通电呢!”

不过我们没等太久,就听见一阵嘶嘶声响,来电了!

随后我们就开始配合工作起来,初次见面,合作的就非常顺利,CPU对我所有的存储位按照字节为单位进行了统一编址,以后只需要一个地址,内存控制器就转换成具体的数据存储位置交给我,我再完成读写操作就可以了。

后来,看到内存控制器表现非常不错,在阿Q的牵线下,还把他集成到了CPU内部,现在成为了他们的一份子了!

我和CPU一直相处的不错,可没过多久,他们居然开始嫌我慢了,要说慢,硬盘那家伙可比我慢多了!

他们发现拿我没有办法,于是在CPU内部又搞了个缓存出来,不用每次都问我要数据,倒是给我省了不少工作量。

我的日子就这样过着,本以为就要在这主板上干到退休了,没想到那一天,一个浏览器程序告诉我说:“内存大哥你完了,刚刚我看到主人在网上买新的DDR4内存条,你要被淘汰了”

难道我也要被打入小黑屋了吗?

往期TOP5文章

我是Redis,MySQL大哥被我害惨了!

CPU明明8个核,网卡为啥拼命折腾一号核?

一个故事看懂Docker容器技术

主板上来了一个新邻居,CPU慌了!

哈希表哪家强?几大编程语言吵起来了!

659280-20210302095001430-702886523.png

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK