# 存储器概述

# 存储器分类

存储介质

  • 磁存储器:机械硬盘
  • 半导体存储器:固态硬盘,内存条
  • 光存储器:光盘

存取方式

  • 随机存储器RAMRAM:可按照地址随机读写数据存储单元,存取访问时间与存储单元的位置无关

  • 顺序存储器SAMSAM:存储单元中的内容只能依地址顺序访问,访问速度与存储单元的位置有关

  • 直接存储器DAMDAM:不必经过顺序搜索就能在存储器中直接存取信息的存储器,这类存储器兼有随机存储器和顺序存储器的访问特性。

    (绕过 CPUCPU 直接传输数据,DMADMA 是外设与内存间直接传输数据的技术,无需 CPU 逐字节干预,但仍需指定内存地址(非搜索))

# 存储器技术指标

存储容量

可以存储的二进制信息总量,采用比特位或者字节表示

  • 位表示: 以存储器中存储单元总数存储字位数的乘积表示,eg:1K×4eg:1K\times 4 表示该芯片有 1K1K 个单元,每个存储单元长度为 44 个二进制位
  • 字节表示:以存储器中的单元总数表示,存储单元由 88 个二进制位组成,称为一个字节,用 BB 表示,eg:128Beg:128B 表示该芯片由 128128 个单元

存取速度

  • 存取时间:启动一次存储器操作到该操作完成所经历的时间
  • 存取周期:连续启动两次访问操作之间的最短时间间隔
  • 存储器带宽:单位时间内存储器所能传输的信息量,一般而言,存取时间越短,数据位宽越大,存储带宽越高

# 存储系统层次结构

# 主存基本结构

主存是机器指令直接操作的存储器

在存储器芯片的规格(如 8×8、8×16、8×32)中,第一个数字通常表示 地址线的数量(或地址空间大小),第二个数字表示 数据线的位数(字长)

# 主存中数据的存放

# 存储字长和数据字长的概念

存储字长:指主存储器(内存)一次读写操作中传输的数据位数,即内存单元的宽度。例如,内存可能以 64 位为单位进行读写,即使 CPU 的数据字长是 32 位。

数据字长:指 CPU 一次能处理的二进制数据的位数,通常由 ALU(算术逻辑单元)的宽度决定。例如,32 位 CPU 的数据字长为 32 位,表示其能一次性处理 32 位的数据运算。

# 地址访问模式

存储字长都是字节的整数倍,主存通常按字节进行编址

按照访问存储单元的大小,主存地址可以分为字节地址,半字地址,字地址

字节地址逻辑右移一位得到半字地址,右移两位可得到字地址

不同的地址访问模式所使用的主存地址实际上都是字节地址,CPUCPU 在执行指令的时候可以将字节的低两位用于访问控制

  1. 采用字节访问模式,字节地址的低两位用于选择字存储单元中的哪一个字节
  2. 采用半字访问模式,字节地址的倒数第 22 位用于选择字存储单元中的哪个半字

eg:eg:

  • MOV AL,[0x4][AL]=0x00
  • MOV AX,[0x4][AX]=0xEF00
  • MOV EAX,[0x4][EAX]=0xABEF00

1MB 按照字节寻址 需要多少位地址线?

1MB=220B1MB=2^{20}B 按照字节编址,需要 2020 条地址线

1MB 按 16 位字寻址 需要多少位地址线

按照 1616 位字寻址,1MB=220B=2191MB=2^{20}B=2^{19}

所以需要 1919 条地址线

# 大端和小端

# 数据的边界对齐

  • 字节数据不存在边界对齐问题
  • 半字 (2(2 字节)) 数据的起始字节地址的最低 11 位为 00 ,即地址是 22 的倍数
  • 单字 (4(4 字节)) 数据的起始字节地址的最低 22 位为 0000,即地址是 44 的整数倍
  • 双字(8(8 字节)) 数据的起始字节地址的最低 33 位为 000000,即地址是 88 的整数倍、

