1.2 存储器

  存储器的主要功能是存放程序和数据。程序是计算机操作的依据,数据是计算机操作的对象。不管是程序还是数据,在存储器中都是用二进制数的形式表示的,统称为信息。向存储器存入和从存储器取出数据,都称为访问存储器。
  计算机存储器是由可以存放和读取数值的一系列单元所组成的,每个存储单元都有一个编号,称为 地址 。向存储器中存数据或者从存储器取数据,都要按给定的地址来寻找所选的存储单元。存放在存储器中的信息,事实上可以表示任何东西,文字、数值甚至计算机指令都可以同样容易的存放到存储器中。
  由于计算机仅使用0和1两个二进制数字,所以使用 位 (bit) 作为数字计算的最小信息单位。当CPU向存储器送入或从存储器取出信息时,不能存放单个位,而使用 字节 (Byte)字 (Word) 等较大的信息单位来工作。一个字节由8个二进制信息组成,而一个字则表示计算机一次能处理的一组二进制数,至少由一个以上的字节组成。通常把组成一个字的二进制位数叫做字长。例如微型机的字长可以少至8位,多至32位,甚至达到64位。
  存储器中所有存储单位的总数称为存储器的存储容量,通常用单位 KB (Kilobyte, 千字节)、MB (Megabyte, 兆字节)、GB (gigabyte, 千兆字节) 表示,如64KB、128MB、256GB。度量存储器容量的各级单位之间的关系为:1KB = 1000Byte、1MB = 1000KB、1GB = 1000MB 。存储容量越大,计算机所能记忆存储的信息就越多。
  存储器是计算机中存储信息的部件。按照存储器在计算机中的作用又可分为 主存储器、寄存器、闪速存储器、高速缓冲存储器、辅助存储器 等几种类型,它们均可完成数据的存取工作,但性能及其在计算机中的作用相差很大。

1.2.1 寄存器

寄存器 (Register) 的主要功能是存储二进制代码,用于存放参与运算的数据和运算结果。
  首先,寄存器的工作频率要大幅度的和CPU运算器一致(节拍一致),每一次存取数据所需速度都要非常非常的少,花费零点几纳秒的时间就完成数据的读取,所以寄存器的成本十分高昂。
  根据功能不同寄存器也分为两种,基本寄存器移位寄存器,基本寄存器只能 并行送入数据,也只能 并行输出数据 。而移位寄存器可以 在移位脉冲作用下依次逐位右移或左移 ,既可以并行输入、并行输出,也可以串行输入、串行输出,还可以并行输入、串行输出,或串行输入、并行输出。
寄存器最起码具备以下4种功能:

  1. 清除:将寄存器里的原有数据清除
  2. 接收:在接收脉冲作用下,将外输入数据存入寄存器中
  3. 存储:在没有新的写入脉冲来之前,寄存器能保存原有数据不变
  4. 输出:在输出脉冲作用下,才通过电路输出数据

1.2.2 随机存储器 (RAM)

随机存储器 (Random Access Memory) 是主存的一种,用于存放供CPU使用的绝大部分程序和数据,既可向指定单元存入信息又可从指定单元读出信息,必须带电存储,断电数据丢失,所以随机存储器是 易失性存储器
  而所谓的随机存储,主要是指一段数据被读取或写入的时候,花费的时间与这段数据所存储的位置无关。相对的,写入顺序访问(Sequential Access) 存储器 被读取或写入的时候,花费的时间就与这段数据所存储的位置有关了。
而随机存储器主要分两大类,动态随机存储器 (DRAM)静态随机存储器 (SRAM)

1.2.2.1 动态随机存储器 (DRAM)

动态随机存储器 (Dynamic Random Access Memory) 利用栅极电容存储电荷的原理保存信息,所以会存在电荷泄漏的现象,而为了解决这种现象,就需要时隔几毫秒对存储单元进行读取和写入,刷新的时间必须小于栅极电容自然保持信息的时间,这个过程被成为DRAM的刷新。它的功耗较SRAM来说更小,而因为刷新的存在,DRAM的外围电路会比较复杂,刷新也使得DRAM的存储速度较SRAM来说更慢,而因为其成本低廉,设计简单,成为现今大容量RAM的主流。

