本篇是《计算机是怎么认识代码的》的姊妹篇。一、如何存储数据 由于保存数据的重要性,科学家一直在思考,在电路中使用何种方式可以保存数据。 计算机都是二进制,要么是0,要么是1,如果使某个器件一直输出高电平,那不就是1了吗?一直输出低电平,那不就是0了吗?而且还要可以自由切换0和1。 接下来,内存条闪亮登场。二、RAM 内存条还有一个更专业的名字:RAM(RandomAccessMemory)随机存储器,因为可以随意读写任意位置的数据。 现在计算机基本上都是二进制的,不管什么样的数据或者代码指令,在我们这里都是一串串的0和1的比特位。 为了存储这一个比特位,曾经有两种电路方案摆在先辈们的面前,第一种是静态方案: 是不是有点复杂?我也觉得。这种电路方案的好处是可以稳定的维持在0和1之间的某个状态,所以叫静态SRAM(StaticRandomAccessMemory)。 但是需要用到的晶体管太多了,一个比特位就要用好几个晶体管,16GB那得用多少才够啊,成本太高了,造出来的个头肯定会特别大,主板上空间这么局促,哪里装得下啊。 还有第二种方案: 这样是不是简单了许多?只通过一个电容器的电荷就能决定这是一个1还是一个0,这样就存储了1bit。 在每一个存储芯片里,这样的比特位存储单元都有很多,例如一个16G的内存条有137438953472bit,也就是有137438953472个这样的电容。 但这种电路方案有个毛病,就是里面的那个电容会漏电,电容中的电荷会慢慢消失,电压也就变小了,这样就没办法区分这是表示的1还是0了。 为了解决这个问题,必须得周期性的去给它们充电,才能维持数据的稳定,这叫动态数据刷新,所以这种方案叫DRAM(DynamicRandomAccessMemory)。三、内存控制器 当我们需要读取数据时,要访问哪个bit位,通过芯片号、bank号、行地址、列地址,就可以了。 是不是有点麻烦,这些内部细节应该封装一下,提供给一个简单接口就是了,于是内存控制器登场了。 内存控制器就像一个中介,位于CPU与内存条之间。 内存存储数据的电路单元中,电容经常漏电,需要定时刷新,按照规定,最多64ms就得要刷新一次,这数据刷新的工作就由内存控制器管理。 内存条的数据存储在每一个存储芯片之上,每一个芯片里面又分了很多个分片,每个分片里面又有很多的比特位存储格子。想要访问哪个比特位,就得指定对应的芯片、对应的分片、对应格子的行地址和列地址。 CPU这边想要访问数据,肯定不想这么麻烦,所以内存控制器就派上用场了。 用bit作为读写单元太麻烦了,咱们按8bit为一组,叫做一个字节byte,CPU统一给内存的存储空间编址,以后要读取数据的时候呢,就把地址交给内存控制器,再告诉内存具体是读写哪个芯片哪个分片的哪些位置。 以后只需要一个地址,内存控制器就转换成具体的数据存储位置,去读取内存,再由内存完成读写操作就可以了。 由于内存控制器的重要性,现在,内存控制器已经集成到了CPU内部,成为了CPU的一份子了。 随着CPU的发展,CPU的速度越来越快,开始嫌内存慢了,要说慢,硬盘那可比内存慢多了!于是在CPU内部又搞了个缓存出来,不用每次都问内存要数据,而是把一些常用的数据存储在CPU内部的缓存中。 只不过CPU内部的缓存不会太大,仅存放一些常用的数据,大部分数据还是需要通过内存进行读取。 建议您收藏或转发,以备不时之需。 文章来源:小道萧兮https:www。jianshu。comp0aa5c09b2a6b