第 1 章 计算机组成与体系结构 1.2存储器系统

1.2 存储器系统程序员

 

存储器是用来存放程序和数据的部件,它是一个记忆装置,也是计算机可以实现“存储程序控制”的基础。在计算机系统中,规模较大的存储器每每分红若干级,称为存储器系统。传统的存储器系统通常分为高速缓冲存储器(Cache)、主存、辅存三级。主存可由 CPU直接访问,存取速度快,但容量较小,通常用来存放当前正在执行的程序和数据。辅存设置在主机外部,它的存储容量大,价格较低,但存取速度较慢,通常用来存放暂时不参与运行的程序和数据,CPU 不能够直接访问辅存,辅存中的程序和数据在须要时才传送到主存,所以它是主存的补充和后援。当 CPU 速度很高时,为了使访问存储器的速度能与 CPU 的速度相匹配,又在主存和 CPU 间增设了一级 Cache。Cache 的存取速度比主存更快,但容量更小,用来存放当前最急需处理的程序和数据,以便快速地向 CPU 提供指令和数据。所以,计算机采用多级存储器体系,确保可以得到尽量高的存取速率,同时保持较低的成本。多层级的存储体系之因此能用低投入换来较高的存取速率,得益于局部性原理。局部性原理是指程序在执行时呈现出局部性规律,即在一较短的时间内,程序的执行仅局限于某个部分。相应地,它所访问的存储空间也仅局限于某个区域。程序局部性包括时间局部性和空间局部性,时间局部性是指程序中的某条指令一旦执行,不久之后该指令可能再次执行。产生时间局部性的典型缘由是因为程序中存在着大量的循环操做;空间局部性是指一旦程序访问了某个存储单元,不久之后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址可能集中在必定的范围内,其典型状况是程序顺序执行。算法

存储器中数据经常使用的存取方式有顺序存取、直接存取、随机存取和相联存取四种。编程

 

(1) 顺序存取:存储器的数据以记录的形式进行组织。对数据的访问必须按特定的线性顺序进行。磁带存储器采用顺序存取的方式。缓存

(2) 直接存取:与顺序存取类似,直接存取也使用一个共享的读写装置对全部的数据进行访问。可是,每一个数据块都拥有惟一的地址标识,读写装置能够直接移动到目的数据块所在位置进行访问。存取时间也是可变的。磁盘存储器采用直接存取的方式。dom

(3) 随机存取:存储器的每个可寻址单元都具备本身惟一的地址和读写装置,系统能够在相同的时间内对任意一个存储单元的数据进行访问,而与先前的访问序列无关。主存储器采用随机存取的方式。性能

(4) 相联存取:相联存取也是一种随机存取的形式,可是选择某一单元进行读写是取决于其内容而不是其地址。与普通的随机存取方式同样,每一个单元都有本身的读写装置,读测试

写时间也是一个常数。使用相联存取方式,能够对全部的存储单元的特定位进行比较,选择符合条件的单元进行访问。为了提升地址映射的速度,Cache 采起相联存取的方式优化

 

1.2.1 主存储器spa

 

主存用来存放计算机运行期间所须要的程序和数据,CPU 可直接随机地进行读/写。主存具备必定容量,存取速度较高。因为 CPU 要频繁地访问主存,因此主存的性能在很大程度上影响了整个计算机系统的性能。根据工艺和技术不一样,主存可分为随机存取存储器和只读存储器操作系统

  1. 随机存取存储器

 

