Skip to content

5.存储器系统

第八章:存储器系统

存储器结构:

处理器执行程序的速度很大程度上依赖于数据在存储器和处理器之间的传输速度,理想的存储器应该满足读取存储速度快,容量大,价格便宜的特点,然而实际情况是这些理想的特点往往是矛盾的,而无法同时存在一种存储器身上,因此计算机使用了以下的存储器结构,充分利用各种存储材料的特点使处理器的性能最大化的发挥。

计算机存储器的结构

下面将依次介绍各个部分存储器的作用和所使用的存储材料。

存储器内部的组织结构:

存储器中一个存储单元存储一位数据,这些存储单元通常通过阵列的形式排列,每一行通过一根公共的线串联在一起,这根线称为字线,每一列通过两根位线连接在一起。下图是一个16x8结构(总共有16个字,每个字由8个位组成)的存储器电路。

16x8存储结构

  • 字线(word line):存储阵列每一行(也就是每一个字)和一根字线相连接,同时字线又和地址编译器相连接,我们在之前讲过地址译码器是和地址总线相连接的,每一根字线对应着一个地址。当地址译码器接收到地址总线上的地址时,相应的字线被激活也就是该行的存储单元被选中,这样位线才能读取到相应单元的数据。
  • 位线(bit line):存储阵列每一行和一根位线相连接,每一根位线包含负责读出和写入的两根线,当字线选中存储单元时位线就可以根据控制线的指令读出或写入该列上的存储单元,所有位线一起工作就可以同时读出选中行上的所有存储单元的内容。并且位线与数据总线相连接,可以将读取的数据放到数据总线上传回处理器,也可以将数据总线上的数据存储到单元中。

这样的存储结构需要14根与外部线连接的线就可以存储128位的数据(A0A3这4根线负责选定16根字线,b0b7这8位线和数据总线连接,还有2根控制线R/W负责确定是执行读还是写操作,CS用于芯片选择),使用这种方式组织1024位的存储阵列需要使用19根外部接线,但是如果换成1Kx1的组织形式就只需要15根外部接线。

1Kx1存储结构

这种排列方式下所有的存储单元被一根位线串联在一起,而字线被分成了两组,每一组都由32根字线组成,这两组字线由两个可以被同时访问的五位地址表示,分别代表行地址和列地址。当行地址确定时这一行上的所有存储单元都可以被访问,但是只有同时也被列地址选中的那个单元才能连接到数据线上。

RAM(随机存储器):

随机存储器(RAM,Random Access Memory)可以在任意时间随机访问存储单元,具有快速读写数据的能力。因此常用来作为计算机的主存。下面来介绍几种常见的随机存储器。

静态存储器(静态随机存储器)

静态存储器只要不断电就能一直保持它的存储状态。下图是静态随机存储器的结构图(SRAM)

静态随机存储器

当需要对该存储单元进行读写操作的时候,字线首先被激活来闭合T1和T2,如果进行读操作就只需检查此时位线上的电位,如果单元状态为1则读线(b)上为高电平,写线(b‘)上为低电平,如果状态为0则与之相反。如果进行写操作,就需要驱动读线和写线分别为相应的电位从而迫使单元改变状态为我们所希望的状态。

动态随机存储器(DRAM):

静态随机存储器的读写速度很快,但是由于每个单位由多个晶体管组成因此难以实现高密度的存储。而动态随机存储器才用更加简单的存储结构可以弥补SRAM的这些不足,但是简单的结构不能长时间存储,除非它经常被访问来进行读写操作这样在每次操作过程中它的状态就会被刷新。

DRAM结构

ADRAM和SDRAM:

动态随机存储器根据操作时序产生的方式不同又分为异步动态随机存储(ADRAM)和同步动态随机存储(SDRAM)。ADRAM通过芯片外部的一个存储控制电路产生的信号来控制读写操作的时序,而SDRAM通过时钟线来控制工作时序,并且内置了控制电路和刷新电路,可以通过内部的刷新计数器来指定要刷新的行地址来实现自动刷新。SDRAM在行被选定激活时每个时钟都将数据放到数据线上,能够做到很快的数据传输速度,并且为了追求更快的传输速率,人们设计了双倍速率动态随机存储器(DDR),它充利用了时钟速率,在时钟的上升沿和下降沿都传输数据。

ps.存储器一秒钟传输的字节数和位数被称为存储器带宽,这是一个衡量存储器性能的指标。存储器与处理器之间数据的传输速率是“存储器带宽”和“处理器到存储器连接的带宽”的函数。因此还有一个提升传输速率的方向是提高处理器到存储器连接的带宽(Rambus存储器的方案)。

ROM(只读存储器):

随机存储器都有在上电的时候才能保存数据,而某些程序需要一直存储在设备上(就像之前介绍的引导程序),这时就需要只读存储器(ROM)这种非易失性存储器来记录程序。ROM存储器中存储的信息仅在存储器生产的时候被被写入一次,之后便无法被更改。下图是ROM的结构。

image-20241122201255067

存储单元中存储的值由制造时通过一个值来决定。

PROM:

可编程只读存储器,它允许用户编程一次,在编程之前存储器P点插入了一根熔丝所有单元均为0,用户在编程时可以通过高电流来将特定单位的熔丝融化,从而使单元置1,但是这个过程是不可逆的因此只能编程一次。

EPROM:

可擦除可编程只读存储器,它的P点是通过一个特殊的晶体管接地的,正常状态下该晶体管是关闭状态,可以向其中注入电荷来使其开启,要驱散电荷需要将存储芯片从电路上物理移除并暴露在紫外线下,它通常用在项目开发阶段来方便程序迭代,但是它每一次擦除会将所有单元擦除掉。