# 半导体存储器

# 静态 MOS 存储器

以静态 MOSMOS 存储元为基本单位组成的存储器称为静态 MOSMOS 存储器 (SRAM)(SRAM)

“静态” 指的是只要保持通电,其内部所存储的数据就可以保持不变,而不需要进行周期性地刷新;但是只要断电,数据就会消失

# 存储元

存储元是存储器中的最小存储单元,其作用是存储一位二进制信息

若干存储元组成一个存储单元,若干存储单元组成一个存储器

初始状态

读操作

行列选通信号都为有效高电平

将两个位线的输出信号经过差分放大器放大后,就可以根据电流方向的不同输出不同的数据信息

写操作

行列选通信号都为有效高电平

信息的保持

行列选通信号都为无效信号低电平

总结

# 存储元扩展

同一时刻只能访问一位数据,而实际存储器均是以字节为基本单位的,如何扩展存储器的字长呢?

字长扩展

# 静态 MOS 存储器的结构

存储阵列

驱动器

每个行译码器输出信号都要同时驱动这一行上所有位存储体的 T5T6T_5、T_6 两个门控制

  • 对于 44 个存储阵列并发,每一根行译码输出信号要驱动 64×2×4=51264\times 2\times 4=512 个门控制,负载较大,用驱动增强负载功能

每个列译码器输出信号要打开 T7T8T_7、T_8 两个门控制

  • 对于 44 位存储体需要驱动 2×4=72\times 4=7 个门控制,负载较大,用驱动增强负载功能

# 存储器芯片实例

写入时

CS,WE\overline{CS},\overline{WE} 均有效(低电平),左侧的三态门打开,数据总线上的数据经输入数据控制逻辑写入存储器

读出时

WE\overline{WE} 无效(高电平),右侧三态门打开,数据从存储器读出并由列 I/OI/O 电路送入数据总线

# SRAM 读写时序

存储器由自己的读写周期特性,只有按照存储器的读写周期去访问存储器才能保证读写操作的正确性

习题

SRAMSRAM 芯片的引脚通常包括以下几类:

  • 地址线
  • 数据线
  • 控制信号线
  • 电源和地线

地址线:256K=218b256K=2^{18}b,需要 1818 根地址线

数据线:1616

控制信号线:CS\overline{CS}WE\overline{WE},两根

18+16+2=3618+16+2=36

# 动态 MOS 存储器

# 存储元

  • 电容 CC 没电表示二进制 00

  • 电容 CC 充满电表示二进制 11

读操作会使电容放电,原来存储的 11 变成 00,所以在读之后需要进行数据恢复

# 存储元扩展

  1. 预充电操作:将Y0Y3Y_0\sim Y_3 这些线充到 VCC2{\frac{V_{CC}}{2}}
  2. 访问操作:接着给出行选通信号。让每个电容上存储 1100
  3. 信号检测:读入时,如果电容本来是 11,操作会使 YiY_i 的电压变成 VCC2+δ\frac{V_{CC}}{2}+\delta,电容变成 00;如果电容本来是 00,操作会使 YiY_i 的电压变成 VCC2δ\frac{V_{CC}}{2}-\delta
  4. 数据恢复
  5. 数据输出 / 输入

# 动态 MOS 存储器的刷新

# 概念

最大刷新周期:从数据存入 DRAMDRAM 开始,到数据丢失之前为止的这段时间

刷新周期DRAMDRAM 实际完成两次完整刷新之间的时间间隔

刷新方式:按行刷新,为了缩短刷新周期,可减少存储阵列的行数,增加列数

# 刷新的方式

因为 DRAMDRAM 在刷新时是不能响应 CPUCPU 的访问的,因此 CPUCPUDRAMDRAM 进行访问 和 内存控制器对 DRAMDRAM 进行刷新就存在内存争用问题

