计算机组成原理(三)存储系统

3.1 存储系统基本概念

3.1.1 存储器的层次结构

层序结构.png
  1. 主存储器。简称主存,又称内存储器(内存),用来存放计算机运行期间所需的大量程序和数据,CPU 可以直接随机地对其进行访问,也可以和高速缓冲存储器(Cache)及辅助存储器交换数据。其特点是容量较小、存取速度较快、每位价格较高。
  2. 辅助存储器。简称辅存,又称外存储器(外存),是主存储器的后援存储器,用来存放当前暂时不用的程序和数据,以及一些需要永久性保存的信息,它不能与CPU 直接交换信息。其特点是容量极大、存取速度较慢、单位成本低。
  3. 高速缓冲存储器。简称Cache,位于主存和CPU之间,用来存放正在执行的程序段和数据,以便CPU 能高速地使用它们。Cache 的存取速度可与CPU 的速度相匹配,但存储容量小、价格高。现代计算机通常将它们制作在CPU中。
存储和CPU的交互.png

辅存中的数据要调入主存后才能被CPU访问

3.1.2 按存储介质分类

按存储介质,存储器可分为磁表面存储器(磁盘、磁带)、磁心存储器半导体存储器(MOS型存储器、双极型存储器)和光存储器(光盘)。

3.1.3 按存取方式分类

随机存取存储器(RAM):读写任何一个存储单元所需时间都相同,与存储单元所在的物理位置无关,如内存条等

顺序存取存储器(SAM):读写一个存储单元所需时间取决于存储单元所在的物理位置,如磁盘等

直接存取存储器(DAM):既有随机存取特性,也有顺序存取特性。先直接选取信息所在区域,然后按顺序方式存取。如硬盘等

相联存储器,即可以按内容访问的存储器(CAM)可以按照内容检索到存储位置进行读写,“快表”就是一种相联存储器

3.1.4 按信息的可更改性

读写存储器—即可读、也可写(如:磁盘、内存、Cache)
只读存储器—只能读,不能写(如:实体音乐专辑通常采用CD-ROM,实体电影采用蓝光光碟,BIOS通常写在ROM中)

3.1.5 按信息的可保存性

断电后,存储信息消失的存储器——易失性存储器(主存、Cache)
断电后,存储信息依然保持的存储器——非易失性存储器(磁盘、光盘)
信息读出后,原存储信息被破坏——破坏性读出(如DRAM芯片,读出数据后要进行重写)
信息读出后,原存储信息不被破坏——非破坏性读出(如SRAM芯片、磁盘、光盘)

3.1.6 存储器的性能指标

  1. 存储容量:存储字数×字长(如1M×8位)。
  2. 单位成本:每位价格=总成本/总容量。
  3. 存储速度:数据传输率=数据的宽度/存储周期。
存取周期.png
  1. 主存带宽(Bm):主存带宽又称数据传输率,表示每秒从主存进出信息的最大数量,单位为字/秒、字节/秒(B/s)或位/秒(b/s)。

3.2 半导体随机存取器

3.2.1 主存储器的基本组成

3.2.1.1 存储器芯片的基本原理

存储器芯片的基本电路如下

存储器芯片结构.png

封装后如下图所示

封装后.png
  • 存储矩阵为一一个个存储单元,一个存储单元由MOS管和电容组成
  • 译码驱动分为译码器和驱动器,其中译码器用于接收地址总线的MAR,获得地址后给对应的地址提供高电平,使MOS管导通,驱动器用于保证译码器稳定可靠,将电信号放大
  • 读写电路包括控制电路、自选线和数据总线
  • 地址线用于接收外界的地址信息,数据线用于数据的传输
  • 片选线控制存储器的工作状态

图中的每条线都会对应一个金属引脚,另外还有供电引脚、接地引脚,故可以由此求引脚数目

n位地址对应2n个存储单元
总容量=存储单元个数×存储字长=2^3×8bit=2^3×1Byte =8B
假如有8k×8位的存储芯片,即 2^{13}×8bit