随机存取存储器(Random Access Memory,RAM)既能够写入也能够读出,但断电后信息没法保存,所以只能用于暂存数据。RAM 又可分为 DRAM(Dynamic RAM,动态 RAM SRAM(Static RAM,静态 RAM)两种,DRAM 的信息会随时间逐渐消失,所以须要定时对其进行刷新维持信息不丢失;SRAM 在不断电的状况下信息可以一直保持而不会丢失。DRAM  的密度大于 SRAM  且更加便宜,但 SRAM  速度快,电路简单(不须要刷新电路),然而容量小,价格高。

  1. 只读存储器

 

只读存储器(Read Only Memory,ROM)能够看做 RAM 的一种特殊形式,其特色是: 存储器的内容只能随机读出而不能写入。这类存储器经常使用来存放那些不须要改变的信息。因为信息一旦写入存储器就固定不变了,即便断电,写入的内容也不会丢失,因此又称为固定存储器ROM 通常用于存放系统程序 BIOS(Basic Input Output System,基本输入输出系统)。

  1. 内存编址方法在计算机系统中,存储器中每一个单元的位数是相同且固定的,称为存储器编址单位

不一样的计算机,存储器编址的方式不一样,主要有字编址和字节编址。

 

内存通常以字节(8 位)为单位,或者以字为单位(字的长度可大可小,例如 16 位或 32 位等,在这类试题中,通常会给出字的大小)。

例如,内存地址从 AC000H C7FFFH,则共有 C7FFFFH-AC000H=1BFFFH 个地址单元

 

(转换为十进制后,为 112KB)。若是该内存地址按字(16bit)编址,则共有 112KB*16  位。假设该内存由 28 片存储器芯片构成,已知构成此内存的芯片每片有 16KB 个存储单元, 则该芯片每一个存储单元存储(112KB*16)/(28*16KB)=4 位。

  

1.2.2 辅助存储器 

  1. 磁带存储器磁带存储器是一种顺序存取的设备,其特色包括:存取时间较长,但存储容量大,便于携带,价格便宜。磁带应用的场景愈来愈少,目前主要用于资料的归档保存。
  2. 硬盘存储器在硬盘中,信息分布呈如下层次:记录面、圆柱面、磁道和扇区,如图1-2 所示。

 

一台硬盘驱动器中有多个磁盘片,每一个盘片有两个记录面,每一个记录面对应一个磁头, 因此记录面号就是磁头号,如图 1-2(a)所示。全部的磁头安装在一个公用的传动设备或支架上,磁头一致地沿盘面径向移动,单个磁头不能单独地移动。在记录面上,一条条磁道造成一组同心圆,最外圈的磁道为 0 号,往内则磁道号逐步增长,如图 1-2(b)所示。在一个盘组中,各记录面上相同编号(位置)的各磁道构成一个柱面,如图 1-2(c)所示。

若每一个磁盘片有 m 个磁道,则该硬盘共有 m 个柱面。引入柱面的概念是为了提升硬盘的存储速度。当主机要存入一个较大的文件时,若一条磁道存不完,就须要存放在几条磁道上。这时,应首先将一个文件尽量地存放在同一柱面中。若是仍存放不完,再存入相邻的柱面内。

一般将一条磁道划分为若干个段,每一个段称为一个扇区或扇段,每一个扇区存放一个定长信息块(例如,512  个字节),如图 1-2(b)所示。一条磁道划分多少扇区,每一个扇区可存放多少字节,通常由操做系统决定。磁道上的扇区编号从 1 开始,不像磁头或柱面编号从 0 开始。

 

在磁盘上进行信息的读写时,首先须要定位到目标磁道,这个过程称之为寻道,寻道所消耗的时间称为寻道时间,定位到目标磁道后,须要定位到目标扇区,此过程经过旋转盘片完成,平均旋转半圈可到目标位置。故磁盘访问时间为:

磁盘访问时间(存取时间) = 寻道时间+旋转延迟时间

 

1.2.3 Cache 存储器

 

Cache 的功能是提升 CPU 数据输入输出的速率,突破所谓的“冯•诺依曼瓶颈”,即 CPU 与存储系统间数据传送带宽限制。高速存储器能以极高的速率进行数据访问,但因其价格高昂,若是计算机的内存彻底由这种高速存储器组成,则会大大增长计算机的成本。一般在CPU 和内存之间设置小容量的 Cache。Cache 容量小但速度快,内存速度较低但容量大, 经过优化调度算法,系统的性能会大大改善,仿佛其存储系统容量与内存至关而访问速度近 Cache 。

Cache  一般采用相联存储器(ContentAddressable Memory,CAM)。CAM  是一种基于数据内容进行访问的存储设备。当对其写入数据时,CAM 可以自动选择一个未用的空单元进行存储;当要读出数据时,不是给出其存储单元的地址,而是直接给出该数据或者该数据的一部份内容,CAM 对全部存储单元中的数据同时进行比较,并标记符合条件的全部数据以供读取。因为比较是同时、并行进行的,因此,这种基于数据内容进行读写的机制,其速度比基于地址进行读写的方式要快不少。

 

1.Cache 基本原理

 使用 Cache 改善系统性能的依据是程序的局部性原理。根据程序的局部性原理,最近的、将来要用的指令和数据大多局限于正在用的指令和数据,或是存放在与这些指令和数据位置上邻近的单元中。这样,就能够把目前经常使用或将要用到的信息预先放在 Cache 中。当CPU 须要读取数据时,首先在 Cache 中查找是否有所需内容,若是有,则直接从 Cache 中读取;若没有,再从内存中读取该数据,而后同时送往 CPU Cache。若是 CPU 须要访问的内容大多都能在 Cache  中找到(称为访问命中),则能够大大提升系统性能。

若是以 h  表明对 Cache  的访问命中率(“1-h”称为失效率,或者称为未命中率),t1  表 cache 的周期时间,t2 表示内存的周期时间,以读操做为例,使用“Cache+主存储器的系统的平均周期为 t3。则:

t3 =t1′h+t2′(1-h)

 

系统的平均存储周期与命中率有很密切的关系,命中率的提升即便很小也能致使性能上的较大改善。

例如,设某计算机主存的读/写时间为 l00ns,有一个指令和数据合一的 Cache,已知该Cache 的读/写时间为 10ns,取指令的命中率为 98%,取数的命中率为 95%。在执行某类程序时,约有 1/5 指令须要存/取一个操做数。假设指令流水线在任什么时候候都不阻塞,则设置 Cache 后,每条指令的平均访存时间约为:

(2%′100ns+98%′10ns)+1/5′(5%′100ns+95%′10ns)=14.7ns

 

2.映射机制

CPU 发出访存请求后,存储器地址先被送到 Cache 控制器以肯定所需数据是否已 Cache 中,若命中则直接对 Cache 进行访问。这个过程称为 Cache 的地址映射(映像)。 Cache 的地址映射中,主存和 Cache 将均分红容量相同的块(页)。常见的映射方法有直接映射、全相联映射和组相联映射。

 

 

(1)直接映像

 

直接映像方式以随机存取存储器做为 Cache 存储器,硬件电路较简单。在进行映像时, 主存地址被分红三个部分,从高到低依次为:区号、页号以及页内地址,如图 1-3 所示。

 

在本例中,内存容量为 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 的存储空间得不到充分利用。

 

 

(2)全相联映像

 

全相联映像使用相联存储器组成的 Cache 存储器。在全相联映像方式中,主存的每一页能够映像到 Cache 的任一页。若是淘汰 Cache 中某一页的内容,则可调入任一主存页的内容,于是较直接映像方式灵活。

在全相联映像方式中,主存地址分为两个部分,分别为地址部分(主存页标记)和数据部分(页内地址)。数据部分用于存放数据,而地址部分则存放该数据的存储器地址。如图 1-5 所示。

  

 

 

全相联映像方式的 Cache 组织如图 1-6 所示。

  

当进行映像时,在咱们给定的例子中,当程序访存时,则高 11 位给出主存页号,低19 位给出页内地址。由于每一个 Cache 页可映像到 2048 个主存页中的任一页,因此每页的Cache 标记也须要 11 位,以代表它如今所映像的主存页号。所以,Cache 标记信息位数增长,比较逻辑成本随之增长。

在全相联映像方式中,主存地址不能直接提取 Cache 页号,而是须要将主存页标记与Cache 各页的标记逐个比较,直到找到标记符合的页(访问 Cache 命中),或者所有比较完后仍无符合的标记(访问 Cache 失败)。所以这种映像方式速度很慢,失掉了高速缓存的做用,这是全相联映像方式的最大缺点。若是让主存页标记与各 Cache 标记同时比较,则成本又过高。全相联映像方式因比较器电路难于设计和实现,只适用于小容量 Cache。

(3)组相联映像

 组相联映像(页组映像)介于直接映像和全相联映像之间,是这两种映像的一种折衷方案。全相联映像方式以页为单位,可自由映像,没有固定的对应关系。直接映像方式中,主存分组,主存组内的各页与 Cache 的页之间采起的是固定的映像关系,但各组都可映像到Cache 中。在组相联映像方式中,主存与 Cache 都分组,主存中一个组内的页数与 Cache 的分组数相同,如图 1-7 所示。

 

在图 1-7 给出的例子中,主存分 128 个区,每一个区 8 个组,每一个组 2 个页。组相联映像

 

方式的主存地址组织如图 1-8 所示。

 

组相联映像的规则是:主存中的组与 Cache 的组造成直接映像关系,而每一个组内的页是全相联映像关系。如主存 1 0 页,他在 0 组中,因此只能进入 Cache 0 组中,至于

进入到 Cache 0 0 页,仍是 0 1 页,并没有强制要求,可任意放置。

 

在组相联映像中,Cache 中每一页的标记位长度为 8 位,由于此时除了要记录区号,还得记录组号,即区号 7 位加组号 1 位等于 8 位。

容易看出,若是 Cache 中每组只有一页,则组相联映像方式就变成了直接映像方式。若是 Cache 中每组页数为 16 页(即 Cache 只分一组),则就是全相联映像。所以,在具体设计组相联映像时,能够根据设计目标选取某一折衷值。

在组相联映像中,因为 Cache 中每组有若干可供选择的页,于是它在映像定位方面较直接映像方式灵活;每组页数有限,所以付出的代价不是很大,能够根据设计目标选择组内页数。

希赛教育专家提示:为保障性能,内存与 Cache 之间的映射每每采用硬件完成,因此Cache 对于程序员而言是透明的,程序员编程时,彻底不用考虑 Cache。

 

3.替换算法

Cache 产生了一次访问未命中以后,相应的数据应同时读入 CPU Cache。可是当Cache 已存满数据后,新数据必须替换(淘汰)Cache 中的某些旧数据。最经常使用的替换算法有如下三种:

(1) 随机算法。这是最简单的替换算法。随机法彻底无论 Cache  块过去、如今及未来的使用状况,简单地根据一个随机数,选择一块替换掉。

(2) 先进先出(First In and First Out,FIFO)算法。按调入 Cache 的前后决定淘汰的顺序,即在须要更新时,将最早进入 Cache 的块做为被替换的块。这种方法要求为每块作一记录,记下它们进入 Cache 的前后次序。这种方法容易实现,并且系统开销小。其缺点是可能会把一些须要常用的程序块(如循环程序)替换掉。

(3) 近期最少使用(Least Recently Used,LRU)算法。LR算法是把 CPU 近期最少使用的块做为被替换的块。这种替换方法须要随时记录 Cache 中各块的使用状况,以便肯定哪一个块是近期最少使用的块。LRU 算法相对合理,但实现起来比较复杂,系统开销较大。一般须要对每一块设置一个称为“年龄计数器”的硬件或软件计数器,用以记录其被使用的状况。

 

4.写操做 

由于须要保证缓存在 Cache  中的数据与内存中的内容一致,相对读操做而言,Cache  的写操做比较复杂,经常使用的有如下几种方法。

(1) 写直达(write through)。当要写 Cache  时,数据同时写回内存,有时也称为写通。当某一块须要替换时,也没必要把这一块写回到主存中去,新调入的块能够当即把这一块覆盖掉。这种方法实现简单,并且能随时保持主存数据的正确性,但可能增长屡次没必要要的主存写入,会下降存取速度。

(2) 写回(write back)。CPU  修改 Cache  的某一块后,相应的数据并不当即写入内存单元,而是当该块从 cache 中被淘汰时,才把数据写回到内存中。在采用这种更新策略的cache  块表中,通常有一个标志位,当一块中的任何一个单元被修改时,标志位被置“1”。在须要替换掉这一块时,若是标志位为“1”,则必须先把这一块写回到主存中去以后,才能再调入新的块;若是标志位为“0”,则这一块没必要写回主存,只要用新调入的块覆盖掉这一块便可。这种方法的优势是操做速度快,缺点是因主存中的字块未随时修改而有可能出错。

(3) 标记法。 Cache 中的每个数据设置一个有效位。当数据进入 Cache 后,有效位置“1”;而当 CPU  要对该数据进行修改时,数据只需写入内存并同时将该有效位置“0”。当要从 Cache 中读取数据时须要测试其有效位,若为“l”则直接从 Cache 中取数,不然, 从内存中取数。

相关文章
相关标签/搜索