集中刷新

分散刷新

异步刷新

# 动态 MOS 存储芯片实例

# 动态 MOS 存储器的读写周期

读周期中:

  1. 行地址必须于 RAS\overline{RAS} 有效前送到地址输入端
  2. 由于地址复用,因此 CAS\overline{CAS} 必须滞后于 RAS\overline{RAS},直到列地址送入地址输入端为止
  3. RAS\overline{RAS}CAS\overline{CAS} 必须保持一定的宽度
  4. WE\overline{WE} 信号为高电平,必须在 CAS\overline{CAS} 有效前建立
习题

# 主存的组织及与 CPU 的连接

# 存储器的扩展

# 位扩展

当存储芯片数据总线位宽小于 CPUCPU 数据总线位宽时,采用位扩展的方式进行扩展

# 字扩展

当存储芯片容量不能满足存储器对存储容量的需求时,采用字扩展方式扩展存储器

# 字位同时扩展

当存储芯片的数据位宽和存储容量均不能满足存储器的数据位和存储容量要求时,可以采用字位同时扩展方式来组织存储器

  1. 首先通过位扩展满足数据位的要求
  2. 再通过字扩展满足存储总容量的要求

例题

# 存储器接口设计举例

(1)(1) 画出地址译码方案

总容量:FFFF0000+1=216=64KBFFFF-0000+1=2^{16}=64KB

ROMROM 的存储容量:3FFF0000+1=214=16KB3FFF-0000+1=2^{14}=16KB

RAMRAM 的存储容量:FFFF6000+1=213+215=40KBFFFF-6000+1=2^{13}+2^{15}=40KB

其他的存储容量:641640=8KB64-16-40=8KB

因为存储芯片 ROMROMRAMRAM 的存储容量不能满足存储器对存储容量的要求,所以需要字扩展

地址译码采用 8KB8KB 作为区域单元,则将 64KB64KB 的存储空间分为 888KB8KB

所以需要 33 根地址线用于区域选择译码;剩下的 8KB=213B8KB=2^{13}B 需要 1313 根地址线;正好总共 1616 根地址线

(2)(2) 如果 ROM 和 RAM 存储器芯片都采用 8K×18K×1 的芯片,试画出存储器与 CPU 的连接图

注意 ROMROM 是只读存储器,没有读写 WEWE 控制端

(3)(3)​ 如果 ROM 存储器芯片采用 8K×88K×8 的芯片,RAM 存储器芯片采用 4K×84K×8 的芯片,试画出存储器与 CPUCPU 的连接图

因为 4K×84K\times 8 的芯片只需要 1212 位地址线,所以多出来的一根地址线 A12A_{12} 用于选择使能端 CSCS

(3)(3) 如果 ROM 存储器芯片采用 16K×816K×8 的芯片,RAM 存储器芯片采用 8K×88K×8 的芯片,试画出存储器与 CPUCPU 的连接图

# 并行主存系统

提高主存的存取速度的方法:

  1. 使用高速元件来提高主存的访问速度
  2. 通过存储器的并行工作来提高主存的访问速度

双端口存储器

单体多字存储器

多体交叉存储器

习题

# 高速缓冲存储器

# cache 工作原理

主存一般采用容量大、功耗较小、成本较低的同步动态随机存取存储器 DRAMDRAM

静态随机存取存储器 SRAMSRAM 的容量小、功耗大、成本高,但 SRAMSRAM 的访问速度远高于 DRAMDRAM

因此,为了提升 CPUCPU 访问主存的性能,通常会在 CPUCPU 与主存之间添加一个 SRAMSRAM 作为高速缓冲存储器 cachecache

  • 将主存中经常访问或即将访问的数据,复制一份调度到 cachecache 中,使得大部分数据访问都可以在 cachecache 中进行,从而提升系统性能
  • 采用这种方法的主要原因是 CPUCPU 执行的程序具有较强的程序局限性