3.2.1.2 寻址

现代计算机通常按字节编址,即每个字节对应一个地址

但也支持按字节寻址、按字寻址、按半字寻址、按双字寻址

3.2.2 SRAM和DRAM

(Dynamic Random Access Memory,DRAM)即动态RAM,使用栅极电容存储信息
(Static Random Access Memory,SRAM)即静态RAM,使用双稳态触发器存储信息

DRAM用于主存、SRAM用于Cache,两者都属于易失性存储器

3.2.2.1 存储元的区别

  • DRAM采用栅极电容,电容放电信息被破坏,是破坏性读出。读出后应有重写操作,也称“再生”,读写速度更慢,每个存储元制造成
    本更低,集成度高,功耗低,且电容内的电荷只能维持2ms,2ms之内必须“刷新”一次(给电容充电)

  • SRAM采用双稳态触发器,读出数据,触发器状态保持稳定,是非破坏性读出,无需重写,读写速度更快,每个存储元制造成
    本更高,集成度低,功耗大

存储元.png

3.2.2.2 DRAM的刷新

  • DRAM的刷新周期一般为2ms

  • 每次刷新以行为单位,每次刷新一行存储单元,使用行列地址可以减小选通线的数量,如下图

存储器模型.png

简单模型下需要有2^n根选通线,而行列地址下仅需2×2^{n/2}根选通线

采用地址线复用技术,行、列地址分两次送,可使地址线更少,芯片引脚更少,地址线为\frac{n}{2}

  • 刷新有硬件支持,读出一行的信息后重新写入,占用1个读/写周期
  • 刷新方式:假设DRAM内部结构排列成128×128的形式,读/写周期0.5us,2ms共2ms/0.5us = 4000 个周期
刷新方式.png

3.2.3 只读存储器(ROM)

ROM芯片具有非易失性,断电后数据不会丢失

  1. MROM(Mask Read-Only Memory)——掩模式只读存储器
    厂家按照客户需求,在芯片生产过程中直接写入信息,之后任何人不可重写(只能读出)。可靠性高、灵活性差、生产周期长、只适合批量定制
  2. PROM(Programmable Read-Only Memory)——可编程只读存储器
    用户可用专门的PROM写入器写入信息,写一次之后就不可更改
  3. EPROM(Erasable Programmable Read-Only Memory)——可擦除可编程只读存储器
    UVEPROM(ultraviolet rays)——用紫外线照射8~20分钟,擦除所有信息
    EEPROM(也常记为E2PROM,第一个E是Electrically)——可用“电擦除”的方式,擦除特定的字
    允许用户写入信息,之后用某种方法擦除数据,可进行多次重写
  4. Flash Memory ——闪速存储器,如U盘、SD卡
    在EEPROM基础上发展而来,断电后也能保存信息,且可进行多次快速擦除重写,由于闪存需要先擦除在写入,因此闪存的“写”速度要比“读”速度更慢。
  5. SSD(Solid State Drives)——固态硬盘
    由控制单元+存储单元(Flash芯片)构成,与闪速存储器的核心区别在于控制单元不一样,但存储介质都类似,可进行多次快速擦除重写。SSD速度快、功耗低、价格高。目前个人电脑上常用SSD取代传统的机械硬盘

主板上的BIOS芯片(ROM),存储了“自举装入程序”,负责引导装入操作系统(开机)。逻辑上,主存由 辅存RAM+ROM组成,且二者常统一编址

  • 很多ROM芯片虽然名字是“Read-Only”,但很多ROM也可以“写”
  • 闪存的写速度一般比读速度更慢,因为写入前要先擦除
  • RAM芯片是易失性的,ROM芯片是非易失性的。很多ROM也具有“随机存取”的特性

3.3 主存储器与CPU的连接

3.3.1 连接原理

  • 主存储器通过数据总线、地址总线和控制总线与CPU连接。

  • 数据总线的位数与工作频率的乘积正比于数据传输率。

  • 地址总线的位数决定了可寻址的最大内存空间。

  • 控制总线(读/写)指出总线周期的类型和本次输入/输出操作完成的时刻。

