计算机组成(第三章)
存储系统
存储器概述
- 存储器的两大功能:
- 存储(写入Write)
- 取出(读出Read)
- 三项基本要求:
- 大容量
- 高速度
- 低成本
- 概念
- 基本存储单元:存储一位(bit)二进制代码的存储元件称为基本存储单元(或存储元)
- 存储单元:主存中最小可编址的单位,是CPU对主存可访问操作的最小单位。
- 存储器:多个存储单元按一定规则组成一个整体
存储器的分类
-
按存储介质分
半导体存储器:用半导体器件组成的存储器
磁表面存储器:用磁性材料做成的存储器
-
按存储方式分
随机存储器:任何存储单元的内容都能被随机存取,且存取时间和存储单元的物理位置无关
顺序存储器:只能按某种顺序来存取,存取时间和存储单元的物理位置有关
-
按存储器的读写功能分:ROM,RAM
只读存储器(ROM):存储的内容是固定不变的,只能读出而不能写入的半导体存储器。
随机读写存储器(RAM):既能读出又能写入的半导体存储器。
-
按信息的可保存性分:非永久记忆,永久记忆
非永久记忆的存储器:断电后信息即消失的存储器。
永久记忆性存储器:断电后仍能保存信息的存储器
-
按在计算机系统中的作用分:
主存、辅存、高速缓存、控制存储器等
存储器的分级结构
- 寄存器
- 微处理器内部的存储单元
- 高速缓存(Cache)
- 完全用硬件实现主存储器的速度提高
- 主存储器
- 存放当前运行程序和数据,采用半导体存储器构成
- 辅助存储器
- 磁记录或光记录方式
- 磁盘或光盘形式存放可读可写或只读内容
- 以外设方式连接和访问
主存储器的技术指标
-
存储容量
- 主存存储容量:以字节B(Byte)为基本单位
- 半导体存储器芯片:以位b (Bit)为基本单位
- 存储容量以$2_{10}=1024$规律表达KB,MB,GB和TB
- 厂商常以$10_3=1000$规律表达KB,MB,GB和TB
-
存取时间(访问时间)
- 发出读/写命令到数据传输操作完成所经历的时间
-
存取周期
- 两次存储器访问所允许的最小时间间隔
- 存取周期大于等于存取时间
-
存储器带宽(数据传输速率)
- 单位时间里存储器所存取的信息量
-
按边界对齐的方式存储数据
-
int i, short k, double x, char c, short j
- int (4字节) short (2字节) double (8字节) char (1字节)
- short按16位对齐, int按32位对齐,double按64位对齐
-
对齐可提升访问数据的速度,不对齐可节约空间
随机读写存储器
- SRAM(静态RAM:Static RAM)
- 以触发器为基本存储单元
- 不需要额外的刷新电路
- 速度快,但集成度低,功耗和价格较高
- DRAM(动态RAM:Dynamic RAM)
- 以单个MOS管为基本存储单元
- 要不断进行刷新(Refresh)操作
- 集成度高、价格低、功耗小,但速度较SRAM慢
SRAM存储器
-
6个开关管组成一个存储元,存储一位信息
-
**N(=1/4/8/16/32)**个存储元组成一个存储单元
-
存储器芯片的大量存储单元构成存储体
-
存储器芯片结构
存储单元数×每个存储单元的数据位数=2M×N=芯片的存储容量
-
M=芯片地址线的个数
-
N=数据线的个数
SRAM的控制信号
- 片选(CS或CE)
- 片选有效,才可以对芯片进行读/写操作
- 无效时,数据引脚呈现高阻状态,并可降低功耗
- 读控制(OE*)
- 芯片被选中有效,数据输出到数据引脚
- 对应存储器读MEMR*
- 写控制(WE*)
- 芯片被选中的前提下,若有效,将数据写入
- 对应存储器写MEMW*
六管SRAM存储器 (SRAM Cell)
SRAM存储器的组成介绍
存储体:存储单元的集合,通常用X选择线(行线)和Y选择线(列线)的交叉来选择所需要的单元。
地址译码器:将用二进制代码表示的地址转换成输出端的高电位,用来驱动相应的读写电路,以便选择所要访问的存储单元。有两种方式:
-
单译码:一个地址译码器,适用于小容量存储器
-
双译码:X向和Y向两个译码器,适用于大容量存储器
-
RAM结构与地址译码—字结构或单译码方式
- 结构:
- 存储容量M=W行×b列;
- 阵列的每一行对应一个字,有一根公用的字选择线W;
- 每一列对应字线中的一位,有两根公用的位线BS0 与BS1 。
- 存储器的地址不分组,只用一组地址译码器。
- 字结构是2度存储器:只需使用具有两个功能端的基本存储电路:字线和位线
- 优点:结构简单,速度快:适用于小容量M
- 缺点:外围电路多、成本昂贵,结构不合理。
- 结构:
-
RAM结构与地址译码—位结构或双译码方式
- 结构:
- 容量:**N(字)×b(位)的RAM,把每个字的同一位组织在一个存储片上,每片是N×1;再把b 片并列连接,组成一个N×b的存储体,就构成一个位结构的存储器。 **
- 在每一个N×1存储片中,字数N被当作基本存储电路的个数。若把N=2n 个基本存储电路排列成$N_x$行与$N_y$列的存储阵列,把CPU送来的n位选择地址按行和列两个方向划分成$n_x$ 和$n_y$ 两组,经行和列方向译码器,分别选择驱动行线X与列线Y。
- 采用双译码结构,可以减少选择线的数目。
- 优点:驱动电路节省,结构合理,适用于大容量存储器。
- 结构:
译码方式
存储器的读、写周期
计算机是一个有严格时序控制要求的机器。与CPU连接时,CPU的控制信号与存储器的读、写周期之间的配合问题是非常重要的。
注意: 读出时间与读周期是两个不同的概念。
读出时间:是指从CPU给出有效地址开始,到外部数据总线上稳定地出现所读出的数据信息所经历的时间
读周期时间:则是指对存储片进行两次连续读操作时所必须间隔的时间。
显然总有:读周期 ≥ 读出时间
静态 RAM (2114) 读 时序
静态 RAM (2114) 写 时序
动态MOS存储器
-
4管动态M0S存储元电路
在6管静态存储元电路中,信息是存于T0,T1管的栅极电容上,由负载管T4 ,T5 经外电源给T0 ,T1 管栅极电容不断地进行充电以补充电容电荷。维持原有信息所需要的电荷量。
由于MOS的栅极电阻很高,栅极电容经栅漏(或栅源)极间的泄漏电流很小,在一定的时间内(如2ms),存储的信息电荷可以维持住。为了减少管子以提高集成度。可以去掉补充电荷的负载管和电源,变成4管动态存储元:
刷新过程:在字选择线上加一个脉冲就能实现自动刷新。显然,只要定时给全部存储元电路执行一遍读操作,而信息不向外输出,那么就可以实现动态存储器的再生或刷新。
单管动态MOS存储元电路
根据动态平衡的电荷数多少来判断原存信息是0或1,因此,每次读出后,存储内容就被破坏。是破坏性读出,必须采取措施,以便再生原存信息。
四管DRAM存储器
单管DRAM存储
- 预充操作 (Precharge)
- 访问操作 (Access)
- 行选通,$T_1$管导通
- 存储电容和位线寄生电容电荷重分配
- 引起两位线上电压微弱差异
- 信号检测 (Sense)
- 电压略高的一侧拉升到逻辑1,另一侧为0
- 数据恢复 (Restore)
- 如数据为1,位线上的逻辑1给存储电容进行充电
- 数据输出(Output)
- 给出列选通信号,数据输出到外部。
- 行列选通信号分时给出,行列地址复用减少引脚
- 撤除行选通信号,关闭读出放大检测电路
DRAM 刷新
- 刷新:定期补充电荷以避免电荷泄露引起的信息丢失
- 电容存在泄露电流
- 刷新周期: 存储器两次完整刷新之间的时间间隔,一般为2ms,4ms或8ms
- 信息存储到泄漏之间必须完成刷新,称为最大刷新周期
- 按行刷新
- 存储体采用双译码结构,刷新地址计数器给出刷新行地址
- 刷新方式
- CPU与刷新控制器对DRAM的争用问题
- 集中式、分散式、异步式
集中刷新方式
- 最大刷新周期:2ms
- 在数据丢失之前集中刷新所有行
- 存在死区,用在实时要求不高的场合
分散刷新方式
- 最大刷新周期:2ms
- 存储周期:读写+刷新 各刷新周期分散安排在存取周期中
- 刷新次数 2ms/100ns=20000次 较浪费,用在低速系统中
异步刷新方式
-
刷新周期:2ms,各刷新周期分散安排在2ms内
-
每隔2ms/128=15.5微秒刷新一行,将128次刷新分散
-
最常用
-
说明1M×1位(=512×2048) DRAM芯片的刷新方法,刷新周期定为8ms
逐行进行刷新
512行,每行2048个存储元同时进行刷新,整个芯片在8ms内进行512次刷新操作
-
集中刷新
在8ms中某个时间段,连续进行512次刷新操作
“死时间”:t0=512 T (T为存储器读写周期)
-
异步刷新
8ms分成512个时间段,每隔8ms÷512=15.625µs 对芯片刷新一次(一行),消除长时间的“死时间”
-
-
无论是由刷新控制逻辑产生地址循环码逐行循环刷新,还是芯片内部自动刷新,都不依赖于外部访问,对CPU透明。
-
刷新通常为按行刷新,仅需要行地址
-
所有芯片同时被刷新,故考虑刷新问题时,应当从单个芯片存储容量着手。
存储器控制电路
DRAM存储器的刷新需要有硬件电路的支持,包括刷新计数器、刷新/访存裁决、刷新控制逻辑等。这些控制线路形成DRAM控制器。
高性能的主存储器
-
EDRAM芯片
EDRAM芯片又称增强型DRAM芯片,它在DRAM芯片上集成了一个SRAM实现的小容量高速缓冲存储器,从而使DRAM芯片的性能得到显著改进
-
EDRAM内存条
一片EDRAM的容量为1M×4位,8片这样的芯片(位扩展)可组成1M×32位的存储模块。
当某模块被选中,此模块的8个EDRAM芯片同时动作,8个4位数据端口D3—D0同时与32位数据总线交换数据,完成一次32位字的存取
-
FPM-DRAM 快速页模式动态存储器
- 程序访问局部性原理:根据计算机中对大量典型程序运行情况的分析结果,当前要立即执行的程序和数据往往局限在一个小的范围内,也即是说,在一个较短的时间间隔内,CPU对局部范围的存储器进行频繁访问,而对此外的地址很少访问。这种现象称为程序访问的局部性
- 分页技术:保持行地址不变,只改变列地址,对同一行的所有内存单元进行访问。
-
CDRAM 带高速缓冲存储器
-
SDRAM 同步性动态存储器
猝发式访问:在对同一行的连续单元进行访问时,减少额外的延迟和等待周期
SDRAM支持与系统同步的连续单元猝发式访问
存储器与CPU连接
CPU对存储器进行读/写操作,首先由地址总线给出地址信号,然后要对存储器发出读操作或写操作的控制信号,最后在数据总线上进行信息交流。所以,存储器与CPU之间,要完成:
- 地址线的连接;
- 数据线的连接;
- 控制线的连接。
存储器芯片的容量是有限的,为了满足实际存储器的容量要求,需要对存储器进行扩展。
用静态MOS存储片组成RAM
-
位扩展法:(数据总线扩展)
每一芯片的数据线分别接到数据总线的相应位。各芯片并行工作。例如:用8K×1的RAM存储芯片,组成8K×8位的存储器,按8位=m×1的关系来确定位扩展所需要的芯片数。共需8片
-
字扩展法:(地址总线扩展)
- 字扩展:字向扩展而位数不变,将芯片的地址线、数据线、读写控制线并联,而由片选信号来区分各片地址。同一时刻仅一芯片工作。 例如:用16k×8位的芯片采用字扩展法组成64k×8位的存储器:4个芯片。
- 地址分配:地址总线低位地址A0-A13与各芯片的14位地址端相连,而高两位的地址A14、A15经2:4译码器和4个芯片的片选端CE相连
-
字位同时扩展法:
一个存储器的容量假定为M×N位,若使用l×k位的芯片(l<M, k<N)需要在字向和位向同时进行扩展。此时共需要(M/l)×(N/k)个存储器芯片。
其中,M/l表示把M×N的空间分成(M/l)个部分(称为页或区),每页(N/k)个芯片。
- 地址分配:
- 用$log_2^ l$位表示低位地址:用来选择访问页内的l个字
- 用$log_2^{(M/l)}$位表示高位地址:用来经片选译码器产生片选信号。
- 地址分配:
ROM 的分类
只读存储器简称ROM,它只能读出,不能写入。它的最大优点是具有不易失性。根据编程方式的不同,ROM通常分为三类:
ROM芯片的类型
-
MROM(掩膜ROM)
掩膜工艺直接制作
-
PROM(一次性编程ROM)
允许用户进行一次性编程
-
EPROM(可擦除可编程ROM)
紫外光擦除、并可重复编程的ROM
-
EEPROM(电擦除可编程ROM)
擦除和编程(擦写)通过加电进行
-
Flash Memory(闪速存储器)
新型的电擦除可编程ROM
快速擦除整片或数据块
半导体存储器对比
闪速存储器
-
什么是闪速存储器
闪速存储器是一种高密度、非易失性的读/写半导体存储器,它突破了传统的存储器体系,改善了现有存储器的特性。
-
在不加电时仍可长期保持信息
-
本质上属于EEPROM,存储速度快
-
易于擦除和重写,功耗很小
-
存放BIOS,升级方便,CIH病毒
-
NOR & NAND FLASH
-
闪速存储器是在EPROM功能基础上增加了芯片的电擦除和重新编程能力
编程操作:编程操作就是对闪存的写操作。
读取操作:从闪存读出数据。
擦除操作:将闪存全部变为1。
速度不配怎么办?
由于CPU和主存储器在速度上不匹配,而且在一个CPU周期中可能需要用几个存储器字,这便限制了高速计算,为了使CPU不至因为等待存储器读写操作的完成而无事可做,可以采取一些加速CPU和存储器之间有效传输的特殊措施。
双端口存储器
同一个存储器具有两组相互独立的读写控制线路,提供了两个相互独立的端口,都可以对存储器中任何位置上的数据进行独立的存取操作
- 具有两组相互独立的读写控制线路
- 两组读写控制线路可以并行操作
- 端口地址不相同,无冲突,并行存取
- 端口地址相同,读写冲突,无法并行存取
多模块交叉存储器
每个模块各自以等同的方式与CPU传送信息。
连续地址分布在相邻的模块,对连续字的成块传送可以重叠进行实现流水线并行存取
-
存储器的模块化组织
一个由若干个模块组成的主存储器是线性编址的。
这些地址在各模块有两种安排方式:一种是顺序方式,一种是交叉方式。
顺序方式:某个模块进行存取时,其他模块不工作,某一模块出现故障时,其他模块可以照常工作,通过增添模块来扩充存储器容量比较方便。但各模块串行工作,存储器的带宽受到了限制。
交叉方式:地址码的低位字段经过译码选择不同的模块,而高位字段指向相应模块内的存储字。连续地址分布在相邻的不同模块内,同一个模块内的地址都是不连续的。对连续字的成块传送可实现多模块流水式并行存取,大大提高存储器的带宽。
**方案一:顺序方式 **
- 主存地址被分成高n位和低m位,高位(n)表示模块号,低位(m位)表示块内地址;
- 在一个模块内,程序是从低位地址连续存放;
- 对连续单元存取,一般仅对一个模块操作
- 特点:
- 多模块串行工作
- 易扩充容量
- 故障局部性。
多模块顺序存储器(地址总线扩展,容量扩展)
- 一个地址寄存器
- 高位片选,多模块串行
- 扩充容量方便
- 性能无提升
- 方便故障隔离
**方案二:交叉方式 **
- 主存地址被分成高n位和低m位,低位(m位)表示模块号,高位(n)表示块内地址;
- 各模块间采用多模块交叉编址;
- 对连续单元存取,则多个模块并行工作
- 特点:
- 多模块并行工作,速度快
- 不易扩展
- 故障全局性。
多模块交叉存储器
- 模块并行工作
- CPU比存储器要快
- 能同时取出多条指令或者数据
- 可大大提高机器的运行速度及存储带宽
定量分析:
模块字长等于数据总线宽度;
设:模块存取一个字的存储周期为T,总线传送周期为τ,存储器交叉模块数为m,则
$T=m \tau$($m=T/ \tau$称为交叉存取度)
表示每经过τ时间延迟后启动下一模块
交叉存储器连续读取m个字所需时间为$t1=T+(m-1) \tau $
而顺序存储器所需时间为t2=mT
显然t1<t2,故交叉存储器带宽提高。
交叉编址顺序访问时可按流水方式存取
- $nT = m\tau$
- m = T/ 交叉存取度连续读取n个字的时间
- $t_1=T+(n-1) \tau $,$t_1<t_2$
- $t_2=nT$
相联存储器
按内容寻址的存储器
把存储单元所存内容的某一部分作为检索项,去检索该存储器,并对存储器中与该检索项符合的存储单元内容进行读出或写入
Cache存储器
- 在相对容量较大而速度较慢的主存与高速处理器之间设置的少量但快速的存储器
- 主要目的:提高存储器速度
- 为追求高速,包括管理在内的全部功能由硬件实现
cache 术语
- 命中 hit: CPU访问数据在cache中(上层存储器)
- 缺失 miss: CPU访问数据不在cache中
- 块 block: cache与主存交换最小单位
- 行/槽 Line/Slot 标记、标志位、数据块容器
- 有效位、查找标记、脏标志位、置换标志、数据块副本
- Cold Cache、Warm Cache
- 命中率 ( hit rate )
- 主存访问中cache命中比例
- 缺失率 (miss rate)
- 1 – 命中率
- 命中访问时间: (hit time)
- 数据查找时间、cache访问时间、总线传输时间
- 缺失损失 (miss penalty)
- 主存块调入cache,数据传输到处理器的时间
- 远大于命中时间,所以一些相对较小的时间可忽略
cache关键技术
- 数据查找 Data Identification
- 地址映射 Address Mapping
- 替换策略 Placement Policy
- 写入策略 Write Policy
Cache基本原理
- CPU与cache之间的数据交换以字(字节)为单位
- Cache与主存间的数据传送以数据块为单位
- 一个块(Block)由若干字组成
Cache的读操作
高速命中(Hit):微处理器读取主存的内容已包含在Cache中,可以直接读取Cache,不用访问主存
高速失效(Miss)、缺失、未命中:微处理器读取主存的内容不在Cache中,需要访问主存读取一个数据块
Cache的工作原理
- Cache以块为单位进行操作
- 当CPU发出访内操作请求后,首先由Cache控制器判断当前请求的字是否在Cache中,若在,叫命中,否则,不命中
- 若命中:
- 若是“读”请求,则直接对Cache读,与主存无关
- 若是“写”请求:
- Cache单元与主存单元同时写(Write through写)
- 只更新Cache单元并加标记,移出时修改主存(写回Copy back)
- 只写入主存,并在Cache中加标记,下次从MM读出,保证正确。
- 未命中时:
- 若是“读”请求,则从主存读出所需字送CPU,且把含该字的一块送Cache,称“装入通过”,若Cache已满,置换算法;
- 若是“写”请求,直接写入主存
Cache的命中率
命中率(Hit Rate):高速命中的概率
cache/主存系统的平均访问时间$t_a$:
$t_a=ht_c+(1-h)t_m$
$t_c$=命中时的cache访问时间
$t_m$=未命中时的主存访问时间
Cache的访问效率e
设$r=t_m/t_c$表示主存慢于cache的倍率
例:
CPU执行一段程序时,cache完成存取的次数为1900次,主存完成存取的次数为100次,已知cache存取周期为50ns,主存存取周期为250ns,求cache/主存系统的效率和平均访问时间。
解:
$h=N_c/(N_c+N_m)=1900/(1900+100)=0.95$
$r=t_m/t_c=250ns/50ns=5$
$e=1/(r+(1-r)h)=1/(5+(1-5)×0.95)=83.3%$
$t_a=t_c/e=50ns/0.833=60ns$
或者,$t_a=h·t_c+(1-h)·t_m=60ns$
Cache结构
- Cache的数据块称为行(线Line,槽Slot)
- 用$L_i$表示,其中i=0,1,…,m-1,共有m=$2^r$行
- 主存的数据块称为块(Block)
- 用$B_j$表示,其中j=0,1,…,n-1,共有n=$2^s$块
- 行与块是等长的,包含$k=2^w$个主存字
- 字是CPU每次访问存储器时可存取的最小单位
- Cache由数据存储器和标签存储器组成
- 数据存储器:高速缓存主存数据
- 标签存储器:保存数据所在主存的地址信息
主存与Cache的地址映射
-
Cache通过地址映射(mapping)的方法确定主存块与Cache行之间的对应关系,确定一个主存块应该存放到哪个Cache行中
-
全相联映射(fully associative mapping)
可以将一个主存块存储到任意一个Cache行
-
直接映射(direct mapping)
将一个主存块存储到唯一的一个Cache行
-
组相联映射(set associative mapping)
可以将一个主存块存储到唯一的一个Cache组中任意一个行
注:直接映射、2/4/8路组相联映射使用较多
全相联映射
全相联应用场合
- 块映射灵活,一对多映射
- cache全部装满后才会出现块冲突
- 块冲突的概率低,cache利用率高
- 淘汰算法复杂
- 命中率高
直接相联映射
- cache容量 = 行大小 × 行数 =(标志位+标记位+数据块+置换标记) × 行数
- 标记位=区地址
- 标志位(有效标志位,脏数据位)
- 无相联存储器,一个比较器
直接相联应用场合
- 块映射速度快,一对一映射,无须查表
- 利用索引字段直接对比相应标记位即可
- 查找表可以和副本一起存放,无需相联存储器
- cache容易冲突,cache利用率低
- 淘汰算法简单
- 命中率低,适合大容量cache
组相联映射
组相联应用场合
- 容量小的cache可采用全相联映射或组相联映射
- Pentium CPU L1 L2 cache
- 容量大的可采用直接映射方式
- 查找速度快,命中率相对低
- 但cache容量大可提高命中率
- 块设备缓存
不同映射方式主存地址划分
替换策略
-
替换问题
- 新主存块要进入Cache,决定替换哪个原主存块
- 直接映射,只能替换唯一的一个Cache行
- 全相联和组相联,需要选择替换策略(算法)
-
最不常用(LFU: least-frequently used)
替换使用次数最少的块
-
最近最少使用法(LRU: least-recently used)
本指替换近期最少使用的块,实际实现的是替换最久没有被使用的块
-
随机法(random)
随意选择被替换的块,不依赖以前的使用情况
LRU替换算法
-
LRU能较好地反映程序的局部性,因而其命中率较高,但实现的硬件较复杂
-
2路组相联:使用一个U位。某个Cache块被访问,该块U位置1;对应块U位置0。替换U位为0的块
-
4/8路组相联:运用堆栈型算法。最近访问的块放上面,最下面存放最久没有访问的块。替换最下面的块
写入策略
-
处理器对Cache读占大多数,也容易提高速度
-
写入Cache有些问题:
- 确认命中,才可以对Cache块写入
- 写入的数据字数不定
- 写入后可能导致与主存内容不一致
-
写入策略解决主存内容的更新问题,保持正确
-
直写法(write through)=全写法
写入Cache的同时也写入主存(下一级存储器)
-
回写法(write back)=写回法
只写入Cache,在被替换时才写回主存
直写和回写的比较
- 直写策略
- 优点:简单可靠
- 缺点:总线操作频繁、影响工作速度
- 解决方法:在Cache与主存间设置一级/多级缓冲器,形成实用的“缓冲直写”方式,提高速度
- 回写策略
- 优点:可以减少写入主存次数、提高速度
- 缺点:硬件结构比较复杂
- 实现方法:为了表明Cache是否被修改,需要设置一个更新位(update,污染位dirty bit)。替换时只需将被修改的Cache块内容写入主存
写未命中的处理方法
-
写访问并不需要Cache块中所有数据。写未命中时,写入的数据是否还要将其读回Cache呢?
-
写分配法( write allocate,WTWA )
先把数据所在的块调入Cache,然后再进行写入。类似读失效的方式,也称fetch on write
-
不写分配法( no-write allocate,WTNWA )
直接把数据写入下一级存储器,不将相应的块调入Cache,也称write around
-
直写策略通常配合不写分配法,回写策略一般采用写分配法
Cache一致性
- 有了Cache,同一个数据会在主存也会在Cache
- 有了多级Cache,在主存、一级、二级或三级Cache中可能存在同一个数据的多个拷贝
- 多处理器系统存在有多个Cache,同一个数据的拷贝份数会更多
- 如何保证它们都相同,或者说如何保证程序获得最新的正确的数据,就是Cache数据的一致性问题
实现Cache一致性的基本方案
- 软件方法:由编译程序和操作系统在编译时分析代码,避免共享变量进入Cache
- 硬件方法:程序运行时动态处理,对程序员和编译员透明,称为Cache一致性协议(Cache coherence protocol)
- 目录(directory):物理主存中共享数据的状态及相关信息保存在目录中,通常由中央控制器集中维护
- 监听(snoopy):各个Cache除保存数据拷贝外,也保存数据的共享状态信息,通过监听总线操作判断
虚拟存储器
- 虚拟存储器:
- 在主存-外存层次间
- 借助于磁盘辅助存储器实现
- 由系统软件和辅助硬件管理
- 以透明方式提供给用户
- 一个比实际主存空间大得多的程序地址空间
- 作用:扩大主存容量,提高辅存访问速度,有效管理存储系统
虚拟:利用其他部件实现的本来不存在的事物或属性
透明:本来存在的事物或属性,从某种角度看似乎不存在
虚拟存储器的基本概念
- 物理地址(实地址):(对应主存物理空间)由CPU地址引脚送出,用于访问主存的地址
- 虚拟地址(虚地址):(对应主存逻辑空间)由编译程序生成的,是程序的逻辑地址
- CPU理解虚拟地址,并将其转换成物理地址
- Cache与虚存的异同(P101)
主存-外存层次的基本信息传送单位
- 段:按程序逻辑划分为可变长的块,称为段
- 页:机械地划分为大小相同的块,称为页面
- 段页:程序按模块分段,段内分页
虚拟存储器的管理
-
段式管理:把主存按段分配的存储管理方式
优点:段的界线分明,段易于编译、管理、修改和保护,便于多道程序共享
缺点:段的长度各不相同,主存空间分配麻烦
-
页式管理:以定长页面进行存储管理的方式
优点:页的起点和终点地址固定,方便造页表,新页调入主存也很容易掌握,比段式空间浪费小
缺点:处理、保护和共享都不及段式来得方便
-
段页式管理:分段和分页相结合的存储管理方式
优点:综合段式和页式管理方式的特点
缺点:需要多次查表过程
页式虚拟存储器
逻辑页:页式虚拟存储系统中,虚拟空间分成页
物理页:主存空间也分成同样大小的页
虚存地址分为两个字段:高字段为逻辑页号,低字段为页内行地址。
实存地址也分两个字段:高字段为物理页号,低字段为页内行地址.
页式管理的地址变换:用页表
快表与慢表
段式虚拟存储器
段式管理的地址变换:用段表
段页式虚拟存储器
替换算法
- 虚拟存储器的页面替换策略和cache的行替换策略有很多相似之处,但有三点显著不同:
- 缺页至少要涉及一次磁盘存取,使系统蒙受的损失要比cache未命中大得多
- 页面替换由操作系统软件实现
- 页面替换的选择余地很大,属于一个进程的页面都可替换
- 虚拟存储器的替换策略
- 多采用近期最少使用(LRU)算法
- 还有最不经常使用(LFU)算法
- 先进先出(FIFO)算法
奔腾处理器的存储器地址转换
存储保护
多个程序同时存在于存储器中,需要保护
- **存储区域保护: **
- 界限保护
- 页表和段表保护
- 键式保护
- 环状保护
- 访问方式保护:
- 设置访问权限:读R、写W、执行E的组合
- 特权保护
奔腾处理器的段描述符
- 段界限(segment limit):用于存储空间保护
- 基地址(base address):用于形成物理地址
- 访问权字节(access rights byte):段访问权限:该段当前是否驻留主存、该段所具有特权层和段类型,用于特权保护
奔腾处理器的页目录项和页表项
- P存在位:该页表或页面是否在物理存储器中
- A访问位:页面进行读或写操作时置位
- D写操作位(dirty脏位):页面进行写操作时被置位
- U/S用户/管理员位:页面仅能由管理员层的程序使用,还是用户层和管理员层的程序均能使用
- R/W读/写位:指明页面是只读的,还是可读可写