# 程序局限性

在一段时间内,整个程序的执行仅限于一个较小的局部范围内

# 时间局限性

若程序在某个时刻访问了一个存储位置,该位置在未来可能会被多次访问

# 空间局限性

若程序访问了某个存储位置,则其附近的存储位置也可能被访问

# cache 的基本概念–cache 系统的性能评价

上图的情况下,数据访问时间称为命中访问时间,记作 tct_c

包括

  • cachecache 内的查询时间
  • cachecache 的访问时间

上图的情况下,数据访问时间称为缺失补偿

包括

  • cachecache 内的查找时间
  • 内存访问时间,较长,记作 tmt_m(一般用 tmtm 表示缺失补偿)
  • cachecache 访问时间

为了便于快速查找,主存和 cachecache 都被划分成若干个固定大小的数据块,每个数据块又包含若干个字

预读策略:出现数据缺失的情况,则需要将缺失数据所在的数据块从慢速主存载入 cachecache 中(缺失数据相邻的数据也会随着数据块一起载入 cachecache

数据块的地址由地址块块内偏移地址两部分构成

命中率

程序运行期间命中 cachecache 的次数记作 ncn_c,从主存中访问信息的次数记作 nmn_m,命中率记作 hh

h=ncnc+nnh=\frac{n_c}{n_c+n_n}

缺失率

1h1-h

cache/cache/ 主存系统的平均访问时间

命中情况下的访问时间记作 tct_c,数据缺失情况下的访问时间记作 tmt_mcache/cache/ 主存系统的平均访问时间记作 tat_a

ta=htc+(1h)tmt_a=ht_c+(1-h)t_m

访问效率 ee

e=tcta=tchtc+(1h)tm=1h+(1h)tmtc=1h+(1h)re=\frac{t_c}{t_a}=\frac{t_c}{ht_c+(1-h)t_m}=\frac{1}{h+(1-h)\frac{t_m}{t_c}}=\frac{1}{h+(1-h)r}

rr 一般以 5105\sim 10 为宜

# cache 的读、写流程与关键技术

# 相联存储器 CAM

CAMCAM 通常用于 cachecache 的快速查找,也可用于在虚拟存储器中存放段表、页表和 TLBTLB

CAMCAM 是一种按内容进行访问的存储器,用于存放查找表,其内部存储的基本数据单元是键值对

CAMCAM 的输入是检索关键字 keykey,输出是该关键字对应的 valuevalue

# 地址映射

# 直接相联映射

cache 行号 i=主存块号 jmod(cache 行数)cache \text{ 行号 }i=\text{主存块号 }j \mod (cache\text{ 行数})

注意:上述的 cachecache 容量是在不考虑脏数据位的情况下)

CPUCPU 要读取主存中的某个信息,通过该信息的主存地址的区内数据块号(cachecache 行号)直接索引到对应的 cachecache

  • cachecache 行中保存的主存分区号与信息的主存地址中的主存分区号相同有效位为 11 时,数据命中。根据信息的主存地址中的数据块内偏移,从该 cachecache 行中的数据块副本中读取信息
  • cachecache 行中保存的主存分区号与信息的主存地址中的主存分区号不同有效位为 00 时,数据缺失。CPUCPU 根据该信息的主存地址,将主存中该信息所在的数据块载入相应 cachecache 行,相应地,还要将该 cachecache 行的有效位置 11,以及将该 cachecache 行的主存分区号设置为该信息的主存地址中的主存分区号,同时将信息送入 CPUCPU

硬件实现

假设主存地址长度为 99 位,cachecache 块大小为 4W4W88

直接映射特点

  1. 每个主存数据块映射到 cachecache 中的一个固定的行
    • cachecache 利用率低,命中率低,冲突高(未满也可能发生数据块替换)
  2. 成本低,适合于大容量 cachecache 使用
  3. 替换算法简单。访问不命中则直接替换相应 cachecache 行即可;但是,若该 cachecache 行存在脏数据,需要将脏数据写入二级存储器以保证数据一致性