主存储器与CPU的连接.png

3.3.2 主存容量的扩展

3.3.2.1 位扩展法

位扩展的连接方式是将多个存储芯片的地址端、片选端和读写控制端相应并联,数据端分别引出。

位扩展.png

3.3.2.2 字扩展法

字扩展是指增加存储器中字的数量,而位数不变。字扩展将芯片的地址线、数据线、读写控制线相应并联,而由片选信号来区分各芯片的地址范围。

子扩展.png

3.3.2.3 字位同时扩展

实际上,存储器往往需要同时扩充字和位。字位同时扩展是指既增加存储字的数量,又增加存储字长。

字位同时扩展.png

3.3.3 存储芯片的地址分配和片选

对比.png

3.4 双端口RAM和多模块存储器

3.4.1 双端口RAM

两个端口对同一主存操作有以下4种情况:

  1. 两个端口同时对不同的地址单元存取数据。
  2. 两个端口同时对同一地址单元读出数据。
  3. 两个端口同时对同一地址单元写入数据。
  4. 两个端口同时对同一地址单元,一个写入数据,另一个读出数据

当出现(3)(4)时,置“忙”信号为0,由判断逻辑决定暂时关闭一个端口(即被延时),未被关闭的端口正常访问,被关闭的端口延长一个很短的时间段后再访问。

3.4.2 多模块存储器

3.4.2.1 多体并行存储器

多体并行存储器由多体模块组成。每个模块都有相同的容量和存取速度,各模块都有独立的读写控制电路、地址寄存器和数据寄存器。它们既能并行工作,又能交义工作。多体并行存储器分为高位交叉编址(顺序方式)和低位交叉编址(交叉方式)两种.

①高位交叉编址

高位交叉编址.png

②低位交叉编址

低位交叉编址.png

采用“流水线”的方式并行存取(宏观上并行,微观上串行),连续取n个存储字耗时可缩短为
t=T+(n-1)r
宏观上,一个存储周期内,m体交叉存储器可以提供的数据量为单个模块的m倍。存取周期为T,存取时间/总线传输周期为r,为了使流水线不间断,应保证模块数
m \ge T/r

对比.png

3.4.2.2 单体多字存储器

单体多字系统的特点是存储器中只有一个存储体,每个存储单元存储m个字,总线宽度也为m个字。一次并行读出m个字,地址必须顺序排列并处于同一存储单元。

缺点:每次只能同时取m个字,不能单独取其中某个字;指令和数据在主存内必须是连续存放的

3.5 高速缓冲存储器

3.5.1 Cache的基本工作原理

为便于Cache 和主存之间交换信息,Cache 和主存都被划分为相等的块,Cache 块又称Cache 行,每块由若干字节组成。块的长度称为块长(Cache 行长)。由于Cache 的容量远小于主存的容盘,所以Cache中的块数要远少于主存中的块数,它仅保存主存中最活跃的若干块的副本。因此 Cache 按照某种策略,预测CPU在未来一段时间内欲访存的数据,将其装入Cache.

将某些主存块复制到Cache中,缓和CPU与主存之间的速度矛盾

CPU欲访问的信息已在Cache中的比率称为命中率H。先访问Cache,若Cache未命中再访问主存,系统的平均访问时间t 为
𝑡 = 𝐻𝑡_𝑐 + (1 − 𝐻 )(𝑡_𝑐 + 𝑡_𝑚)
同时访问Cache和主存,若Cache命中则立即停止访问主存系统的平均访问时间t 为
𝑡 = 𝐻𝑡_𝑐 + (1 − 𝐻 )𝑡_𝑚

3.5.2 程序访问的局部性原理

空间局部性:在最近的未来要用到的信息(指令和数据),很可能与现在正在使用的信息在存储空间上是邻近的

时间局部性:在最近的未来要用到的信息,很可能是现在正在使用的信息

基于局部性原理,不难想到,可以把CPU目前访问的地址“周围”的部分数据放到Cache中