1.2.2.2 静态随机存储器 (SRAM)

静态随机存储器 (Static Random Access Memory) 是在静态触发器的基础上附加门控管而构成的,因此,它是靠触发器的自保功能存储数据的。它存放的数据能在不断电的前提下长期保存,状态稳定,也不需要进行刷新,所以外围电路设计简单,功耗较DRAM来说也更大,速度也较DRAM来说更快,但以目前的情况来说,人类无法以低廉的成本造出SRAM,所以这东西经常被用来作为CPU的Cache。

1.2.2.3 非易失性随机存储器 (NVRAM)

非易失性随机存储器 (Non Volatile Random Access Memory) 主要是指断电后还能保持数据的随机存储器,也就是具有非易失性的随机存储器。

1.2.2.4 同步动态随机存储器 (SDRAM)

同步动态随机存取内存 (Synchronous Dynamic Random Access Memory) 也就是我们平常说的内存,DDR4、DDR3等都是它的版本,它是有一个同步接口的DRAM,通常DRAM是有一个异步接口的,这样它可以随时响应控制输入的变化。而SDRAM有一个同步接口,在响应控制输入前会等待一个时钟信号,这样就能和计算机的系统总线同步。

1.2.3 只读存储器 (ROM)

只读存储器 (Read Only Memory) 也是主存的一种,正如起名,是只能读取且以非破坏性读取的存储器,信息一旦写入后就固定下来,即便切断电源后数据仍然存在不会丢失,所以只读存储器是 易失性存储器。只读存储器又有多种不同的版本,比如PROM、EPROM、EEPROM、CDROM等。时钟被用来驱动一个有限状态机,对进入的指令进行 管线 (Pipeline) 操作。这使得SDRAM与没有同步接口的 异步DRAM(asynchronous DRAM) 相比,可以有一个更复杂的操作模式。

1.2.3.1 可编程只读存储器 (PROM)

可编程只读存储器 (Programmable Read Only Memory) 可以使用PROM编程器将数据写入 (又被称为编程),在将数据写入后,就只能专用那些数据,并且不能被再次编程。所以又被称为一次可编程只读存储器 (One Time Progarmming ROM) ,简称“OTP-ROM”。

1.2.3.2 可擦除可编程只读存储器 (EPROM)

可擦除可编程只读存储器 (Erasable Programmable Read Only Memory) 指可以重复擦除数据并且可以重复写入且可以重复读取的只读存储器。通常由一组浮栅晶体管构成,被一个提供比电子电路中常用电压更高电压的电子器件分别编程。进行编程后只能使用强紫外线照射来擦除,在以前常被用作存储BIOS。

1.2.3.3 带电可擦除可编程只读存储器 (EEPROM)

带电可擦除可编程只读存储器 (Electrically Erasable Programmable Read Only Memory) 指可以通过高于普通电压的作用来擦除和重编程只读存储器,也就是可以通过电擦除和写入的EPROM。EEPROM以Byte为最小修改单位,不必将数据全部洗掉才能写入。

1.2.4 闪存 (Flash)

  Flash是一种存储芯片,通过特定的程序可以修改里面的数据,它是一种非易失存储介质,在写入前需要擦除。原指由 桀冈富士雄 (Fujio Masuoka) 发明的 NOR Flash ,但在1986年,桀冈富士雄又发明了 NAND Flash ,这时Flash泛指 NOR FlashNAND Flash ,关于这段还有一个引人深思的故事,将在 附属章节1 进行说明。