习题

习题一

计算机字长为 3232 位,主存容量为 4MB4MB,按字节编址,cachecache 采用直接映射,cachecache 数据存储体容量为 4KB4KBcachecache 块长度为 88 个字

  1. 问主存字节地址的划分情况

    • cachecache 块(指的是数据块)的长度为 8×32b=32B=25B8\times 32b=32B=2^5B,所以块内偏移 w=5w=5

      • cachecache 数据块的大小和主存数据块的大小是一样的,所以如果题目中给的是主存数据块的大小,也是可以求出块内偏移的
    • cachecache 行数为 4KB/32B=274KB/32B=2^7,所以区行内地址 r=7r=7

    • 因为主存容量为 4MB=222B4MB=2^{22}B,所以地址线为 2222 位,即主存地址为 2222

      • 注意区分计算机字长和主存地址位数
    • 区地址位数为 2257=1022-5-7=10

  2. cachecache 的初始状态为空,若 CPUCPU 依次访问主存,从 009999 号字单元,并从中读出 100100 个字(假设访问主存一次读出一个字),并重复此顺序 1010 次,计算 cachecache 访问的命中率

cachecache128128 行,每行有 88 个字

​ 读出的 100100 个字会存储在 cachecache 的前 1008=13\lceil\frac{100}{8}\rceil=13 中,每一行的第一次读访问都不命中,其余的所有都命中

​ 命中率

h=100×1013100×10=98.7%h=\frac{100\times 10-13}{100\times 10}=98.7\%

习题二

习题三

注意:在写回策略中需要在 cachecache 中增加脏位

习题四

  1. 数据 cachecache 的总容量为 cache 行数 × 行大小{cache\text{ 行数 }\times \text{ 行大小}}

    对主存地址分析:

    • 主存地址 256MB=228B256MB=2^{28}B,所以内存地址位数为 2828
    • cachecache 行数为 88,所以 index=3index=3
    • cachecache 块大小为 64B=26B64B=2^{6}B,所以 w=6w=6
    • tag=2836=19tag=28-3-6=19

    那么 cachecache 的容量为 8×((1+19)+(64×8))/8B=532B8\times((1+19)+(64\times 8))/8B=532B

  2. a[0][31]a[0][31] 所处的主存地址为

    320+31×4=444320+31\times 4=444

    a[1][1]a[1][1] 所处的主存地址为

    320+(256×4)+1×4=1348320+(256\times 4)+1\times 4=1348

    cachecache 中对应的行号为 主存块号 modmod cachecache 行数

    a[0][31]a[0][31] 所处的 cachecache 行号为

    (444/64)mod8=6(444/64)\mod 8=6

    a[1][1]a[1][1] 所处的 cachecache 行号为

    (1348/64)mod8=5(1348/64)\mod 8=5

  3. 行优先存储

    因为 cachecache 块大小为 64B64B,所以每个 cachecache 数据块可以存储 1616intint 型数据

    顺序访问时,第一次访问数据缺失,后 1515 次访问命中

    所以命中率为 1516{\frac{15}{16}}

    列有限存储

    每次都不命中,命中率为 00

# 全相联映射

硬件实现

假设 cachecache 块大小为 4W4W,共 88 行,主存按字访问,主存地址长度为 99

习题一

习题二

# 组相联映射

  • 若整个 cachecache 划分为 11 个组,变成全相联映射
  • 若每个 cachecache 组只包含一个 cachecache 行,变成直接映射

硬件实现

# 不同映射方式比较

习题

# 替换算法

习题

假定某个程序访问 77 块信息, cachecache 分为 44 行,采用全相联方式组织。程序访问的块地址流依次为 1,2,3,2,1,3,1,4,4,5,6,7,5,6,7,51,2,3,2,1,3,1,4,4,5,6,7,5,6,7,5,分析 LFULFULRULRU 算法的访问过程,并计算命中率