3.5.3 Cache和主存的映射方式

映射方式.png
图片.png

3.5.4 Cache替换算法

直接映射方式不需要考虑替换算法,仅全相联映射和组相联映射需要考虑

①随机算法(RAND):若Cache已满,则随机选择一块替换。实现简单,但完全没考虑局部性原理,命中率低,实际效果很不稳定

②先进先出算法(FIFO):若Cache已满,则替换最先被调入Cache的块。实现简单,依然没考虑局部性原理

③近期最少使用算法(LRU):为每一个Cache块设置一个“计数器”,用于记录每个Cache块已经有多久没被访问了。当Cache满后替换“计数器”最大的.基于“局部性原理”,LRU算法的实际运行效果优秀,Cache命中率高。

  1. 命中时,所命中的行的计数器清零,比其低的计数器加1,其余不变;
  2. 未命中且还有空闲行时,新装入的行的计数器置0,其余非空闲行全加1;
  3. 未命中且无空闲行时,计数值最大的行的信息块被淘汰,新装行的块的计数器置0,其余全加1。

④最不经常使用算法(LFU):为每一个Cache块设置一个“计数器”,用于记录每个Cache块被访问过几次。当Cache满后替换“计数器”最小的.并没有很好地遵循局部性原理,因此实际运行效果不如LRU

  1. 新调入的块计数器=0,之后每被访问一次计数器+1。需要替换时,选择计数器最小的一行
  2. 若有多个计数器最小的行,可按行号递增、或FIFO策略进行选择

3.5.5 Cache写策略

现代计算机常采用多级Cache,各级Cache之间常采用“全写法+非写分配法”;Cache-主存之间常采用“写回法+写分配法”

  • 离CPU越近的速度越快,容量越小

  • 离CPU越远的速度越慢,容量越大

3.5.5.1 写命中

写回法(write-back):当CPU对Cache写命中时,只修改Cache的内容,而不立即写入主存,只有当此块被换出时才写回主存。减少了访存次数,但存在数据不一致的隐患。

全写法(写直通法,write-through):当CPU对Cache写命中时,必须把数据同时写入Cache和主存,一般使用写缓冲(write buffer)。使用写缓冲,CPU写的速度很快,若写操作不频繁,则效果很好。若写操作很频繁,可能会因为写缓冲饱和而发生阻塞访存次数增加,速度变慢,但更能保证数据一致性

3.5.5.2 写不命中

写分配法(write-allocate):当CPU对Cache写不命中时,把主存中的块调入Cache,在Cache中修改。通常搭配写回法使用。

非写分配法(not-write-allocate):当CPU对Cache写不命中时只写入主存,不调入Cache。搭配全写法使用。

3.6 虚拟存储器

这个部分结合操作系统来看

3.6.1 页式存储器

页式存储系统:一个程序(进程)在逻辑上被分为若干个大小相等的“页面”,“页面”大小与“块”的大小相同。每个页面可以离散地放入不同的主存块中。CPU执行的机器指令中,使用的是“逻辑地址”,因此需要通“页表”将逻辑地址转为物理地址。页表的作用:记录了每个逻辑页面存放在哪个主存块中

逻辑地址(虚地址):程序员视角看到的地址
物理地址(实地址):实际在主存中的地址

快表是一种“相联存储器”,可以按内容寻访,表中存储的是页表项的副本;Cache中存储的是主存块的副本

TLB.png

3.6.2 虚拟存储器

主存中的页表.png

地址映射表中每一行都有对应的标记项

  • 有效位:这个页面是否已经调入主存
  • 脏位:这个页面是否被修改过
  • 引用位:用于页面置换算法,比如可以统计这个页面访问过多少次
  • 物理页:主存块号
  • 磁盘地址:这个页面的数据在磁盘中的存放位置.

主存-辅存:实现虚拟存储系统,解决了主存容量不够的问题

Cache-主存:解决了主存与CPU速度不匹配的问题

推荐阅读更多精彩内容