计算机存储结构(二)—— 存储空间访问顺序
简介:
由上一节存储器类型中层次结构图可知,目前计算机系统的存储体系的大致构成。越靠近下层制作成本越低,销售的容量越大。但是同样的,越靠近下层数据的访问速度也就越慢。为了兼顾效率和成本,目前的方案是使用上层的快速设备缓存下层慢速设备中的部分数据,在实际应用中被证明是可行的。因为短时间内cpu访问的数据一般是一段连续空间内的数据也就是局部性原理,这个特性使得我们使用告诉存储设备来加速存储访问变得可行。
一: 局部性
一个编写良好的程序通常会有良好的局部性(locality),也就是说他们倾向于引用其他最近引用过的数据项的数据项,或者最近引用过的数据项本身,这种倾向性被称为局部性原理(principle of locality)。
- 时间局部性(temporal locality): 被引用过一次的内存位置,很可能在不远的将来会被在再次引用。
- 空间局部性(spatial locality):如果一个内存被引用了一次,很可能附近的内存在不远的将来会被引用。
现代存储技术很多使用了局部性的原理,包括高速缓存的概念,内存的FPM优化,磁盘的数据预取等等。
1.1 对程序数据引用的局部性
一个简单的一维循环求和程序。程序按照内存顺序遍历向量V中每一个元素,因此其拥有良好的空间局部性。
顺序引用模式(sequential reference pattern): 顺序的访问一个向量的每个元素,且具有步长为1的引用模式。
如果一个向量中每隔k个元素进行访问,就称步长为k的引用模式,随着步长增加,空间局部性会下降。
1.2 取指令的局部性
因为程序指令是存放在内存中的,CPU必须取出这些指令,所以也可以评价程序取指令的局部性。如6-17中for循环体是按照连续的内存顺序执行的,所以有很好的空间局部性,因为循环被执行多次,所以也有很好的时间局部性。
二:CPU访问存储空间
整个存储体系结构中,CPU可访问的存储空间包括: cpu寄存器,高速缓存,主存,磁盘。寄存器访问比较简单不做展开,后面三个访问过程将会逐一展开分析。
三: 访问高速缓存
3.1 通用高速缓存存储器组织结构
假设计算机存储器地址有m位,形成M = 2m 个地址,这样一个机器的缓存被组织成S=2s 个高速缓存组的数组,每个高速缓存组有E个高速缓存行,每行有B=2 字节的数据块组成,一个有效位表明这个高速缓存行是否有效,还有t = m - (s + b)个标记位(是当前块的内存地址的一个子集),它们唯一的标志存储在这个高速缓存行中的块。
3.2 直接映射高速缓存
依据每个组的高速缓存行E,高速缓存被分成不同的类。每组只有一行(E=1)的高速缓存被称为直接映射高速缓存(direct--mapped cache)
假设我们有这样一个系统,它有一个CPU,一个寄存器文件,一个L1高速缓存和一个主存。当CPU执行一条读内存字w的指令,它向L1高速缓存请求这个字,如果L1高速缓存有w的一个缓存副本,那么就得到一个缓存命中,高速缓存很快就能抽取w并返回给CPU。如果缓存不命中当高速缓存想主存请求包含w的块的副本的时候CPU只能等待,当请求的块到达时L1高速缓存将这个块保存在它的一个高速缓存行里,从被存储的块中抽取处w并返回给CPU。
高速缓存确定一个请求是否命中然后抽取被请求的字的过程分为三步:1. 组选择 2.行匹配 3.字抽取
3.2.1 直接映高速缓存的组选择
这一步中,高速缓存从w的地址中间抽取处s个组索引位,然后这些位解释成一个标志组号的无符号数,确定对应的高速缓存的组。
3.2.2 直接映射高速缓存中的行匹配
第一步已经选择了一个组,接下来确定是否有w的一个副本存储在组i的一个告诉缓存行中。因为直接映射高速缓存一个组只有一行,所以比对高速缓存行的标记位和w的地址的标记位匹配且有效位置位则表示缓存命中。如果有效位未设置或者标记位不匹配则表示缓存未命中。
3.2.3 直接映射高速缓存的字选择
一旦命中,我们可以确定w就在这个高速缓存行的某个位置,最后一步确定字在高速缓存行中的位置。依据是地址提供的块偏移,将告诉缓存行存储的内容看作一个总大小为B的数组,这个偏移量就是数组的下标。这样我们就可以根据数组下表取出我们想得到的字。
3.2.3 直接映射高速缓存不命中时的行替换
如果缓存不命中,那么我们需要从存储器层次结构的下一层取出被请求的块,然后将新块存储在组索引位指示的组的一个高速缓存行中。
一般而言组中都是有效缓存行了,那么必须驱逐一个现有缓存行。
对直接映射高速缓存器而言这个策略非常简单,直接替换现有行即可,对于非直接映射的则需要考虑置换策略。
四:访问主存
数据流通过称为总线(bus)的共享电子电路在处理器和DRAM之间来来回回。每次CPU和主存之间的数据传送都是通过一系列的步骤来完成的。这些步骤称为总线事务(bus transaction)。
读事务(read transaction):从主存传送数据到CPU。
写事务(write transaction):从CPU传送数据到主存。
总线是一组并行的导线 能携带数据、地址、控制信号。取决于总线的设计,数据和地址能共享同一组导线,也可以使用不同的。同时,两个以上设备也能使用同一组总线。控制线携带的信号会同步事务,并标识处当前被执行的事务的类型,例如事务是到主存还是其他IO设备,是读还是写,是地址信息还是数据等。
图6-6实例了一个简单的系统配置,主要部件是CPU芯片、I/O桥接器(I/O bridge)芯片组(其中包括内存控制器)、以及形成主存的DRAM模块。这些模块由一对总线连接起来,其中一条是系统总线(system bus),它连接CPU和桥接器,另一条是内存总线(memory bus),它连接桥接器和主存
当CPU执行以下命令加载时的操作过程: mov A, %rax
1, 命令解释: A地址的数据加载到寄存器rax
2.CPU上称为总线接口(bus interface)的电路在总线上发起读事务。①CPU将地址A放到系统总线上,I/O桥将数据传送到内存总线上 ②主存感受到内存总线上的地址信号,从内存读总线地址,从DRAM取出数据字并将数据写到内存总线 ,I/O桥将内存总线信号翻译成系统总线信号,沿着系统总线传递。 ③ CPU感觉到系统总线上的数据,从总线读数据,并将数据复制到寄存器rax(此处省略了高速缓存的不命中过程)
五:访问I/O设备
例如显卡、鼠标、键盘和磁盘这样的输入输出(I/0)设备,都是通过I/O总线,例如Intel的外围设备互联(Peripheral Component Interconnected,PCI)总线连接到CPU和主存的。系统总线和内存总线是和CPU相关的,I/O总线则与底层CPU不同,这也保证了它可以适配多种机器类型。
- 通用串行总线(Universal Serial Bus,USB)控制器是一个连接到USB总线的设备的中转机构,USB总线支持多种设备,如键盘、鼠标、调制解调器、外部磁盘驱动器、固态硬盘等。USB3.0总线最大带宽为625MB/S, USB3.1总线最大带宽1250MB/S。
- 图形卡(或适配器)包含硬件和软件逻辑,它负责代表CPU在显示器上画像素。
- 主机总线适配器将一个或多个磁盘连接到I/O总线,使用的是一个特别的主机总线接口定义的通信协议。两个最常用的这种接口为SCSI和SATA。SCSI通常比SATA接口更快。SCSI主线适配器可以支持多个磁盘驱动器,SATA只能支持一个。
5.1 访问磁盘过程
CPU使用一种内存映射I/O(memory-mapped I/O)的技术向I/O设备发送命令。在内存映射I/O的系统中,地址空间中有一块地址是与I/O设备通信保留的(DMA区域/高端内存地址空间),每个这样的地址称为一个I/O端口。当一个设备连接到总线时,它会与一个或多个端口关联。
假设一个读0xa0的场景过程发送3个指令如下:
-
- CPU发送一个命令字告诉磁盘发起一个读,同时还发送了其他参数如数据传输完后是否返回一个中断。
- 指明应该读的逻辑块号
- 指明数据应该存储在主存上的地址