EEPROM:

电可擦除可编程只读存储器,它可以有选择的擦除存储的信息,但是它在写入,读取,擦除时需要使用不同的电压增加了电路的复杂性。

Flash(闪存)

闪存也是一种非易失性存储器,它允许写入,读取和擦除,基本原理是利用浮栅晶体管(Floating Gate Transistor)来存储信息。以下是其主要工作原理:

  1. 存储单元:每个存储单元由一个浮栅晶体管组成,浮栅上储存的电荷表示存储的数据位(0或1)。
  2. 写入操作:在写入数据时,电流通过栅极使得电子进入浮栅,从而在该单元的电荷状态中存储数据。
  3. 擦除操作:擦除数据时,通过提供特定的电压,电子会从浮栅中被移除,改变数据位的状态。
  4. 读取操作:读取数据时,控制电路会检测存储单元的电压状态,以判断存储的数据是0还是1。

Flash存储器主要分为以下几种类型:

  1. NOR Flash
    • 结构:采用并行连接的存储单元,具有随机访问特性。
    • 应用:适用于需要快速读取和执行代码的场合,如BIOS存储和嵌入式系统。
  2. NAND Flash
    • 结构:采用串联连接的存储单元,效率高,存储密度大。
    • 应用:广泛用于USB闪存驱动器、固态硬盘(SSD)和移动设备中。

NOR Flash由于具有随机访问的特性,可以作为嵌入式芯片的主存用于存放需要执行的指令,而NAND Flash由于它的存储密度大,代替磁盘成为了主流的辅助存储器

磁盘:

也叫机械硬盘,通过磁针和磁盘存储数据,特点是存储空间大,成本低,但是由于读写速度较慢,体积较大正逐渐被固态硬盘取代。

再谈存储结构:

回到最开始所说的存储结构,不同的位置存储器要根据它需要实现的功能来选择不同特点的存储材料。

计算机存储器的结构

从上向下来看除了处理器的寄存器在处理器内部以外,主(一级)高速缓存也在芯片内部,还有二级高速缓存和三级高速缓存它们的存储空间比一级高速高速要大一些但是读写速度要慢一些,它们通常是由SRAM技术实现的。

再往下来就到了主存储器部分。这个部分的存储空间相当大,但仍处于处理器地址映射的部分,可以由处理器直接访问,用于存放正在运行的程序以及堆栈,通常使用DDR来制作而成,它的读写速度也相当快(与高速缓存相去甚远)但是掉电会丢失数据,因此还需要辅助存储器来在掉电的时候来保存数据。

最后一级就是辅助存储器,它需要满足掉电不丢失,存储空间大的需求。因此一般使用磁盘,或者固态硬盘作为辅助存储器,由于处理器并不直接和辅助存储器进行交互,所以它对速度的要求并没有前面的存储设备高。

存储结构的工作机制:

我们之前讲到过处理器组织内存单元的方式是按字组织,并为每一个字节的内存空间(包括IO设备的寄存器空间)分配一个唯一的地址,这些唯一的地址组合在一起就是处理器的寻址空间。处理器的寻址方式是通过在地址总线上放上寻址空间内的地址来与目标存储单元进行数据的交互。

处理器的逻辑寻址空间的大小由地址总线的位数来决定,例如32位的总线最多访问4GB的空间(更大的地址总线就无法表示)。而实际的寻址空间是要小于等于逻辑寻址空间的,它的大小由组成它的主存和IO设备寄存器的内存空间来决定,不包括辅助存储器(虽然上辅助存储器也可以看作IO设备但是它的访问需要通过操作系统),寻址空间内的存储空间可以由处理器通过总线直接访问。

程序是在主存中执行的,执行的指令和产生的中间数据都存放在主存当中。数据在主存和处理器之间的传递速率会对程序执行的速率产生巨大的影响,需要尽可能的减少数据传递耗费的时间来提高执行效率,而高速缓存就是为此而生的。它是一个很小但是传输速率很快的存储器,在存储结构中放在主存和处理器之间,它依据程序的引用局部性(就是正在执行的指令的附近的指令和刚执行过的指令很快被再次执行到的概率较大)将可能会被执行到的指令提前存放在高速缓存当中,如果缓存中的指令真的被执行到了就直接从高速缓存中加载指令,这样一来就大大节省了时间(高速缓存传递数据能比主存快100倍)。

我们希望能得到更大的主存空间来运行更多的程序,通常会使用虚拟主存(实际上就是把辅助存储器当作主存使用)来扩大主存空间。举个例子,操作系统会把程序执行到的部分加载到主存当中,而未执行到的部分存放在辅助存储器上,由于实际寻址空间往往要比逻辑寻址空间小,因此操作系统使用这些未分配给任何存储空间的逻辑地址来“欺骗”处理器,让它认为这些地址是剩下的程序的地址,也就是让处理器“误以为”剩下的程序也在主存上(实际上这些程序还在辅助存储器当中,只是在处理器的角度看来这些数据都在它的寻址范围内它可以通过地址来直接访问)。当处理器使用虚拟地址(在实际寻址地址范围外却在逻辑寻址范围里)去访问未执行到的程序时,虚拟地址指向的内存空间并不存在,但是在这条指令传递的过程中内存管理单元(MMU)会将虚拟地址转换成一个实际存在的地址,并通知操作系统使用DMA将剩下的程序从辅助存储器中传送到转换的实际地址,使处理器完成程序的访问,这个过程如下图所示:

虚拟地址转换