计算机组成原理——存储系统
存储器层次结构
存储器层次结构如下:
- 寄存器(CPU)
- Cache(高速缓冲存储器)
- 主存
- 磁盘
- 磁带、光盘等
按照上述层次结构,自下而上速度依次增快、容量相对依次渐小、造价越来越高昂。
有的书上把计算机内部的磁盘统称为“辅存”,把U盘、光盘等成为外存。但是也有部分书籍将磁盘、U盘、光盘等统称为“辅村”或者“外存”。本文按照后者进行描述。
我们平常安装的应用程序一般是放在辅存中的,辅存容量大,但是读写较慢。如果CPU直接访问辅存的话,那么CPU就会被辅存的速度拖累,因此CPU想要运行应用程序,需要将辅存中的程序与数据放到内存中去才行。
主存中的数据被放到缓存中,CPU可以直接往缓存里写数据和读数据。虽然主存的速度已经很快了,但是相对于CPU来讲仍跟不上CPU的速度,为了解决主存与CPU之间速度的矛盾就在二者之间增加了缓存。
主存与辅存之间实现了虚拟存储系统以解决主存容量不够的方式。(参考OS)
存储器分类
按照存储介质分类:
- 半导体存储器:以半导体器件存储信息(主存、Cache等)
- 磁表面存储器:以磁性材料存储信息(磁盘、磁带等)
- 光存储器:以光介质存储信息(光盘等)
按存取方式分类:
- 随机存取存储器(Random Access Memory,RAM):读写任何一个存储单元所需的时间都几乎相同,与存储单元所在的物理位置无关。
- 顺序存取存储器(Sequential Access Memory, SAM):读写一个存储单元所需时间取决于存储单元所在的物理位置。
- 直接存取存储器(Direct Access Memory,DAM):既有随机存取的特性,也有顺序存取的特性。先直接选取信息所在区域,然后按顺序方式存取。
其中SAM和DAM统称为串行访问存储器,即读写某个存储单元所需的时间与存储单元的物理位置有关。
还有一种叫做相联存储器(Associative Memory),即可以按照内容访问的存储器(Content Addressed Memory, CAM)。如硬件实现的快表(TLB)就是一种CAM。
按照信息可更改性分类:
- 读写存储器(Read/Write Memory):可读也可写,如内存、磁盘等。
- 只读存储器(Read Only Memory):只能读不能写,如实体音乐专辑使用的CD-ROM。BIOS通常写在ROM中。
按照信息等可保存性:
- 易失性存储器:断电后存储信息消失的存储器。(内存、Cache等)
- 非易失性存储器:断电后存储信息依然保持的存储器。(磁盘、光盘)
信息读出有两种:
- 破坏性读出:信息读出后,原来的存储信息被破坏(如DRAM芯片,读出数据后要重写)
- 非破坏性读出:信息读出后,原来等存储信息不被破坏(如SRAM芯片、磁盘、光盘等)
存储器性能指标
存储容量:存储字数*存储字长
单位成本:每位价格=总成本/总容量
存储速度:传输速率=数据的宽度/存储周期
数据的宽度即存储字长。
存储周期又称为读写周期读写周期或访问周期,它是存储器进行一次完整的读写操作所需的全部时间,即连续两次独立地访问存储器操作(读或写)之间所需的最小时间间隔,可以划分为存取时间和恢复时间。
存取时间是指从启动一次存储器操作到完成该操作所经历的时间,分为读出时间和写入时间。
主存带宽又称数据传输率,表示每秒从主存进出信息的最大数量,单位为字/秒、字节/秒、位/秒等。
主存储器的基本组成与原理
主存基本的半导体元件与原理
在前面我们提到过主存储器分为存储体、MAR、MDR,三者在时序控制逻辑电路的协调下配合工作。
存储体中包含若干个存储单元,每个存储单元的每一位实际上是由存储元这个电子元件来保存的。存储元包含一个电容和一个MOS管,每个存储元可以存放一个二进制位的0或1。
MOS管可以理解为是一种电控开关,输入电压达到某个阀值的时候,MOS管就可以接通。
存储器的读写的基本大小之所以是以存储字长为单位的,是因为MOS管的一端接在了同一条线上。
主存存储芯片的基本原理
MAR连接地址总线和译码器,给定n位地址对应 2 n 2^{n} 2n个存储单元,译码器输出端就有 2 n 2^{n} 2n个字选线。
若CPU给定的地址n位全为0到MAR中,译码器会将地址对应的第0根字选线一个高电平输出,由于该行存储元的MOS管同一级都连接到该线上,因此本行存储元都会被选通,与MOS相连的另一端,也就是每一列的数据线(位线)就可以输出该存储字的每一位二进制数据,每一列的位线与MDR相连接,MDR输出端与数据总线相连接,这样CPU就能够通过数据总线拿到MDR里寄存的数据了。
由此可见,数据总线的宽度与存储字长是相等的。
此外我们还需要一个控制电路来控制译码器、MAR、MDR。由于我们采用电信号传输方式,因此CPU给出的地址到MAR未稳定之前,其地址信息是不能够到译码器中的。当数据输出的时候,只有当数据到MDR稳定之后,才能从数据总线送出数据。这一系列的操作都是要通过控制电路来完成。
控制电路输入端分别是片选线、读控制线、写控制线。
片选线通常是低电平有效,此时说明该芯片可以工作。如果我们只想要存储器上某块芯片可以工作而其他芯片不工作,我们只需要给这个芯片的片选线加一个低电平,而其他芯片的片选线都是高电平就行了。
有的控制电路用读写线分为两根(如上图),当读控制线为低电平的时候允许读,当写控制线为低电平的时候允许写;当然有些电路采用一根读/写线,低电平表示写,高电平表示读。(读写线的个数会影响暴露的引脚数)
还有些存储器会在译码器后面添加一个驱动器,这个驱动器用于保证译码器输出的电信号是稳定可靠的。
我们经常会看到对于某个存储芯片的描述是8K*8位的,8K是指存储单元的个数,也就是有 2 13 2^{13} 213个存储单元,8位是指存储字长。
若存储器总容量为1KB,地址线总共有10根,则按照以下编址方式:
- 按字节寻址:总共 2 10 2^{10} 210个单元,每个单元1Byte
- 按字寻址:总共256个单元,每个单元4Byte
- 按半字寻址:512个单元,每个单元2Byte
- 按双字寻址:128个单元,每个单元8Byte
如果按字寻址,我们只需要把4个字节合并,只需要把字地址算术左移两位换成与之对应的字节地址。
DRAM和SRAM
动态RAM(Dynamic Random Access Memory,DRAM),用于主存。(当然,DRAM已经过时了,现在的主存通常使用SDRAM。)
静态RAM(Static Random Access Memory,SRAM),用于Cache。
DRAM使用栅极电容存储信息,SRAN使用双稳态触发器存储信息。
DRAM的栅极电容如果给字选择线相连的MOS管引脚添加一个5V的电压,MOS管就会被导通,如果此时MOS管另一端也就是连接数据线的那一侧同样有一个5V的电压,这样栅极电容一侧就会带5V的电压,另一侧由于接地带0V电压,这样就完成了一个二进制1的存储。如果数据线输入0V低电平信号,则MOS管被导通后,栅极电容金属板两侧的电压都是0V,电容内未储存电荷,这样就存储了一个二进制0。
若要读出栅极电容中的数据,只需要给字选择线加一个高电平,MOS管导通,若栅极电容存储电荷,数据线上就会产生电流,此时表示读出1;若栅极电容未存储电荷,则数据线上就无电流表示读出0。
SRAM的存储元是双稳态触发器。双稳态触发器中包含6个MOS管,分别用M1到M6标注。双稳态触发器可以存储两种稳定状态,第一种状态为1,A点高电平,B点低电平;如果A点低电平,B点高电平则存储0。
对于双稳态触发器,如果存储的是一个1,若给字选择线加一个5V的高电平,BLX这条线会输出一个低电平信号,读出1;如果存放的是0,左侧的BL线会输出一个低电平信号读出0。
我们来比较下两种元件。对于DRAM的栅极电容来说,电容放电信息被破坏,是破坏性读出。读出后应有重写操作,也称再生;对于SRAM的双稳态触发器,读出数据,触发器状态保持稳定,是非破坏性读出,无需重写。
DRAM存储元每个存储元件制造成本低,集成度高;而SRAM每个存储元成本更高,集成度低。
由于栅极电容内的电荷长期存放会流失,存放的信息也就有可能存在误差,因此只能维持2ms,2ms后即使不断电也会消失,2ms之后需要进行刷新。而对于双稳态触发器,如果一直给VDD维持一个5V的电压,只要不断电双稳态触发器的数据就不会丢失。
DRAM的刷新
DRAM刷新周期一般为2ms,以行为单位,每次刷新一行存储元。
如果DRAM不采用行列地址的方式,每一根选通线分别与一个存储单元相连,译码器输出端就会随着地址位数增加而以2的幂指数的方式递增。这种情况下,如果有n位地址,则译码器就要连接 2 n 2^{n} 2n个选通线,这显然是不能接受的。
因此,DRAM采用行列编址方式,每次刷新以行为单位,刷新一行的存储单元。
DRAM的刷新方式有硬件支持,存储器独立完成,不需要CPU控制,读出一行信息后重新写入,占用一个读写周期。
假设DRAM内部结构排列为128*128,存取周期(读/写周期)0.5微秒:
- 思路一:每次读写完后都刷新一行,系统的存取周期变1微秒,前0.5微秒用于读,后0.5微秒用于写。2ms内可以刷新2000次,足以刷新128行。这种刷新方式叫做分散刷新。
- 思路二:2ms内集中安排某段时间进行刷新,这种方式叫做集中刷新。由于有一段时间是刷新专用的,这段时间无法访问存储器,称为访存死区。此时系统存取周期与存储器一致为0.5微秒,其中2ms尾部有128周期(64微秒)用于刷新,其他时间(3872个周期,1936微秒)用于读写。
- 思路三:2ms被128行分成128段时间,每个时间间隔2ms/128=15.6微秒,由于存取周期0.5微秒,也就是说每个15.6微秒内有0.5微秒的死时间用于刷新不能访存,这种刷新方式叫做异步刷新。这些死时间往往是在CPU不需要访存(译码)阶段。
DRAM地址线复用技术
对于DRAM,正常情况下有n位地址,就需要n位地址线。为了节省成本,我们可以使用地址线复用技术,将地址拆分成行地址和列地址。这样在使用的时候,我们只需要将行地址和列地址分两次进行传输。
第一次发送行地址,行地址会被送往行地址缓冲器里;第二次发送列地址,列地址会被送往列地址缓冲器中。然后会分别送往行地址译码器和列地址译码器。此时最少只需要 n 2 \frac{n}{2} 2n条地址线即可(芯片引脚数量也相对减少了)。