5.1.1 存储器概述存储器(Memory)是计算机系统中的记忆设备,用来存放程序和数据。计算机中的全部信息,包括输入的原始数据、计算机程序、中间运行结果和最终运行结果都保存在存储器中。它根据控制器指定的位置存入和取出信息。构成存储器的存储介质,目前主要采用半导体器件和磁性材料。存储器中最小的存储单位就是一个双稳态半导体电路或一个 CMOS 晶体管或磁性材料的存储元,它可存储一个二进制位。由若干个存储元组成一个存储单元,然后再由许多存储单元组成一个存储器。一个存储器包含许多存储单元,每个存储单元可存放多个二进制位。8 个二进制位称为一个字节。每个存储单元的位置都有一个编号,即地址,一般用二进制表示。一个存储器中所有存储单元可存放数据的总和称为它的存储容量。
、存储器分类随着计算机系统结构和存储技术的发展,存储器的种类日益繁多,根据不同的特征可对存储器进行分类。(一)按存储介质分类(1)半导体存储器采用半导体器件制造的存储器,主要有 MOS 型存储器和双极型(TTL 电路或 ECL 电路)存储器两大类。MOS 型存储器具有集成度高、功耗低、价格便宜、存取速度较慢等特点;双极型存储器具有存取速度快、集成度较低、功耗较大、成本较高等特点。(2)磁表面存储器在金属或塑料基体上,涂复一层磁性材料,用磁层存储信息,常见的有磁盘、磁带等。由于它的容量大、价格低、存取速度慢,故多用作辅助存储器。(二)按存取方式分类 1.随机存取存储器(Random Access Memory,RAM)所谓随机存取是指 CPU 可以对存储器中的内容随机地存取,CPU 对任何一个存储单元的写入和读出时间是一样的,即存取时间相同,与其所处的物理位置无关。2.顺序存取存储器顺序存取存储器的存取方式与 RAM 完全不同。顺序存取存储器的内容只能按某种顺序存取,存取时间的长短与信息在存储体上的物理位置有关,所以顺序存取存储器只能用平均存取时间作为衡量存取速度的指标。磁带机就是这样一类存储器。3.只读存储器(Read Only Memory,ROM)ROM 可以看作 RAM 的一种特殊形式,其特点是:存储器的内容只能随机读出而不能写入。这类存储器常用来存放那些不需要改变的信息。由于信息一旦写入存储器就固定不变了,即使断电,写入的内容也不会丢失,所以又称为固定存储器。ROM 除了存放某些系统程序(如 BIOS 程序)外,还用来存放专用的子程序,或用作函数发生器、字符发生器及微程序控制器中的控制存储器。4.直接存取存储器既不像 RAM 那样能随机地访问任一个存储单元,也不像顺序存取存储器那样完全按顺序存取,而是介于两者之间。当要存取所需的信息时,第一步直接指向整个存储器中的某个小区域(如磁盘上的磁道);第二步在小区域内顺序检索或等待,直至找到目的地后再进行读/写操作。这种存储器的存取时间也是与信息所在的物理位置有关的,但比 SAM 的存取时间要短。磁盘机就属于这类存储器。(三)按存储器在计算机系统中的作用分类 1.高速缓冲存储器高速缓冲存储器(Cache)位于主存和 CPU 之间,用来存放正在执行的程序段和数据便 CPU 能高速地使用它们。高速缓冲存储器的存取速度可以与 CPU 的速度相匹配,但存储容量较小,价格较高。目前的高档微机通常将它们或它们的一部分制作在 CPU 芯片中。2.主存储器主存用来存放计算机运行期间所需要的程序和数据,CPU 可直接随机地进行读/写访问,主存具有一定容量,存取速度较高。由于 CPU 要频繁地访问主存,所以主存的性能在很大程度上影响了整个计算机系统的性能。3.辅助存储器辅助存储器又称外存储器或后援存储器,它用来存放当前暂不参与运行的程序和数据以及一些需要永久性保存的信息。辅存设在主机外部,容量极大且成本很低,但存取速度较低,而且 CPU 不能直接访问它。辅存中的信息必须通过专门的程序调入主存后,CPU 才能使用。(四)按信息的可保存性分类断电后,存储信息即消失的存储器,称易失性存储器,例如,半导体 RAM。断电后信息仍然保存的存储器,称非易失性存储器。例如,ROM、磁芯存储器、磁表面存储器和光存储器。如果某个存储单元所存储的信息被读出时,原存信息将被破坏,则称破坏性读出;如果读出时,被读单元原存信息不被破坏,则称非破坏性读出。具有破坏性读出的存储器,每当一次读出操作之后,必须紧接一个重写(再生)的操作,以便恢复被破坏的信息。从原理上讲,只要具有两种明显稳定的物理状态的器件和介质都能用来存储二进制信息,但真正能用来做存储器的器件和介质还需要满足各类存储器技术指标的要求。二、主存储器的性能指标(一)存储容量存储容量是指主存存储单元的总数。对于字节编址的计算机,以字节数来表示存储容量;对于字编址的计算机,以字数与其字长的乘积来表示存储容量。如某机的主存容量为 64K×l6,表示它有 64K 个存储单元,每个存储单元的字长为 16 位,若改用字节数表示,则可记为 128K 字节(128KB)。注:1024B=1KB=210B;1MB=210KB=220B;1GB= 210MB= 230B; 1TB=210GB= 240B。(二)存取速度主存的存取速度通常由存取时间、存取周期和主存带宽等参数来描述。1.存取时间存取时间又称访问时间或读写时间,指从启动一次存储器操作到完成该操作所经历的时间。例如:读出时间是指从 CPU 向主存发出有效地址和读命令开始,直到将被选单元的内容读出为止所用的时间;写入时间是指从 CPU 向主存发出有效地址和写命令开始,直到信息写入被选中单元为止所用的时间。显然存取时间越小,存取速度越快。2.存取周期存取周期又称读写周期、访内周期,指主存进行连续两次访问存储器操作之间所需要的最短时间。一般情况下,存取周期大于存取时间,这是因为对于任何一种存储器,在读写操作之后,总要有一段恢复内部状态的复原时间。对于破坏性读出的 RAM,存取周期往往比存取时间要大得多,这是因为存储器中的信息读出后需要马上进行重写(再生)。3.带宽,与存取周期密切相关的指标是带宽,它又称为数据传输率,表示每秒从主存进出信息的最大数量,单位为字每秒或字节每秒或位每秒。目前,主存提供信息的速度还跟不上 CPU 处理指令和数据的速度,因此,提高主存的带宽是改善计算机系统性能的一个关键因素。(三)可靠性可靠性指在规定的时间内,存储器无故障读写的概率。通常,用平均无故障时间(Mean Time Between Failures,MTBF)来衡量可靠性。MTBF 可以理解为两次故障之间的平均时间间隔,MTBF 越长,说明存储器的可靠性越高。(四)功耗功耗反映了存储器件耗电的多少,同时也反映了其发热的程度。通常希望功耗要小,这对存储器件的工作稳定性有好处。
5.1.2 随机存取存储器 RAM
一、半导体静态存储元1.静态 MOS 存储元存储机理:用触发器的两个稳定状态表示“1”和“0”。只要供电电源正常,保存的“1”或“0”就能长久保存,而不需要任何“刷新”操作,这就是静态 RAM 的含义。(1)静态 MOS 存储元组成 T1、T2 管:触发器存储元工作管。T3、T4 管:负载管,起负载电阻作用。T1、T2、T3、T4 组成一个能保存二进制数的触发器。T5、T6、T7、T8 管:控制管或开门管。
(2)工作原理“1”态:T1 截止,T2 导通,即 A 点为高电位,B 点为低电位。“0”态:T1 导通,T2 截止,即 B 点为高电位,A 点为低电位。一个双稳态触发器只能处于其中的一种稳定状态,它取决于最近一次的写入信息。A、写操作:写“1”:在 I/O 线上输入高电位,在 I/O 线上输入低电位,开启 T5、T6、T7、T8 四个晶体管,把高、低电位分别加在 A、B 点,使 T1 管截止,使 T2 管导通,将“1”信息写入存储元。写“0”:在 I/O 线上输入低电位,在 I/O 线上输入高电位,打开 T5、T6、T7、T8 四个开门管,把低、高电位分别加在 A、B 点,使 T1 管导通,使 T2 管截止,将“0”信息写入存储元。B、读操作:若某个存储元被选中,则该存储元的 T5、T6、T7、T8 管均导通,A、B 两点与位线 D 相连存储元的信息被送到 I/O 与 I/O 线上。I/O 与 I/O 线接着一个差动读出放大器 ,从其电流方向可以判知所存信息是“1”还是“0”。
2.静态 SRAM 芯片(1)SRAM 芯片的构成 SRAM 芯片由存储体、地址译码驱动电路、读写电路和控制电路等组成。存储体:在 MOS SRAM 芯片的存储体是由静态存储元按行、列排列的阵列结构组成。地址译码驱动:一个芯片的 4096 个存储单元需有 12 位的二进制地址码(212=4096),通过二维地址译码选择一个存储元。I/O电路:用以控制被选中的存储元读出或写入,并具有信号放大的功能。片选与读/写控制电路:被选中(片选信号有效)芯片在读/写信号的控制下,由片内的译码驱动电路确定被选的存储单元进行读/写操作。输出驱动电路:用三态输出缓冲器对被选中芯片的输出信号加以驱动。
(二)动态存储器的刷新由于 MOS 动态存储元是以电荷形式存储信息的,栅极电容会缓慢放电,为维持所存信息,需定时补充电荷,这就是刷新。动态 MOS 存储器采用“读出”方式进行刷新。读出过程是补充电荷(刷新)的过程,但访问的随机性不能保证定期按序的刷新。从上一次对整个存储器刷新结束到下一次对整个存储器全部刷新一遍为止,这一段时间间隔叫刷新周期。常用的刷新方式有三种,一种是集中式,另一种是分散式,第三种是异步式。(三)动态 DRAM 芯片 DRAM 存储器芯片的结构大体与 SRAM 存储器芯片相似,由存储体与外围电路构成。但它集成度要高,外围电路更复杂。
注意:随机 DRAM 存储器芯片的地址输入线只有该芯片所需地址线的一半,因此采用地址线分时复用技术来解决地址码不足的矛盾。即先把低位地址信号在行地址选通信号 RAS 有效时通过芯片的地址输入线送至行地址锁存器,而后把高位地址信号在列地址选通信号 CAS 有效时通过芯片的地址输入线送至列地址锁存器,从而实现了地址码的传送。刷新时,
为低电平且宽度不小于
,而
为高电平,另外,为正确接收行地址,行地址应在
有效前的
有效,并要保持一段时间
。刷新操作是按行(2116 每行 128 个存储元)进行,对于 2116 来说,共有 128 行,可由 7 位的二进制计数器顺序产生刷新的行地址。刷新周期和存储周期时间相同。
5.1.3 存储器容量的扩展
一、位扩展法芯片每个存储单元的位数小于存储器字长,需进行位扩展。位扩展是指只在位数方向扩展(加大字长),而芯片的字数和存储器的字数是一致的。位扩展的连接方式是将各存储芯片的地址线、片选线和读写线相应地并联起来,而将各芯片的数据线单独列出。图 5.1.3-1 所示为位扩展法组成 1MB RAM。
三、字位同时扩展法单片芯片的字长和位数均小于主存的要求,需字位都扩展。当构成一个容量较大的存储器时,往往需要在字数方向和位数方向上同时扩展,这将是前两种扩展的组合,实现起来也是很容易的。不同的扩展方法可以得到不同容量的存储器。在选择存储芯片时,一般应尽可能使用集成度高的存储芯片来满足总的存储容量的要求,这样可减少成本,还可减轻系统负载,缩小存储器模块的尺寸。例如:用 16K×4 位芯片组成 64KB 的 RAM。2 片组成 16KB,4×2=8 片组成 64KB。可见:所需芯片数量 SS=(M/L)×(N/K) 式中:M——主存存储单元数量;L——单片存储单元数量;N——主存存储单元字长(二进制位);K——单片存储单元字长。上例中,S=(64/16)×(8/4)=8(片)
四、主存的设计实例例题:CPU 的地址总线 16 根(A15-A0,A0 为低位),双向数据总线 8 根(D7-D0),控制总线中与主存有关的信号有
(允许访存,低电平有效),
(高电平为读命令,低电平为写命令)。主存地址空间分配如下:0000H-3FFFH 为系统程序区,由只读存储芯片组成;4000H-4FFFH 为系统程序工作区,由 SRAM 组成;6000H-9FFFH 为用户程序区,也由 SRAM 组成。按字节编址。现有如下存储器芯片:EPROM:8K×8 位(控制端仅有
)。SRAM:16K×1 位,2K×8 位,4K×8 位,8K×8 位。请从上述芯片中选择适当芯片设计该计算机主存储器,画出主存储器逻辑框图,注意画出选片逻辑(可选用门电路及 3:8 译码器 74LS138)与 CPU 的连接,说明选哪些存储器芯片及选多少片。
5.1.4 只读存储器 ROMROM 指的是“只读存储器”,即 Read-Only Memory。ROM 的最大优点是具有非易失性,即使电源断电,ROM 中存储的信息也不会丢失。 ROM 工作时只能读出,不能写入,把向 ROM 写人数据的过程称为对 ROM 进行编程,根据编程方法的不同,ROM 通常可以分为以下几类:
一、ROM 的类型(一)掩模式 ROM(Mask Read-Only Memory,MROM)它的内容是由半导体制造厂按用户提出的要求在芯片的生产过程中直接写入的,写入之后任何人都无法改变其内容。MROM 的优点是可靠性高,集成度高,形成批量之后价格便宜,缺点是用户对制造厂的依赖性过大,灵活性差
芯片的容量是 1024×8 位。采用一维地址译码方式。工作原理:对于 A9~A0 的任一地址码,有且只有一个字被选中,与该字线有管子连接的位,其输出为低电平 (0),否则为高电平(1)。优点:MROM 的优点是可靠性高,集成度高,形成批量之后价格便宜;缺点是用户对制造厂的依赖性过大,灵活性差。(二)一次可编程 ROM(PROM Programmable Red-Only Memory)PROM 允许用户利用专门的设备(编程器)写入自己的程序,但一旦写入后,其内容将无法改变。PROM 指的是“可编程只读存储器”。允许写入一次,所以也被称为“一次可编程只读存储器”(One Time Progarmming ROM,OTP-ROM)。PROM 产品出厂时,所有记忆单元均制成“0”(或制成“1”),用户根据需要可自行将其中某些记忆单元改为“1”(或改为“0”)。以实现对其“编程”的目的。双极型 PROM 有两种结构,一种是熔丝烧断型,另一种是 PN 结击穿型,由于它们的写入都是不可逆的,所以只能进行一次性写入。图 5.1.4-2 所示的是一位熔丝型 PROM 结构示意图。
1.存储原理 浮栅有(无)积存电子,则管子有(无)导电沟道,所在位为“0”(“1”)。2. 编程写入漏极 D 和源极 S 之间加高电压(25V,12V 等),PGM 编程输入端加 50ms 正脉冲,使高能电子击穿 SiO2 层而注入浮栅中,高压去除后,电子一直保存于浮栅中,实现写“0”。3. 擦抹用紫外光照射 EPROM 片的玻璃窗口,使浮栅中的电子获得高能越过势垒泄放掉,擦净后所有位均为“1“,使芯片中原存内容被擦除。由于是用紫外线灯进行擦除,所以只能对整个芯片擦除,而不能对芯片中个别需要改写的存储单元单独擦除。
(四)电可擦除 EEPROMEEPROM 指的是“电可擦除可编程只读存储器(Electrically Erasable Programmable Read-Only Memory)”。EEPROM 是采用电气方法来进行擦除的,在联机条件下既可以用字擦除方式擦除,也可以用数据块擦除方式擦除。以字擦除方式操作时,能够只擦除被选中的那个存储单元的内容;在数据块擦除方式操作时,可擦除数据块内所有单元的内容。
EPROM 虽然既可读,又可写,但它却不能取代 RAM。原因如下:EPROM 的编程次数(寿命)是有限的;写入时间过长,即使对于 EEPROM,擦除一个字节大约需要 10ms,写入一个字节大约需要比 SRAM 或 DRAM 的时间长 100~1000 倍。二、Flash 存储器Flash memory 指的是“闪存”,所谓“闪存”,它也是一种非易失性的内存,属于 EEPROM 的改进产品。闪速存储器是 20 世纪 80 年代中期出现的一种快擦写型存储器,它的主要特点是既可在不加电的情况下长期保存信息,又能在线进行快速擦除与重写,兼备了 EEPROM 和 RAM 的优点,又有很快的存取速度,而且易于擦除和重写,功耗小。NOR 和 NAND 是现在市场上两种主要的非易失闪存技术。Intel 于 1988 年首先开发出 NOR Flash 技术,彻底改变了原先由 EPROM 和 EEPROM 一统天下的局面。紧接着,1989 年,东芝公司发表了 NAND Flash 结构,强调降低每比特的成本,更高的性能,并且象磁盘一样可以通过接口轻松升级。NOR 和 NAND 两种闪存都是用三端器件作为存储单元,分别为源极、漏极和栅极,与场效应管的工作原理相同,主要是利用电场的效应来控制源极与漏极之间的通断,栅极的电流消耗极小,不同的是场效应管为单栅极结构,而 FLASH 为双栅极结构,在栅极与硅衬底之间增加了一个浮置栅极。向数据单元内写入数据的过程就是向电荷势阱注入电荷的过程,写入数据有两种技术,热电子注入(hot electron injection)和 F-N 隧道效应(Fowler Nordheim tunneling), NOR 型 FLASH通过热电子注入方式给浮栅充电,而NAND则通过 F-N 隧道效应给浮栅充电。在写入新数据之前,必须先将原来的数据擦除,将浮栅的电荷放掉,两种 FLASH 都是通过 F-N 隧道效应放电。这方面两种 FLASH 一样,向浮栅中注入电荷表示写入了“0”,没有注入电荷表示“1”,所以对 FLASH 清除数据是写“1”。对于浮栅中有电荷的单元来说,由于浮栅的感应作用,在源极和漏极之间将形成带正电的空间电荷区,这时无论控制极上有没有施加偏置电压,晶体管都将处于导通状态。而对于浮栅中没有电荷的晶体管来说只有当控制极上施加有适当的偏置电压,在硅基层上感应出电荷,源极和漏极才能导通,也就是说在没有给控制极施加偏置电压时,晶体管是截止的。如果晶体管的源极接地而漏极接位线,在无偏置电压的情况下,检测晶体管的导通状态就可以获得存储单元中的数据,如果位线上的电平为低,说明晶体管处于导通状态,读取的数据为 0,如果位线上为高电平,则说明晶体管处于截止状态,读取的数据为 1。由于控制栅极在读取数据的过程中施加的电压较小或根本不施加电压,不足以改变浮置栅极中原有的电荷量,所以读取操作不会改变 FLASH 中原有的数据。NOR 的特点是芯片内执行 (XIP, eXecute In Place),这样应用程序可以直接在 Flash 闪存内运行,不必再把代码读到系统 RAM 中。NOR 的传输效率很高,在 1~4MB 的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。 NAND 结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。NOR 的读速度比 NAND 稍快一些。NOR 和 NAND 两种闪存性能比较:1.速度在写数据和擦除数据时,NAND 由于支持整块擦写操作,所以速度比 NOR 要快得多,两者相差近千倍;读取时,NOR 型 FLASH 的操作则是以字或字节为单位进行的,直接读取,所以读取数据时,NOR 有明显优势。2.容量和成本 NOR 型 FLASH 的每个存储单元与位线相连,增加了芯片内位线的数量,不利于存储密度的提高。所以在面积和工艺相同的情况下,NAND 型 FLASH 的容量比 NOR 要大得多,生产成本更低,也更容易生产大容量的芯片。3.易用性 NAND FLASH 的 I/O 端口采用复用的数据线和地址线,必须先通过寄存器串行地进行数据存取,各个产品或厂商对信号的定义不同,增加了应用的难度;NOR FLASH 有专用的地址引脚来寻址,较容易与其它芯片进行连接,另外还支持本地执行,应用程序可以直接在 FLASH 内部运行,可以简化产品设计。4.可靠性 NAND FLASH 相邻单元之间较易发生位翻转而导致坏块出现,而且是随机分布的,所以在使用的时候要配合 EDC/ECC(错误探测/错误更正)和 BBM(坏块管理)等软件措施来保障数据的可靠性。坏块管理软件能够发现并更换一个读写失败的区块,将数据复制到一个有效的区块。5.耐久性 NAND 的擦写次数是 100 万次,而 NOR 只有 10 万次。目前“闪存”被广泛用在 PC 机的主板上,用来保存 BIOS 程序,便于进行程序的升级。其另外一大应用领域是用来作为硬盘的替代品,具有抗震、速度快、无噪声、耗电低的优点。
5.2 存储器层次结构概述从最早期的计算开始,程序员就希望快速存储器的容量可以无限大。我们通过简单的类比方式来介绍将要使用的关键原理和机制。假如一个学生正在完成一份关于计算机硬件重要历史性发展的论文,他可以从图书馆的书架上精心挑选一些经典计算机书籍,并将它们放在书桌上。这样,所需要的相关资料就可能在这些书中找到,并且在很长一段时间内,县需阅读摆在书桌上的书而无需返回到书架前。当然不排除会出现其间要从书架上增补部分所需资料到书桌上的情况。但与每次从书架取一本书到书桌,并不断地回到书架前还书而后取另一本书相比,在书桌前放一些书会更节省时间。同样,我们可以构建一个大容量的虚拟存储器,它能像小容量的存储器那样被快速访问。就像你不会一次以相同的概率查阅图书馆中的每一本书那样,一个程序也不会一次以相同的概率访问它全部的代码或数据。否则,让存储器访问速度既快且容量又大是不可能的,就好比把图书馆中所有的书放在书桌上,还要保持快速查找一样是不可能的。局部性原理不仅适用于在图书馆查找资料的工作方式,而且适用于程序执行的方式。局部性原理表明了在任何时间内,程序访问的只是地址空间相对较小的一部分内容。以下是两种不同类型的局部性:·时间局部性(时间上的局部性):如果某个数据项被访问,那么在不久的将来它可能再次被访问。就如刚拿了一本书到书桌上查阅,那么很快再次查阅它的可能性是很大的。·空间局部性(空间上的局部性):如果某个数据项被访问,与它地址相邻的数据项很快可能也将被访问。例如,当查找到一本关于早期经典计算机的书籍时,也许紧挨着它的另一本关于早期工业计算机的书籍同样有所需的材料。因为图书馆通常将主题相同的书放在同一个书架上以提高空间定位效率。正如查阅书桌上的资料体现了自然的局部性,程序的局部性起源于简单自然的程序结构。例如,大多数程序都包含了循环结构,因此这部分指令和数据将被重复地访问,呈现出了很高的时间局部性。由于指令通常是顺序执行的,因此程序也呈现了很高的空间局部性。对数据的访问同样显示了一种自然的空间局部性。如,对数组或者记录中的元素进行顺序访问都体现了高度的空间局部性。我们可以利用局部性原理将计算机存储器组织成为存储器层次结构。存储层次结构由不同速度和容量的多级存储器构成,存储器的容量和访问时间随着与处理器距离的增加丽增加。快速存储器每比特的成本要比慢速存储器高很多,因而通常它们的容量也比较小。目前,构建存储器层次结构主要有三种技术。主存储器由 DRAM 动态随机存取存储器实现,靠近处理器的那层(cache)则由 SRAM 静态随机存取存储器来实现。 DRAM 每比特成本要低于 SRAM,但是速度比 SRAM 慢。价格的差异源于 DRAM 每比特占用的存储器空间较少,因此等量的硅制造的 DRAM 的容量会比 SRAM 的要大。第三种技术是磁盘( disk)。它通常是存储层次结构中容量最大且速度最慢的一层。在很多嵌入式设备中,常用闪存 flash 来替代磁盘,由于价格和访问时间的不同,构建存储器的层次结构是有好处的。如图 5-1 所示,较快的存储器靠近处理器,而较慢的、便宜的存储器层次较低。其目的是以最低的价格向用户提供尽可能大的存储容量,同时存取速度与最快的存储器相当。数据同样被组织成层次化结构:靠近处理器那一层中的数据是那些较远层次中的子集,所有的数据则被存在最慢的底层。我们依然使用图书馆的例子来进行类比,书桌上的书籍是图书馆藏书的一个子集,进而也是学校中所有图书馆藏书的一个子集。而且,离处理器越远的层次访问时间也越长,就像我们在学校图书馆系统中可能遇到的情况一样。存储器层次结构可以由多层构成,但是数据每次只能在相邻的两个层次之间进行复制。因此我们将注意力重点集中在两个层次上。高层的存储器靠近处理器,比低层存储器容量小且访问速度更快,这是因为它采用了成本更高的技术来实现的。如图 5-2 中所示,我们将一个两级层次结构中存
图 5.2-1 存储器层次的基本结构存储系统采用层次结构后,用户对于存储器的认识就是:它的容量和层次结构和容量最大的那层存储器相同,而访问速度和最快的那层存储器相当。
圈 5.2-2 存储器层次结构中的每两个层次可以被认为一个是高层次,一个是低层次 在每一层中,存储信息的最小单元被称为块或者行。通常在层次之间复制时按整块进行传输。如果处理器需要的数据存放在高层存储器中的某个块中,则称为一次命中(这就好像正妤从书桌上的一本书中找到所需的信息一样)。如果在高层存储器中没有找到所需的数据,这次数据请求则称为一次缺失。随后访问低层存储器来寻找包含所需数据的那一块(如同从书桌旁走到书架前去寻找所需的书籍)o 命中率,或命中比率,是在高层存储器中找到数据的存储访问比例,通常被当成存储器层次结构性能的一个衡量标准。缺失率(1-命中率)则是数据在高层存储器中没有找到的存储访问比例。追求高性能是我们使用存储器层次结构的主要目的,因而命中和缺失的执行时间就显得尤为重要。命中时间是指访问存储器层次结构中的高层存储器所需要的时间,包括了判断当前访问是命中还是缺失所需的时间(浏览书桌上书籍所花费的时间)。缺失代价是将相应的块从低层存储器替换到高层存储器中,以及将该信息块传送给处理器的时间之和(从书架上取另一本书并将它放到桌上的时间),由于较高存储层次容量较小并且使用了快速的存储器部件,因此比起对存储层次中较低层的访问,命中时间要少得多,这也是缺失代价的主要组成部分。同样,查找书桌上书籍的时间比站起来到书架前查找一本新书所需的时间要少得多。
图 5.2-3 存储器的层次结构:离处理器越远,容量越大如果有合适的运行机制,这种结构带来的好处是,处理器的访存时间主要由层次 l 决定,而整个存储器的容量和层次 n-样大。一般来说,本地磁盘位于层次结构的最底层,但有些系统会使用磁带或局域网内的文件系统作为磁盘的低一层
5.3.1 Cache 的基本概念高速缓冲技术就是利用程序的局部性原理,把程序中正在使用的部分存放在一个高速的容量较小的 Cache 中,使 CPU 的访存操作大多数针对 Cache 进行,从而使程序的执行速度大大提高。它是为了解决 CPU 和主存之间速度不匹配而采用的一项重要技术。一、Cache 的基本原理Cache 介于 CPU 和主存之间,它的存取速度接近于 CPU 的速度,但是容量较小。Cache 和主存都被分成若干个大小相等的块,每块由若干字节组成。由于 Cache 的容量远小于主存的容量,所以 Cache 中的块数要远少于主存中的块数,它保存的信息只是主存中最急需执行的若干块的副本。CPU 与 Cache 之间的数据交换是以字为单位,而 Cache 与主存之间的数据交换是以块为单位。一个块由若干定长字组成的。当 CPU 读取主存中一个字时,便发出此字的内存地址到 Cache 和主存。此时 Cache 控制逻辑依据地址判断此字当前是否在 Cache 中:若命中,此字立即传送给 CPU;未命中,则用主存读周期把此字从主存读出送到 CPU,与此同时,把含有这个字的整个数据块从主存读出送到 Cache 中
5.3.2 地址映射及变换有两个问题需要解决:我们怎样知道一个数据项是否在 cache 中?此外,如果数据项在 cache 中,我们如何找到它?这两个问题的答案是相关的。在 Cache 中,地址映射是指把主存地址空间映射到 Cache 地址空间,也就是把存放在主存中的程序按照某种规则装入 Cache 中。地址变换信息按映射关系装入 Cache 后,CPU 访存时,由主存地址变换成 Cache 地址的过程。Cache 的容量很小,它保存的内容只是主存内容的一个子集,且 Cache 与主存的数据交换是以块为单位。地址映射的方法有 3 种:全相联映射、直接映射和组相联映射。把主存和 Cache 划分成相同大小的若干数据块——行: Cache 的一个数据块;块:主存的一个数据块。1.直接映射方式直接映射是指主存中的每一个块只能被放置到 Cache 中唯一的一个指定位置,若这个位置已有内容,则产生块冲突,原来的块将五条件地被替换出去。直接映射方式是最简单的地址映射方式,成本低,易实现,地址变换速度快,而且不涉及其他两种映射方式中的替换算法问题。但这种方式不够灵活,Cache 的块冲突概率最高、空间利用率最低。因此适合大容量 Cache 采用。Cache 的行号 i和主存的块号 j有如下函数关系:i=j mod m(m 为 Cache 中的总行数)直接映射方式的示意图,如图 5.3.2-1 所示。
用访存地址中的行号找到 Cache 该行,再用 S-r 位与此行的标记比较,若相符则命中,则用行内地址读取所需的字;若不符,则从主存中读取。2.全相联映射方式全相联映射就是让主存中任何一个块均可以映射装入到 Cache 中任何一个块的位置上,如图所示。全相联映射方式比较灵活,Cache 的块冲突概率最低、空间利用率最高,但是地址变换速度慢,而且成本高,实现起来比较困难。
在直接映射方式下,主存块 12 只能放置在 cache 中唯一的块中,该块为(12 mod 8)=40 在两路组相联 cache 中,有 4 个组,主存块 12 必须放在第(12 mod4)=0 组中;主存块可以放在诙组的任何位置。在会相联方式下,块地址为 12 的主存块可以放在 cache 中 8 个块的任意一块。介于直接映射和全相联之间的设计是组相联。在组相联 cache 中,每个块可被放置的位置数是固定的(至少两个)。每个块有 n 个位置可放的 cache 被称作 n 路组相联 cache。一个 n 路组相联 cache 由很多个组构成,每个组中有几块。同样可以把所有的块定位策略看成是组相联的一个特例。直接映射 cache 是一个简单的 1 路组相联 carche: cache 的每项有一个块,并且每组只有一个元素。有 m 项的全相联 cache 可以看成是一个简单的 m 路组相联 cache,它只有一个组,组里有 m 块,每一项可以放在该组的任何一块中。
5.3.3 替换算法及写操作策略一、替换策略在采用全相联映像和组相联映像方式从主存向 Cache 传送一个新块,而 Cache 中的空间已被占满时,就需要把原来存储的一块替换掉。常用的替换算法有下述几种。对直接映射的 Cache 来说,只要把此特定位置上的原主存块换出 Cache 即可。对全相联和组相联 Cache 来说,就要从允许存放新主存块的若干特定行中选取一行换出。1.随机算法最简单的替换算法是随机方法。随机法完全不管 Cache 块过去、现在及将来的使用情,简单地根据一个随机数,选择一块替换掉。在硬件上容易实现,且速度也比前两种策略快。缺点是降低了命中率和 Cache 工作效率。2.先进先出(FIFO)算法 FIFO 算法的思想是:按调入 Cache 的先后决定淘汰的顺序,即在需要更新时,将最先进入 Cache 的块作为被替换的块。这种方法要求为每块做一记录,记下它们进入 Cache 的先后次序。这种方法容易实现,而且系统开销小。其缺点是可能会把一些需要经常使用的程序块(如循环程序)也作为最早进入 Cache 的块替换掉 3.最不经常使用(LFU)算法LFU 算法将一段时间内被访问次数最少的那行数据换出。每行设置一个计数器。从 0 开始计数,每访问一次,被访行的计数器增 1。当需要替换时,将计数值最小的行换出,同时将这些行的计数器都清零。这种算法将计数周期限定在对这些特定行两次替换之间的间隔时间内,不能严格反映近期访问情况。4.近期最少使用(LRU)算法LRU 算法是把 CPU 近期最少使用的块作为被替换的块。这种替换方法需要随时记录 Cache 中各块的使用情况,以便确定哪个块是近期最少使用的块。LRU 算法相对合理。每行设置一个计数器,用以记录其被使用的情况。Cache 每命中一次,命中行计数器清零,其它各行计数器增 1。当需要替换时,将计数值最大的行换出。这种算法保护了刚拷贝到 Cache 中的新数据行,有较高的命中率。二、Cache 的写操作策略CPU 对 Cache 的写入更改了 Cache 的内容。为了解决 Cache 与主存中内容不一致问题,可选用写操作策略使 Cache 内容和主存内容保持一致。Cache 主要有两种更新策略:写直达法和写回法。1.写回法写回法是指 CPU 在执行写操作时,被写数据只写入Cache,不写入主存。仅当需要替换时,才把已经修改过的 Cache 块写回到主存。在采用这种更新策略的 Cache 块表中,一般有一个标志位,当一块中的任何一个单元被修改时,标志位被置“1”。在需要替换掉这一块时,如果标志位为“1”,则必须先把这一块写回到主存中去之后,才能再调入新的块;如果标志位为“o”,则这一块不必写回主存,只要用新调入的块覆盖掉这一块即可。这种方法操作速度快,但因主存中的字块未经随时修改而有可能出错。这种方法减少了访问主存的次数,但是存在不一致性的隐患。2.写直达法写直达法是指 CPU 在执行写操作时,必须把数据同时写入 Cache 和主存。当写 Cache 命中时,Cache 与主存同时发生写修改,因而较好地维护了 Cache 与主存的内容的一致性。当写 Cache 未命中时,直接向主存进行写入。Cache 中每行无需设置一个修改位以及相应的判断逻辑。这种方法实现简单,而且能随时保持主存数据的正确性,但可能增加多次不必要的主存写入,会降低存取速度。考虑在写直达机制下的 cacbe 缺失,最常使用的策略是分配 cache 中的一块,称为写分配(write allo-cate)。数据块从主存中取回,并且在该块中的恰当区域重写数据。另一种策略则是只更新主存中块的一部分,而不写入 cache 中。这种方法称为写不分配(no write Ltllocate)。使用写回策略的 cache 比使用写直达策略的 cache 实现有效存储要复杂得多。在写直达的 cache 中,可以将数据写入 cache 并且读标记,如果标记不匹配,就发生缺失。由于 cache 采用写直达策略,在 cache 中重写数据块并不会有危险,因为主存中存储了正确的值。在写回 cache 中,如果 cache 中的数据被重写过并且此时发生缺失,就必须把整块写回主存中。如果在不知道 cache 是否命中(在写直达的 cache 中可以知道)的情况下就简单地根据存储指令重写块,我们就破坏了块的内容,而块本身也没有在存储层的较低层进行备份。在写回 cache 中,由于无法重写块,存储操作需要两个周期(一个周期用来检查命中情况,下一个周期才真正执行写操作),或者需要一个写缓冲来保存数据。如果使用存储缓冲区,处理器在正常的 cache 访问周期内查找 cache 并把数据放人存储缓冲区中。如果 cache 命中,在下一个还没有用到的 cache 访问周期,新数据被从存储缓冲区写入到 cache 中。相比较而言,在写直达 cache 中,写操作总是可以在一个周期内完成。我们读标记位,并且写被选择块的部分区域。如果标记与被写块的地址相同,处理器通常可以继续执行,因为正确的块已经被更新过了。如果标记与被写块的地址不同,处理器产生写缺失并去取对应于该地址块的剩余部分。
5.3.4 Cache 的性能评估和改进一、Cache 的性能评估CPU 时间可以划分为 CPU 执行程序花费的时钟周期和 CPU 等待存储系统花费的时钟周期。通常来说,我们假定 cache 访问命中的开销是 CPU 正常执行周期的一部分。因此,CPU 时间=(CPU 执行时钟周期 + 存储器阻塞的时钟周期)×时钟周期我们假设存储器阻塞的时钟周期主要来自于 cache 缺失,在实际的处理器中,由读、写操作引起的阻塞可能十分复杂,并且对性能的准确预测通常需要对处理器和存储系统进行细致的模拟。存储器阻塞的时钟周期可以被定义为读操作与写操作引起阻塞的时钟周期数之和。存储器阻塞时钟周期 = 读操作引起阻塞的时钟周期 + 写操作引起阻塞的时钟周期读操作阻塞的时钟周期可以根据每个程序中读的次数、读操作发生缺失时的代价(缺失处理需要的时钟周期)以及读缺失率来定义。读操作阻塞的时钟周期数=(读的次数/程序数)×读缺失率×读缺失代价写操作的情况就要复杂一些。对于写直达机制,有两种惰况引起阻塞:一种是写缺失,它通常要求在继续执行写操作之前取回数据块;另一种是写缓冲区阻塞,当写操作发生时写缓冲已满则可能发生这种情况。因此,写操作阻塞的时钟周期为这两种情况阻塞的时钟周期之和。写操作阻塞的时钟周期教=[(写的次数/程序数)×写缺失率×写缺失代价] + 写缓冲区阻塞 由于写缓冲区阻塞不仅仅取决于频率,还取决于写操作的执行时机,因此这样的阻塞不能由一个简单公式来计算。如果假设写缓冲区阻塞可以被忽略,那么我们可以合并读写操作并共用一个缺失率和缺失代价:存储器阻塞时钟周期=(存储器访问次数/程序数)×缺失串×缺失代价也可以表示如下:存储器阻塞时钟周期=(指令数/程序数)×(缺失数/指令)×缺失代价这个等式是建立在命中时间不计入计算 cache 性能的假设之上。很明显,如果命中时间增加,那么从存储系统中存取一个字的总时间也会增加,继而导致处理器时钟周期的增加。显然,一个大容量的 cache 访问时间也较长,因为 cache 命中操作需要多个时钟周期完成。在某种程度上,大容量 cacbe 命中时间的增加反而会影响命中率的改进使其不起作用,导致处理器性能的下降。为了分别找到在命中和缺失情况下数据访问时间对性能影响的证据,设计人员有时会使用平均存储器访问时问(AMAT)作为检测 cache 设计的方法。平均存储器访问时间是综合考虑了命中、缺失以及不同访问的频率后得出的访存平均时间,它等于下面的公式:AMAT= 命中时间 + 缺失率 × 缺失代价二、Cache 的性能改进要提高性能的三个途径就是降低平均存储器访问时问(AMAT),就是降低命中时间、缺失率、缺失代价。通常命中时间、缺失率、缺失代价三个参数中,我们使用某种方法降低了其中一种,同时会影响其他两个指标。
5.4.1 虚拟存储器概念一、虚拟存储器的基本概念虚拟存储器只是一个容量非常大的存储器的逻辑模型,不是任何实际的物理存储器。虚拟存储器由主存储器和联机工作的辅助存储器(通常为磁盘存储器)共同组成,这两个存储器在硬件和系统软件的共同管理下工作,对于应用程序员,可以把它们看作是—个单一的存储器。它借助于磁盘等辅助存储器来扩大主存容量,使之为更大或更多的程序所使用。虚拟存储器它指的是主存-外存层次。以透明的方式给用户提供了一个比实际主存空间大得多的程序地址空间。虚拟存储器将主存或辅存的地址空间统一编址,形成一个庞大的存储空间。在这个大空间里,用户可以自由编程,完全不必考虑程序在主存是否装得下以及这些程序将来在主存中的实际存放位置。用户编程的地址称为虚地址或逻辑地址,实际的主存单元地址称为实地址或物理地址。显然,虚地址要比实地址大得多。在实际的物理存储层次上,所编程序和数据在操作系统管理下,先送入磁盘,然后操作系统将当前运行所需要的部分调入主存,供 CPU 使用,其余暂不运行部分留在磁盘中。程序运行时,CPU 以虚地址来访问主存,由辅助硬件找出虚地址和实地址之间的对应关系,并判断这个虚地址指示的存储单元内容是否已装入主存。如果已在主存中,则通过地址变换,CPU 可直接访问主存的实际单元;如果不在主存中,则把包含这个字的一页或一个程序段调入主存后再由 CPU 访问。如果主存已满,则由替换算法从主存中将暂不运行的一块调回辅存,再从辅存调入新的一块到主存。从原理的角度看,虚拟存储器和 Cache-主存有不少相同之处。事实上,前面提到的各种方法是先应用于虚拟存储器中,后来才发展到 Cache-主存层次中去的。不过 Cache-主存的控制完全由硬件实现,所以对各类程序员是透明的,而虚拟存储器的控制是软硬相结合的,对于设计存储管理软件的系统程序员来说是不透明的,对于应用程序员来说是透明的。注意:物理地址由 CPU 地址引脚送出,用于访问主存的地址。虚拟地址由编译程序生成的,是程序的逻辑地址,其地址空间的大小受到辅助存储器容量的限制。主存-外存层次和 Cache-主存层次用的地址变换映射方法和替换策略是相同的,都基于程序局部性原理。它们遵循的原则是:① 把程序中最近常用的部分驻留在高速的存储器中。② 一旦这部分变得不常用了,把它们送回到低速的存储器中。③ 这种换入换出是由硬件或操作系统完成的,对用户是透明的。④ 力图使存储系统的性能接近高速存储器,价格接近低速存储器。两种存储层次的主要区别在于:在虚拟存储器中未命中的性能损失要远大于 Cache 系统中未命中的性能损失。二、主存-外存层次的基本信息传送单位主存-外存层次的基本信息传送单位可采用几种不同的方案:段、页或段页。(1)段是按照程序的逻辑结构划分成的多个相对独立部分,作为独立的逻辑单位。优点:是段的逻辑独立性使它易于编译、管理、修改和保护,也便于多道程序共享;某些类型的段具有动态可变长度,允许自由调度以便有效利用主存空间。缺点:是因为段的长度各不相同,起点和终点不定,给主存空间分配带来麻烦,而且容易在段间留下许多空余的零碎存储空间,造成浪费。(2)页是主存物理空间中划分出来的等长的固定区域。优点:是页面的起点和终点地址是固定的,方便造页表,新页调入主存也很容易掌握,比段式空间浪费小。缺点:是处理、保护和共享都不及段式来得方便。(3)段页:式管理采用分段和分页结合的方法。程序按模块分段,段内再分页,进入主存以页为基本信息传送单位,用段表和页表进行两级定位管理。
5.4.2 虚拟存储器的管理方式一、段式虚拟存储器在段式虚拟存储系统中,段是按照程序的逻辑结构划分的,各个段的长度因程序而异。虚拟地址由段号和段内地址组成,为了把程序虚地址变换成主存实地址,需要一个段表。段表中每一行记录了某个段对应的若干信息,包括段号、装入位、段起点和段长等。段表一般驻留在主存中。这里段号指虚拟段号。装入位为“1”,表示该段已调入主存;装入位为“0”,则表示该段不在主存中由于段的大小可变,所以在段表中要给出各段的起始地址与段的长度。段表实际上是程序的逻辑结构段与其在主存中所存放的位置之间的关系对照表。
CPU 根据虚地址访存时,首先将段号与段表的起始地址相加,形成访问段表对应行的地址,然后根据段表内装入位判断该段是否已调入主存。若已调入主存,从段表读出该段在主存中的起始地址,与段内地址(偏移量)相加,得到对应的主存实地址。由于段的分界与程序的自然分界相对应,所以具有逻辑独立性,易于程序的编译、管理、修改和保护,也便于多道程序共享。但是,因为段的长度参差不齐,起点和终点不定,给主存空间分配带来了麻烦,容易在段间留下不能利用的零头,造成浪费。二、页式虚拟存储器页式虚拟存储系统中,虚拟空间分成页,称为逻辑页,主存空间也分成同样大小的页,称为物理页。主存空间和虚存空间都划分成若干个大小相等的页。主存即实存的页称为实页,虚存的页称为虚页。虚存地址分为两个字段:高字段为逻辑页号,低字段为页内行地址。实存地址也分两个字段:高字段为物理页号,低字段为页内行地址。虚地址到实地址之间的变换是由页表来实现的。页表是一张存放在主存中的虚页号和实页号的对照表,记录着程序的虚页调入主存时被安排在主存中的位置。若计算机采用多道程序工作方式,则可为每个用户作业建立一个页表,硬件中设置一个页表基址寄存器,存放当前所运行程序的页表的起始地址。 页表中的每一行记录了与某个虚页对应的若干信息,包括虚页号、装入位和实页号等。页表基址寄存器和虚页号拼接成页表索引地址。根据这个索引地址可读到一个页表信息字,然后检测页表信息字中装入位的状态。若装入位为“1”,表示该页面已在主存中,将对应的实页号与虚地址中的页内地址相拼接就得到了完整的实地址;若装入位为“0”,表示该页面不在主存中,于是要启动 I/O 系统,把该页从辅存中调入主存后再供 CPU 使用。图 5.4.2-2 给出了页式虚拟存储器的虚-实地址的变换过程。
CPU 访存时首先要查页表,为此需要访问一次主存,若不命中,还要进行页面替换和页表修改,则访问主存的次数就更多了。页式虚拟存储器的每页长度是固定的,页表的建立很方便,新页的调入也容易实现。但是由于程序不可能正好是页面的整倍数,最后一页的零头将无法利用而造成浪费。同时,页不是逻辑上独立的实体,使程序的处理、保护和共享都比较麻烦。为了避免页表已保存或已调入主存储器时对主存访问次数的增多,把页表的最活跃部分存放在高速存储器中组成快表。快表与慢表实现内部地址变换的方式
三、段页式虚拟存储器段页式虚拟存储器是段式虚拟存储器和页式虚拟存储器的结合。将程序按其逻辑结构分段,每段再划分为若干大小相等的页;主存空间也划分为若干同样大小的页。虚存和实存之间以页为基本传送单位,每个程序对应一个段表,每段对应一个页表。程序对主存的调入调出是按页面进行的,但它又可以按段实现共享和保护,兼备页式和段式的优点。
CPU 访问时,虚地址包含段号、段内页号、页内地址 3 部分。首先将段表起始地址与段号合成,得到段表地址;然后从段表中取出该段的页表起始地址,与段内页号合成,得到页表地址;最后从页表中取出实页号,与页内地址拼接形成主存实地址。段页式存储器综合了前两种结构的优点,缺点是要经过两级,费时要多些。段页式虚拟存储器将存储空间按逻辑模块分成段,每段又分成若干个页,访存通过一个段表和若干个页表进行。段的长度必须是页长的整数倍,段的起点必须是某一页的起点。
四、虚拟存储器替换策略虚拟存储器中的页面替换策略和 Cache 中的行替换策略有很多相似之处,但有三点显著不同:(一)缺页至少要涉及前一次磁盘存取,读取所缺的页,缺页使系统蒙受的损失要比 Cache 未命中大得多。(二)页面替换是由操作系统软件实现的。(三)页面替换的选择余地很大,属于一个进程的页面都可替换。虚拟存储器中的替换策略一般采用 LRU 算法、LFU 算法 FIFO 算法,或将两种算法结合起来使用。要完全准确地执行 LRU 算法的代价太高了,因为每次存储器访问时都需要更新数据结构。作为替代,大多数操作系统通过追踪哪些页最近被使用,哪些页最近没有用到来近似地实现 LRU 算法。为了帮助操作系统估算最近最少使用的页,一些计算机提供了一个引用位或者称为使用位,当一页被访问时该位被置位。操作系统定期将引用位清零,然后再重新记录,这样就可以判定在这段特定时间内哪些页被访问过。有了这些使用信息,操作系统就可以从那些最近最少访问的页中选择一页(通过检查其引用位是否关闭)。如果硬件没有提供这一位,操作系统就要通过其他的方法来估计哪些页被访问过。对于将被替换出去的页面,假如该页调入主存后没有被修改,就不必进行处理,否则就把该页重新写入外存,以保证外存中数据的正确性。为此,在页表的每一行应设置一修改位。例题:假设主存只有 a,b,c 三个页框,组成 a 进 c 出的 FIFO 队列,进程访问页面的序列是 0,1,2,4,2,3,0,2,1,3,2 号。若采用①FIFO 算法,②FIFO 算法+LRU 算法,用列表法分别求两种替换策略情况下的命中率。
五、虚拟存储器写的过程访问高速缓存和访问主存储器的时间相差几十上百个时钟周期,如果我们用一个写缓冲区把写延迟对处理器进行隐藏,写通过机制也可以使用。在虚拟存储器系统中,对存储器层次结构中的下一层(磁盘)进行写操作需要数百万个处理器时钟周期;因此,建立一个写缓冲区以使系统对磁盘进行写通过是完全不可行的。取而代之的是,虚拟存储器系统必须采用写回,对主存中的页进行单个的写,当它被替换出内存时把它复制写回磁盘。这种到层次结构中较底层的复制写回是一种名叫复制写回(copy back)的写处理技术的另外一个名称的出处。写回方案在虚拟存储器中有另外一个主要的优点。因为磁盘的传输时间与它的访问时间相比要少得多,因此把整页复制写回要比把单个的字写回有效得多。写回操作尽管比传输单个字要有效得多,但仍开销较大。因此,当选择一页进行替换时,我们希望知道该页是否需要被复制写回。为追踪读进内存的一页是否被写过,可在页表中加入改写标志位(diny bit)。当页第一次被写时该位被置位。如果操作系统选择替换某页,改写标志位指明了在该页把占用的主存让给另一页之前是否需要写回磁盘。
5.4.3 加快地址变换:TLB由于页表存放在主存中,程序每次访问内存至少要两次:一次访问内存似获得物理地址,另一次访问获得数据。提高访问性能的关键在于页表访问的局部性。当一次虚拟页号的变换被用到时,它很可能在不久的将来再次被用到,因为该页中的字的访问有时间局部性和空间局部性。因此,现代的机器都包含一个特殊的高速缓存来追踪记录最近用过的地址变换。这种特殊的地址变换高速缓存称为快表 (TLB)。TLB 记录最近用过的地址变换的高速缓存,以避免对页表的访问。TLB 相当于我们记录在卡片目录中找到的一些书的位置的小纸片,我们记录许多书的位置并把小纸片当作高速缓存,这样就不用一直在整个目录中搜索了。如图 5.4.3-1 所示,TLB 中的每个标记项存放虚拟页号的一部分,每个 TLB 数据项存放一个物理页号。因为以后每次访问都访问 TLB 而不再访问页表,TLB 需要包括其他位,比如说访问位和页面重写标志位。
每次访问,我们都要在 TLB 中查找虚拟页号。如果命中,物理页号就用来形成地址,相应的引用位被置位。如果处理器执行的是写操作,重写位同样要被置位。如果 TLB 发生缺失,我们必须判断是发生缺页还是仅仅是一次 TLB 缺失。如果该页在主存中,那么 TLB 缺失只是一次转换缺失。在这种情况下,处理器可以通过将页表中的变换装载到 TLB 中并且重新访问来进行缺失处理。如果该页不在主存中,TLB 缺失就是一次真的缺页。在这种情况下,处理器调用操作系统的异常处理。由于 TLB 中的项比主存中的页数少得多,发生 TLB 缺失会比缺页要频繁得多。TLB 缺失既可以通过硬件处理,也可以通过软件处理。实际上,两种方法的性能差别很小,这是因为无论哪种方法,需要执行的基本操作都是一样的。在发生了 TLB 缺失,并且已经在页表中找到了缺失的变化时,我们就需要从 TLB 中选择一项进行替换。由于 TLB 表项中包含了引用位和重写位,当替换某一项时,需要把这些位复制回页表项中。这些位是 TLB 表项中唯一可以修改的部分。利用写回策略——只是在缺失的时候将这些表项写回而不是任何写操作都写回——是非常有效的,因为 TLB 缺失率有望较低。一些系统使用其他技术来近似引用位和重写位,以消除除了缺失后装入新表项之外写 TLB 的必要。另外,由于 TLB 的缺失比缺页要频繁得多,因此需要用较低的代价来处理缺失,而不能像缺页处理那样选择一个开销大的软件算法。所以很多系统都支持随机地选择替换表项。
5.4.4 虚拟存储器中的保护虚拟存储器最重要的功能就是允许多个进程共享一个主存,同时为这些进程和操作系统提供存储保护。保护机制必须确保,尽管多个进程在共享同一个主存,但是无论有意或是无意,一个恶意进程不能写另一个用户进程或者操作系统的地址空间。TLB 中的写访问位可以防止一个页被改写。如果没有这一级保护,计算机病毒将更加泛滥。为了使操作系统能保护虚拟存储系统,硬件至少提供下面总结的三种基本能力。●支持至少两种模式,并指出当前运行的进程是用户进程还是操作系统进程,操作系统进程也称为超级用户管理进程、核心进程或者主管进程。●提供一部分处理器的状态,这部分内容是用户进程可读而不可写的。这包括指示处理器是处于用户态还是管理态的用户/管理模式位、页表指针以及 TLB。操作系统用只能在管理态下可用的特殊指令对它们进行写操作。●提供能让处理器在用户态和管理态下相互切换的机制。通过使用这些机制并且把页表保存在操作系统的地址空间中,操作系统可以更改页表,并且阻止用户进程改变它们,确保用户进程只能访问由操作系统提供给它的存储部分。我们同样要防止一个进程读取另一个进程的数据。每个进程有它自己的虚拟地址空间。因此,如果操作系统管理页表的组织,使独立的虚拟页映射到不相交的物理页上,就能使得一个进程无法访问另一个进程的数据了。当然,这也要求一个用户进程不能改变页表的映射。如果操作系统能防止用户进程更改自己的页表,那么安全性也就有了保证。然而,这样一来,操作系统必须负责修改页表。将页表放在操作系统的保护地址空间就能满足所有要求。当进程希望以受限的方式共享信息时,操作系统必须协助它们,这是因为访问另一个进程的信息需要改变访问进程的页表。写访问位可以用来把共享限制为只读,并且,和页表中其他位一样,该位只能被操作系统修改。为了允许另一个进程,设为 P1,去读属于进程 P2 的一页,P2 就要请求操作系统在 P1 地址空间中为一个虚拟页生成页表项,指向 P2 想要共享的物理页。如果 P2 要求,操作系统可以使用写保护位以防止 P1 对数据进行改写。
对存储器的要求是容量大、速度快、成本低。为了解决了这三方面的矛盾,计算机采用多级存储体系结构,即主存、Cache 和虚拟存储器。Cache 是一种高速缓冲存储器,是为了解决 CPU 和主存之间速度不匹配而采用的一项重要的硬件技术,并且发展为多级 Cache 体系,指令 Cache 与数据 Cache 分设体系,要求 Cache 的命中率接近于 1。主存与 Cache 的地址映射有全相联、直接、组相联三种方式。其中组相联方式是前二者的折衷,适度兼顾了二者的优点又尽量避免其缺点,从灵活性、命中率、硬件投资来说较为理想,因而得到了普遍采用。为了扩大存储容量,可以采用虚拟存储器技术。虚拟存储器是建立在主存和辅存物理结构基础之上,由附加硬件装置以及操作系统存储管理软件组成的一种存储体系。虚拟存储器指的是主存-外存层次,它给用户提供了一个比实际主存空间大得多的虚拟地址空间。因此虚拟存储器只是一个容量非常大的存储器的逻辑模型,不是任何实际的物理存储器。按照主存-外存层次的信息传送单位不同,虚拟存储器有页式、段式、段页式三类。当多个用户共享主存时,系统应提供存储保护。通常采用的方法是存储区域保护和访问方式保护,并用硬件来实现。有些机器中提供特权指令来实现某种保护。