1.2.4.1 NOR Flash

  NOR Flash是 桀冈富士雄 (Fujio Masuoka) 在1980年发明的,当时桀冈富士雄申请了一个叫做 Simultaneously Erasable EEPROM 的专利。NOR Flash的一个bit可以从1变成0,而从0变成1就需要擦除整块。NOR Flash的容量较NAND Flash来说比较小,读取速度较NAND Flash来说很快,而写入速度就差强人意。擦除速度也较NAND Flash来说很慢。通常来说它的可擦除次数在 10^4 ~ 10^5 内,可靠性也较NAND Flash来说更高,当然价格也高。NOR Flash支持随机访问,这也是的它具有支持 芯片内执行 (XIP, eXecute In Place) 的特性,可以像普通ROM一样执行程序。这点使得它成为了BIOS等开机就要执行代码的绝佳载体。
  现在几乎所有的BIOS和一些机顶盒上都是使用NOR Flash,它的大小主要在 1MB ~ 32MB 之间,价格高昂。

1.2.4.2 NAND Flash

  NAND Flash也是 桀冈富士雄 (Fujio Masuoka) 在1986年发明的,NAND Flash的一个bit要使1变成0或0变成1都需要进行擦除,容量较NOR Flash来说更大,读取速度较NOR Flash来说慢一些,而写入速度就快一点。擦除速度也较NOR Flash来说很快。通常来说它的可擦除次数在 $10^5 \sim 10^6$ 内,可靠性也较NAND Flash来说低一点,当然价格也低。NAND Flash是按块方式读取,也就不支持 芯片内执行 (XIP, eXecute In Place) 了。我们电脑里的固态硬盘,大多都是采用NAND Flash的,它广泛应用在各种存储卡、U盘、SSD、eMMC等等大容量设备中。
  NAND Flash的颗粒,根据单元内存存储比特个数的不同,也被分为 SLC (Single Level Cell)、MLC (Multi Level Cell)、TLC (Triple Level Cell)、QLC (Quadra Level Cell) 四类,其中在一个存储单元中,SLC可以存储1个比特,MLC可以存储2个比特,TLC可以存储3个比特,QLC可以存储4个比特,NAND Flash的单个存储单元存储的比特位越多,读写性能就会越差,寿命也越短,对主控芯片的要求就越高,但是成本就会更低。
  主要影响NAND Flash寿命的因素,就是每块的擦写次数。而NAND Flash也会随着使用而渐渐产生坏块,如何平衡各块的擦写和为可能的坏块寻找替换呢?通常需要一个特殊的软件层次,实现坏块的管理、擦写均衡、ECC、垃圾回收等功能,这一软件层次被称为 FTL (Flash Translation Layer)

1.2.5 傲腾 (Optane)

  傲腾是英文Optane的音译,是一种类别的品牌,这里指Intel发明的3D XPoint存储技术,它的关键在于存储技术的革命性改进,简单说这东西就是比NAND快,比DRAM便宜、容量还大并且非易失。它的容量和NAND在一个数量级,读延迟却和DRAM在一个数量级,它集合了两方的好处。

1.2.6 哈佛结构 (Harvard Architecture)

哈佛结构 (Harvard Architecture) 是一种将程序指令存储和数据存储分开的存储器结构。哈佛结构是一种并行体系结构,它的主要特点是将程序和数据存储在不同的存储空间中,即程序存储器和数据存储器是两个独立的存储器,每个存储器独立编址、独立访问。在哈佛架构中CPU首先到程序指令存储池中读取程序指令内容,解码后得到数据地址,再到相应的数据存储器中读取数据,并进行下一步操作 (通常是执行),程序指令和数据存储分开,数据和指令的存储可以同时进行,也使指令和数据有不同的数据宽度。

1.2.7 高速缓冲存储器 (Cache)

  在许多复杂的计算机中,存在一个或多个比寄存器慢但比主存快的高速RAM缓冲存储器 (简称 高速缓存 ) —— Cache。通常使用SRAM。它是位于CPU和主存储器之间、规模较小但速度很快的存储器,很好地解决了CPU和主存之间的速度匹配。