文章目录
第7章 存储系统
7.6 并行主存系统
7.6.0 基本概念
并行主存系统
- 是在一个访存周期内能并行访问多个存储字的存储器,它能有效地提高存储器的带宽。
- 主存的性能主要用
延迟
和带宽
来衡量。
带宽
-
单体单字存储器
假设存储器的访问周期为 T M T_{M} TM,字长为 W W W 位,其带宽为:
B M = W T M B_{M} = \frac{W}{T_{M}} BM=TMW
提高内存的带宽的两种存储器结构
:
- 单体多字存储器
- 多体交叉存储器
7.6.1 单体多字存储器
单体多字存储器
- 对于一个单体m字的存储器,每个存储周期可以读出m个CPU字
最大带宽
假设存储器的访问周期为
T
M
T_{M}
TM,字长为
W
W
W 位,其最大带宽为:
B
M
=
m
×
W
T
M
B_{M} = m \times \frac{W}{T_{M}}
BM=m×TMW
优点:
- 实现简单
缺点:
- 访存效率不高
访存效率不高的原因:
- 如果一次能读取的指令字中有分支指令,而且分支成功,那么该分支指令之后的指令就是无用的。
- 一次取出的m个数据不一定都是有用的。另一方面,当前执行指令所需要的多个操作数也不一定正好都存放在同一个长存储字中。由于数据存放的随机性比程序指令存放的随机性大,所以发生这种情况的概率较大。
- 必须凑齐了m个数之后才能一起写入存储器。如果只写个别字,就必须先把相应的长存储字读出来,放到数据寄存器中,然后在地址码的控制下修改其中的一个字,最后再把长存储字写回存储器。
- 当要读出的数据字和要写入的数据字处于同一个长存储字内时,读和写的操作就无法在同一个存储周期内完成。
7.6.2 多体交叉存储器
多体交叉存储器
- 多体交叉存储器由多个单字存储体构成
- 每个体都有自己的地址寄存存器以及地址译码和读/写驱动等电路。
编址问题
假设共有 m m m个体,每一个体有 n n n个存储单元。这 n × m n \times m n×m 个单元可以看成一个由存储单元构成的二维矩阵。但是,对于计算机使用者来说,存储器是按顺序线性编址的。如何在二维矩阵和线性地址之间建立对应关系?就是如何对多体存储器进行编址的问题。
两种编址方法
- 高位交叉编址
- 低位交叉编址
- 其中只有低位交叉编址存储器才能有效地解决访问冲突问题。
7.6.2.1 高位交叉编址
- 这种方式相当于对存储单元矩阵按
列优先
的方式进行编址。 - 即先给第0列的各单元按从上到下的顺序依次赋予地址,然后再给第1列的各单元按顺序依次赋予
地址,…,最后给最后一列的各单元按顺序依次赋予地址。 - 同一个体中的高$ \log_2 m$ 位都是相同的,这就是体号。
单元的线性地址与行列(体内地址/体号)地址的关系
- 考虑处于第 i i i 行(体内地址),第 j j j 列(体号)的单元的线性地址 A A A,存在如下关系:
A = j × n + i A = j \times n + i A=j×n+i
其中: j = 0 , 1 , 2 , ⋯ , m − 1 ; i = 0 , 1 , 2 , ⋯ , n − 1 j = 0,1,2, \cdots , m-1; i = 0,1,2, \cdots, n-1 j=0,1,2,⋯,m−1;i=0,1,2,⋯,n−1
- 同理,已知某一单元的线性地址 A A A,则其体内地址 i i i 和体号 j j j ,存在如下关系:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ i &= A\ mod\ n…
7.6.2.2 低位交叉编址
采用低位交叉访问方式能大幅度地提高主存储器的带宽,目前这种存储器已经在高性能的单处理机和多处理机中得到了广泛应用。
- 这种方式相当于对存储单元矩阵按
行优先
的方式进行编址。 - 即先给第0行的各单元按从左到右的顺序依次赋予地址,然后再给第1行的各单元按顺序依次赋予
地址,…,最后给最后一行的各单元按顺序依次赋予地址。 - 同一个体中的低 $ \log_2 m$ 位都是相同的,这就是体号。
单元的线性地址与行列(体内地址/体号)地址的关系
- 考虑处于第 i i i 行(体内地址),第 j j j 列(体号)的单元的线性地址 A A A,存在如下关系:
A = i × m + j A = i \times m + j A=i×m+j
其中: j = 0 , 1 , 2 , ⋯ , m − 1 ; i = 0 , 1 , 2 , ⋯ , n − 1 j = 0,1,2, \cdots , m-1; i = 0,1,2, \cdots, n-1 j=0,1,2,⋯,m−1;i=0,1,2,⋯,n−1
- 同理,已知某一单元的线性地址 A A A,则其体内地址 i i i 和体号 j j j ,存在如下关系:
i = ⌊ A m ⌋ j = A m o d m \begin{aligned} i &= \lfloor \frac{A}{m} \rfloor \\ j &= A\ mod\ m \end{aligned} ij=⌊mA⌋=A mod m
说明:
-
虽然在理想情况下,这种存储器的带宽最高能提高到原来的m倍。增加m的值就能够提高主存储器的带宽。
-
但是,由于存在访问冲突,实际加速比小于m。
并行多体存储与转移概率:
- 因为程序的转移概率不会很低,数据分布的离散性较大
- 所以单纯靠增大m提高并行主存系统的带宽是有限的,而性能价格比还会随m的增大而下降。
7.6.3 避免存储器冲突
首先介绍冲突的概念
体冲突:
- 指两个访问请求要访问同一个存储体
- 在传统的多体交叉结构中,顺序访问被处理得很好,不会发生体冲突。地址相差奇数值的访存也是如此
- 当地址相差偶数值时,冲突频度增加了
解决方法一
- 增加更多的体来减少体冲突的次数。
- 在较大规模的机器中才采用,例如,NEC SX/3最多可使用128个体。
- 存在问题:这是因为对存储器中数据的访问不是随机的,无论有多少个体,多个访问都有可能去访问同一个体。
解决方法二(软件方法)
- 编译器可以通过循环交换优化来避免对同一个体的访问。
解决方法三(硬件解决方案)
-
传统存储系统(低位交叉)的体数 m m m和每个体的容量 n n n都取为 2 2 2的幂,体内地址 i i i 和体号 j j j 存在以下关系
KaTeX parse error: No such environment: align at position 10: \begin{̲a̲l̲i̲g̲n̲}̲ i &= \lfloor… -
使体数为素数。采用素数看起来似乎会需要更多的硬件来完成复杂的计箅,如取模和除法运算。这些复杂的计算会延长每次访存的时间。
-
有几种方法能快速地进行上述计算,尤其是当存储体数为素数、且为 2 2 2幂减 1 1 1时,可以用下面的计算来代替除法运算:
体内地址 i = A m o d n \text{体内地址}\ i = A\ mod\ n 体内地址 i=A mod n- 由于一个存储体中包含的字数
n
n
n一般是
2
2
2的幂,所以可以用
位选择方法
实现上述计算
- 由于一个存储体中包含的字数
n
n
n一般是
2
2
2的幂,所以可以用
7.7 虚拟存储器
虚拟存储器是“主存辅存”层次进一步发展的结果。它由价格较贵、速度较快、容量较小的主存储器和一个价格低廉、速度较慢、容量很大的辅助存储器(通常是硬盘)组成,在系统软件和辅助硬件的管理下,就像一个单一的、可直接访问的大容量主存储器。
程序员可以用机器指令的地址码对整个程序统一编址,就如同应用程序具有对应于这个地址码宽度的存储空间(称为程序空间)一样,而不必考虑实际主存空间的大小。
目前几乎所有的计算机都采用了虚拟存储系统。
7.7.1 基本概念
虚拟存储器可以分为两类
-
页式
页式虚拟存储器把空间划分为大小相同的块,即页面。
页面是对空间的机械划分.
-
段式
段式虚拟存储器把空间划分为可变长的块。
段则往往是按程序的
逻辑意义
进行划分的(例如,堆、栈等)。
现代计算机几乎不采用纯段式。许多计算机采用段式和页式的组合,段页式
。
- 每段被划分为若干个页
- 保持了段作为逻辑单位的优点
- 简化了替换的实现
- 而且段不必作为整体全部一次调入主存,可以以页面为单位部分调入。
7.7.2 快速地址转换技术
背景:
页表一般很大,是存放在主存中的。每次访存都需要两次对主存储器的访问:
第一次访问页表,获取所要访问数据的物理地址
第二次才是访问数据本身
这使得存储器速度下降严重,一般采用
TLB
来解决这个问题。
TLB(TranslationLook-aside Buffer)
- TLB是一个专用的
高速缓冲器
,用于存放近期经常使用的页表项(Page Table Entry,PTE页表条目)。 - 根据程序的
局部性原理
,它所用的页表条目也是聚集的。 - 这样,大多数访存都可以通过TLB快速地完成虚→实地址转换,只有偶尔在TLB不命中时,才需要去访问主存中的页表。
TLB中的项由两部分构成:
-
标识
标识中存放的是虚地址的一部分
-
数据
数据部分中存放的则是物理页帧号、有效位、存储保护信息、使用位,修改位等
⚠️注意事项
- 为了使TLB中的内容与页表保持一致,当修改页表的某—项时,操作系统必须保证TLB中没有该页表项的副本。
- 这可以通过
作废TLB中的页表项
来实现。