# 写入策略

数据命中的情况

数据缺失的情况

# cache 的分类及应用

统一 cachecache

指令和数据都存放在同一个 cachecache

  • 优点:设计和实现简单
  • 缺点:对于指令预取技术,存取数据 与 取指令会发生冲突

分离 cachecache

cachecache 分成各自独立的数据 cachecache 与指令 cachecache

多级 cachecache

cachecache 集成到 CPUCPU

软件 cachecache

  • buffer cache
  • web cache

# 虚拟存储器

# 虚拟存储器的工作原理

虚拟存储器充分利用了程序局限性

加载程序时并不直接将程序和代码载入主存,而仅仅在相应的虚拟地址转换表中登记虚拟地址对应的磁盘地址

# 页式虚拟存储器

# 概述

主存和辅存之间按页交换信息

  • 虚拟地址中的页称为虚拟页
  • 主存空间中的页称为物理页

页式存储器采用 “请求分页” 的思想

  • 进程中活跃的页面从辅存调入主存,不活跃的页面留在辅存
  • 当访问的某个信息不在主存中发生缺页异常,从辅存将缺失页面调入主存

因为页式虚拟存储器的缺页处理代价远大于 cachecache 数据缺失的处理代价,因此页面的大小设置较大;主存和辅存之间采用全相联映射,以提高命中率

在写操作时,因为辅存访问速度远小于主存访问速度,所以采用写回法,而不是写穿法。

# 虚拟地址划分

虚拟地址被划分成虚拟页号 VPNVPN 和 虚拟页偏移 VPOVPO

物理地址被划分成物理页号 PPNPPN 和 物理页偏移 PPOPPO

VPOVPOPPOPPO 的位数决定了页面的大小,因为虚拟页和物理页大小相同,所以二者位数相同

# 页表

页表是保存虚拟页号 VPNVPN 和物理页号 PPNPPN 对应关系的查找表

页表常驻内存,属于进程控制信息

页表在主存中的首地址记录在页表基址寄存器 PTBRPTBR 中,进行进程切换时只需要简单地切换 PTBRPTBR 的值就可以实现页表的快速切换

关于虚拟存储器的常见概念

  • VAVA 虚拟地址
  • PAPA 物理地址
  • PTEPTE 页表项
  • PTEAPTEA 页表项地址

虚拟地址转换成物理地址的过程

如果访问对应页时触发缺页异常,由操作系统的缺页异常处理程序负责将磁盘上对应的页载入主存,并同时更新页表项。

习题

32 位虚拟地址空间的页表规模?页面大小为 4K;页表项大小为 4 字节

则:

一个进程地址空间有

232/4K=2202^{32}/4K=2^{20}

其页表需要占

(220×4)/4K=210(2^{20}\times 4)/4K=2^{10}

注意:页表项数量和虚拟页号对应

# 虚拟存储器访问流程

# 结合 cache 的虚拟存储器访问流程

在不发生缺页的情况下:

  • 最好的情况:页表在 cachecache 中命中,数据也在 cachecache 中命中
  • 最坏的情况:页表缺失,数据也缺失,需要访问主存两次才能访问数据

在发生缺页时:

  • 需访问极慢速的磁盘才能获取数据

# 利用 TLB 加速虚拟存储器地址转换

转换旁路缓冲区 TLBTLB,用来缓冲经常访问的页表项 PTEPTE

本质上是一个容量较小的 cachecache,为提高查找速度,大多采用全相联或组相联方式,且采用随机替换算法

全相联方式

组相联方式

在包含快表和慢表的页式虚拟存储系统中,在进行地址转换时,往往会同时查快表和慢表

  • 快表是按内容访问
  • 慢表是按地址访问

# CPU 访问过程