计算机组成与体系结构(三)
- 计算机系统组成
- 存储器系统
- 主存储器
- 辅助存储器
- Cache存储器
- Cache 基本原理
- 映射机制
- 直接映射
- 全相联映射
- 组相联映射
- 替换算法
- 写操作
- 流水线(计算)
- 流水线周期
- 流水线执行时间
- 流水线的吞吐率
- 流水线的加速比
计算机系统组成
存储器系统
主存储器
辅助存储器
Cache存储器
Cache 功能是提高CPU数据输入输出的速率,突破所谓的“冯·诺依曼瓶颈”,即CPU与存储系统间数据传送带宽限制。其容量小但速度快。
Cache 通常采用相联存储器(ContenAddressable Memory,CAM)。CAM是一种基于数据内容进行访问的存储设备。当对其进行写入数据时,CAM能够自动选择一个未用的空单元进行存储;当要读出数据时,不是给出其存储单元的地址,而是直接给出该数据或者该数据的一部分内容,CAM对所有存储单元中的数据同时进行比较,并标记符合条件的所有数据以供读取。由于比较是同时、并行进行的,所以这种基于数据内容进行读写的机制,其速度比基于地址进行读写的方式要快很多。
ps:也就是相联存取 方法。
Cache 基本原理
使用Cache 改善系统性能的依据是程序的局部性原理,即最近的、未来要用的指令和数据大多局限于正在用的指令和数据,或是存放在与这些指令和数据位置上邻近的单元中。这样就可以把目前常用或将要用到的信息预先放在Cache 中,当CPU需要读取数据时,先在Cache 中查找所需要的内容,如果有则直接读取;如果没有再从内存中读取该数据,然后同时送往CPU和Cache。如果CPU需要访问的内容大多都能在Cache 中找到(称为访问命中),则大大提高系统性能。
ps:这里要注意,如果没有从Cache 读到数据,从内存读到的数据会同时送往CPU 和Cache。
如果以h 代表对Cache的访问命中率(1-h 称为失效率,或称为 未命中率),t1 表示Cache 的周期时间,t2 表示内存的周期时间,以读操作为例,使用”Cache +主存储器“的系统的平均周期是t3 ,则
t3=t1 * h + t2 *(1-h)
映射机制
当CPU发出访存请求后,存储器地址先被送到Cache 控制器以确定所需数据是否已经在Cache 中,若命中则直接对Cache 进行访问,该过程被称为Cache 的地址映射(映像)。在Cache 地址映射中,主存和Cache 将均分成容量相同的块(页)。常见的映射方法有 直接映射 、全相联映射、组相联映射。
直接映射
直接映射方式以随机存取存储器作为Cache存储器,硬件电路较简单。在进行映射时,主存地址被分成了三部分,从高到低依次是:区号、页号、页内地址。
在本例中,假设内存容量为1GB,Cache容量为8MB,页面的大小为512KB。直接映射中,先分区,再分页。一个区的大小就是Cache的容量大小,所以一共分:1GB/8MB=128个区,所以区号是7位;每个区分:8MB/512KB=16个页,所以页号是4位.
在直接映射方式中,每个主存页只能复制到某一个固定的Cache 页中,如图1-4所示。直接映射方式的映射规律是:主存中每个区的第0页,只能进入Cache 的第0页,若当前时刻Cache中0号页被占据,而1-15号页空闲,现在需要将1区第0页(即内存的16页)调入Cache 是会发生冲突的。所以直接映射的块冲突率很高。
在Cache 中,为每一个页设立一个Cache 标记,用于识别当前Cache 块来自于哪个内存区。直接映射中,由于每个区的N号页都必须进入到Cache的N号页,所以只需要记录区号就可以,所以在本例中,对应标记的长度也是7位。
直接映射方式的优点是比较容易实现,缺点是不够灵活,有可能使Cache的存储空间得不到充分利用。
ps:要看清楚,到底是内存页还是Cache页,内存区还是Cache标记
全相联映射
全相联映射使用相联存储器组成的Cache 存储器,在全相联映射方式中,主存的每一页可以映射到Cache的任一页,如果淘汰Cache 中某一页的内容,则可以调入任一主存页的内容,因而较直接映射方式灵活。
在全相联映射方式中,主存地址分为:地址部分(主存页标记)和数据部分(页内地址)。数据部分用于存放数据,而地址部分则存放该数据的存储器地址。
每个Cache 页可以映射到主页存的任一页,所以每页Cache 标记只需要表明它现在所映射的主存页号即可。在全相联映射方式中,主存地址不能直接提取Cache页号,而是需要将主存页标记与Cache各页标记逐个比较,直到找到标记符合的页(访问Cache 命中),或者全部比较完后仍无符合的标记(访问Cache失败)。因此这种映射方式速度很慢,失去了高速缓存的作用,这是全相联映射方式最大缺点。而且Cache标记信息位数增加,比较逻辑成本随之增加。当然如果让主存页标记和各Cache标记同时比较,则成本又太高。全相联映射方式因比较器电路难于设计和实现,只适用于小容量Cache。
ps: 以上2种映射方式,全相联映射以页位单位,可以自由映射,没有固定的对应关系;直接映射方式,主存分组,主存组内的各页与Cache 的页之间采取的是固定的映射关系,但各组均可映射到Cache中。
组相联映射
组相联映射(页组映射)介于直接映射和全相联映射之间,是这2种映射的一种折衷方式。在该方式中,主存与Cache 都分组,主存中一个组内页数与Cache 的分组数相同,如图1-7所示。
根据之前的例子,主存依旧是128区,而每个区是8组,每个组是2页。组相联映射方式的主存地址组织如图1-8所示。基本规则是:主存中的组与Cache的组形成直接映射关系,而每个组内的页是全相联映射关系。如主存1区0页,由于在0组,所以只能进入Cache的0组中,至于进入Cache的0组0页还是0组1页,并无强制要求,可以任意放置。
容易看出,如果Cache 中每组只有1页,那组相联映射就变成了直接映射方式;如果Cache 中每组有16页(即Cache只分一组),那就变成了全相联映射方式。因此,在具体设计组相联映射时,可以根据设计目标选取具体分组页数。由于Cache中每组有若干可供选择的页,因而它在映射定位方面较直接映射方式更灵活;每组页数有限,因此较全相联映射付出的代价不是很大。
ps: 为保障性能,内存与Cache之间的映射往往采用硬件完成,编程时不用考虑。
替换算法
当Cache产生一次访问未命中,相应数据应同时写入CPU和Cache,但当Cache 已存满数据后,新数据必须替换某些旧数据,常用替换算法有以下三种:
- 随机算法:随机选择一块进行替换;
- 先进先出:将最先进入Cache的块作为被替换的块。该方法要求为每块做一个记录,记下它们进入Cache 的先后次序。优点是:容易实现,系统开销小;缺点:可能会将一些需要经常使用的程序块替换掉。
- 近期最少使用(Least Recently Used ,LRU)算法:把CPU近期最少使用的块作为被替换的块。该方法需要随时记录Cache中各块的使用情况,以便确定哪个块是近期最少使用的块。该方法相对合理,但实现较为复杂,系统开销大。通常需要对每一块设置一个称为“年龄计数器”的硬件或软件计数器,用以记录其使用情况。
写操作
为保证缓存在Cache中的数据与内存中的内容一致,常用方法如下:
- 写直达(write through):当要写Cache 时,数据同时写入主存,有时也被称为写通;当要被替换时,不需要将这块写回主存,新调入块直接替换Cache块就行。该方法实现简单,而且能随时保持主存数据正确性,但可能增加多次不必要主存写入,降低存取速度。
- 写回(write back):修改Cache 某块,相应数据不写入主存,而是当该块要被淘汰了再写回主存。在采用该更新策略的Cache块表中,一般有一个标志位,当一块中任一单元被修改时,标志位被置1,在需要替换掉这块时,如果标志位1则必须先把这块写回到主存后再调入新块;如果标志位0,则不必写回主存,直接替换这块就行。该方法操作速度快,但因主存中的字块未随时修改而有可能出错。
- 标记法:对Cache 中每个数据设置一个有效位。当数据进入Cache后,有效位置1,当CPU要对该数据进行修改时,数据只需写入内容并同时将该标志位置0;当要从Cache 读数据时,如果标志位1则从Cache 读,如果0则从内存读。
流水线(计算)
流水线技术把一个任务分解为若干顺序执行的子任务,不同的子任务由不同的执行机构负责执行,而这些机构可以同时并行工作。在任一时刻,任一任务只占用其中一个执行机构,这样就可以实现多个任务的重叠执行,以提高工作效率。
流水线周期
流水线应用过程中,会将需要处理的工作分为N阶段,最耗时那一段的时间为流水线周期。如使用流水线技术执行100条指令,每条指令取指2ms,分析4ms,执行1ms,则流水线周期为4ms。
流水线执行时间
1个任务的执行过程可分成N个阶段,假设每个阶段完成时间t,则完成改任务时间为Nt。若以传统方式,k个任务就是kNt;而使用流水线技术,则时Nt+(k-1)t。即:
- 流水线执行时间 = 第1条任务的执行时间 + (n-1)x 流水线周期。
ps:流水线执行时间,其实进一步可分为理论情况和实践情况两种不同的处理方式。在真正做流水线处理时,考虑到处理的复杂性,会将任务的每个执行阶段的时间都统一为流水线周期,即第1条任务的执行时间 = N x 流水线周期。
流水线的吞吐率
流水线的吞吐率(Though Put rate ,TP)是指单位时间内流水线所完成的任务数量或输出的结果数量。有些文献也称为平均吞吐率、实际吞吐率。
- 吞吐率 = 任务数k / 处理完成k个任务所用时间。
- 最大吞吐率 = 1/ 流水线周期
ps: 接用实际的流水线执行时间 ,吞吐率=k /[(N + k-1) *流水线周期],k 无穷就可以推出最大吞吐率。
流水线的加速比
完成同样一批任务,不使用流水线所用的时间与使用流水线所用的时间之比称为流水线的加速比。
- 最大的加速比 = 单个任务的阶段数N