导图社区 计算机考研第三章 存储系统
计算机考研计算机组成原理,总结了只读存储器ROM、双端口RAM和多模块存储器等内容,知识点系统且全面,希望对大家有用。
编辑于2024-05-04 21:23:20第三章 存储系统
存储器特点,层次结构
分类:
按作用:
高级缓冲存储器
【即Cache】,位于CPU和主存之间,使CPU能更快速的使用到里面的数据(Cache中的数据是主存中的副本,而缓冲区不是)
主存储器
【即主存/内存】,存放计算机运行时需要的大量的数据,CPU可以直接与其进行访问,也可以和cache交换数据
可直接被CPU读写
辅助存储器
【即辅存/外存】,不能与CPU进行直接信息交换
按存储介质:
磁表面(磁盘磁带)、磁心存储器、半导体存储器(MOS存储器)、光存储器(光盘)
按存取方式:
随机存取RAM
优点:读写任何一个存储单元所需时间都相同, 与存储单元所在的物理位置无关
缺点:一旦断电,RAM即失去存储信息(易失性)
分类:
SRAM
制作高速缓存Cache和快表TLB
DRAM
制作主存
只读存储器ROM
具有随机访问的特性(读的速度比写的快)
缺点
ROM中的信息一经写入,之后只能读取,不能再次写入,里面的内容固定不变。
优点
断电以后不会丢失存储信息(非易失性),适合存储固定程序和数据,多用于系统程序BIOS,和微程序控制器中的控制存储器。
发展
部分ROM具有写入功能,例如、闪存和固态硬盘
顺序存取存储器SAM
缺点:顺序存取存储器在访问数据时,必须顺着存储单元的物理地址顺序,顺次进行访问,即串行访问。类似于链表,必须从前往后遍历才能找到需要访问的单元,因而存取时间与存取的物理地址相关。
例如:磁带
直接存取存储器DAM
特点:先随机访问确定一个较小的存储区域,再在小区域内顺序查找,(类似与分块查找),存取时间同样与存取的物理地址相关
例如:磁盘、光盘
相连存储器CAM
可以按内容进行访问的存储器
例如TLB、Cache
按信息的可更改性
读写存储器
磁盘,内存,Cache
只读存储器
CD-ROM,BIOS通常在ROM中
按信息可保存性:
易失型(RAM断电后丢失)
非易失性(ROM断电后不丢失)
破坏性读出(DRAM芯片、磁芯存储器)
非破坏性读出(SRAM芯片、DISK)
性能指标:
基本概念
存储字
一串二进制数作为整体存入或取出时
存储单元
存放存储字或存储字节的主存空间称为存储单元或主存单元
编址与寻址
字节编址
最小寻址单位是一个字节,可以按字节、按半字、按字寻址
字编址
最小寻址单位一个字,仅支持按字寻址
存储容量:
字编址
存储字数 * 字长
如某计算机的主存容量为64Kx16,表示它有64K个存储单元,每个存储单元的字长为16位。 若改用字节数表示,则可记为128K字节(128KB)
字节编制
以字节数来表示存储容量
MAR位数:
地址总线个数
MDR位数:
数据总线个数
单位成本:
每位价格 = 总成本 / 总容量(bit)
存储速度:
数据传输率=存储字长/存储周期
访问时间:
读出时间TA
TA是指从存储器接到读命令开始至信息被送到数据线上所需的时间
写入时间TW
Tw是指存储器接到写命令开始至信息被写入存储器所需的时间
存储周期:
访问时间 + 恢复时间
又称:连续读或者连续写所允许的最短时间间隔
主存带宽:
数据传输率,表示每秒从主存进出信息的最大数量
多级存储系统:
主存与辅存之间的数据交换由硬件和操作系统(操作系统决定,哪些页面调入主存) 主存和Cache之间的数据交换由硬件自动完成 (硬件决定,哪些主存块调入Cache)
考频:低
11
SRAM、DRAM
考频:低
12、14、15、22
存储芯片的基本原理:
栅极电容:
MOS管+电容
存储体/存储单元:
存储体的一排连接了多个栅极电容,故CPU的一次读写单位即“一排栅极电容”,也即【一个存储字长/机器字长】
存储芯片:
存储芯片:
一个存储芯片由多个字排列组成,每一排字对应一根【选通线】,即对应【MAR(地址)】中一个的数据。
控制电路:
当MAR、MDR、译码器的电平稳定过后才允许进行下一步操作
片选线:
CS杠、CE杠(chip-select/enable),如果此处的电平信号为低电平时,说明芯片可以工作,理应处理传递过来的命令
读/写控制线:
WE/RD杠,如果此时线是低电平,则说明允许读写,如果只有一个WE杠的话,则【低写高读】
存储芯片浓缩版:
片选线:
地址复用技术:2根
DRAM
否则:1根
读写线:
看题目怎么说
地址线:
地址复用:
地址总线的个数/2
不复用:
地址总线的个数
数据线:
MDR的位数
注意一定有【供电线】和【接地线】
五大部分
总线个数:
例:某DRAM总容量为 64K * 2B,读写分开控制,问总引脚线数
(DRAM默认地址复用)
片:2,读写线2根,(地址线:16根)地址复用线:8根,数据线:16根,供电线+接地线:2根
64K = 2^16(16根线),2B = 16bit(16根线)
注意这里的64K = 2^16 = 2^8 * 2^8,所以在【译码器过后的选通线】有256(行) + 256(列)=512 根线,而在【译码器前的地址总线】处应该只有8根
如果没有地址复用技术:2^16根选通线
30根
寻址:
按字节寻址
按字寻址、按半字/双字寻址
要注意一次读写的【字长】为多少
SRAM
Cache
Static Random Access Memory
存储元: (几个MOS)
双稳态触发器,6个MOS
了解即可
优点:
速度快,但是【集成度低、功耗大、用来组成高速缓存存储器】
不需要进行刷新
DRAM
内存
Dynamic Random Access Memory
存储元:
栅极电容
采用技术:
地址复用技术
行列地址分两次送,送到行列地址缓冲器。可以使地址线更少,芯片引脚更少
优点:
集成高、价格低、容量大、功耗低
在工作时存储器内容不会发生改变(即会进行刷新,所以内容不会发生丢失)
现在DRAM被称为SDRAM(例如DDR3,DDR4)
刷新:
由存储器自主完成
每次刷新多少存储单元:
【基础版】一次刷新一整行(线选法)
例如有20根地址线,则一共对应有1024 * 1024根选通线。
刷新顺序:从上到下选n个。每次刷新一行
【行列存储版】把地址分布改为行地址+列地址的存储方式(减少选通线的数量)(重合法)
例如有20根地址线,则有1024根行选通线,1024根列选通线 = 2048根选通线。
刷新顺序:从左到右,从上到下。每次选n个一起刷新
如何刷新
有硬件支持,读出一行的信息后重新写入,占用一个读/写周期
刷新周期:
一般取2ms刷新一次
题目没说刷新时间,那就是2ms
刷新算法:
集中刷新:
在一个刷新周期内,在一个固定时间,停止其他操作,把【所有】的存储单元都进行刷新。
“死时间”、“死区”
分散刷新:
把每行的刷新分散到各个工作周期内,每个存储周期前半部分用于正常读写,后半部分用于刷新【某一行】(这一行是CPU安排的) 即存储周期加倍
加长了系统的存取周期
异步刷新:
即:集中刷新 + 分散刷新
将刷新周期除以行数,得到两次刷新操作之间的时间间隔 t,则每隔时间t进行一次刷新,刷新【一行】
“死时间”、“死区” 实际应用中,CPU可以利用不访问存储器的间隙进行刷新。例如,指令译码阶段
注意:
透明度:
对CPU透明,不依赖外部的访问
刷新单位:
一行,行地址由刷新地址寄存器产生。
选片:
不需要选片,对存储器中所有芯片都进行刷新
SDRAM
SDRAM和CPU之间采用同步方式传输数据,其读写受系统时钟控制;支持突发传递方式
具体过程:第一次存取时给出首地址,同一行的所有数据都被送到行缓冲器 以后每个时钟都可以从SDRAM输出一个数据。
行缓冲器:用来缓存指定行中整行的数据,其大小为列数*存储单元位数,用SRAM实现
SDRAM内部的工作方式寄存器可以设置:
传输数据的长度(突发长度)
收到读命令到开始传送数据的延迟时间
SRAM vs DRAM
都是易失,只不过一个不需要刷新(SRAM)、一个需要刷新(DRAM)
同时送:地址多少位,就要设置多少个地址选通线(DRAM存储容量大,不适合多个选通线同时接通)
读写周期
RAM的读周期
RAM的写周期
只读存储器ROM
特点:
不易失、断电不丢失、结构简单、位密度高
写到主板中的,能让系统进入BIOS
类型:
MROM:
中文:
掩模式ROM(Mask)
特点:
厂商按照要求再生产时直接写入,写入后任何人无法改变内容
可靠性高、便宜、灵活性差
PROM:
中文:
一次可编程ROM(program)
特点:
可以实现一次编程(用户可以使用专门的设备),一旦写入,不可改变
EPROM:
中文:
可擦除可编程ROM(Erase Program)
特点:
可以多次修改,编程次数有限,写入时间过长
UVEPROM紫外线擦除,(E^2)PROM电擦除
Flash:
中文:
闪速存储器
特点:
是EPROM的改良,擦除重写速度更快(写比读慢,因为写入前要先擦除),Flash每个存储元只用单个MOS,故位密度比RAM高
SSD:
中文:
固态硬盘
特点:
由控制单元和Flash组成,读写速度快,低功耗,价格高
OS的自举装入程序:
引导块
位置:
主板上的ROM的BIOS芯片里
计算机系统中,OS保存在硬盘上,其内存储器应该采用:RAM + ROM
RAM和ROM的统一编址:
连续编址
随机存取
RAM和ROM都是可以随机存取的
不可随机存取:
磁带(OS)
考频:低
10、15
双端口RAM和多模块存储器
考频:低
15、17、22
均是用来优化内存的
问题引入
双端口RAM:
解决问题:
用于优化多核CPU访问单个内存条的情况
在同一个存储器的左右设置两个独立的端口,分别与两个CPU相连,每个端口都具有独立的地址、数据、控制线;CPU、RAM中也要有更复杂的控制电路
四种情况(读写者问题)
时间\地址
同一地址
不同地址
同时
①都读出 --- 无冲突 ②都写入 --- 冲突 ③写+读 --- 冲突
不会冲突
不同时
不会冲突
不会冲突
解决冲突办法:设置“busy”信号,由逻辑信号决定暂时关闭一个端口(使其延时),未被关闭的正常访问
多模块存储器:
解决问题:
在一个存取周期中,存取时间很短,恢复时间非常长
恢复时间指:整个存储体的恢复时间
多体并行
CPU可以同时快速的取出四条指令
交叉访问存储器中有多个容量相同的存储模块(存储体),而且各存储模块具有各自独立的地址寄存器、读写电路和 数据寄存器,这就是多体系统。各个存储体既能并行工作,又能交叉工作。
高位交叉编址
目的是扩充存储器容量
高位2bit是对应不同的存储体
M0 : 00 xxxxxxxx M 1: 01 xxxxxxxx 编程难度大 (实际效果相当于扩容)
读完一个数据后,存储体需要进行恢复,恢复完后才能读下一个
举例:
甘特图, 耗时 5T
低位交叉编址
低位2bit对应不同存储体
举例:
甘特图, 耗时 T+4r
启动方式
交叉启动
若所有模块一次并行读/写的总位数正好等于数据总线位数,则可以同时启动所有模块进行读写
例如:设每个模块一次读1写的位数为16位,模块数m=4,数据总线位数为64位,4个模块共提供64位,正好构成一个存储 字,因此应该同时启动4个模块进行并行读写。
轮流启动
如果每个存储模块一次读写的位数(即存储字)正好等于系统总线中的数据线数(即总线传输单位),则采用轮流启动方式。 轮流启动下,每隔r启动一个模块进行读写。要实现流水线方式存取,应该满足的条件是:T<=mr
流水线式
多体并行 + 低位交叉
模块存取一个字的存取周期为T,总线传送周期(存取时间)是r,为实现流水线方式存取,存储器交叉模块数应大于等于:m = T/r
等于是最好的,不然少了浪费时间,多了浪费钱
每过r周期启动下一个模块,这样当最后一块传完后,第一块又能接上了。
存取m个字,需要T+(m-1)r的时间
单体多字
即多个并行工作的存储器共有一套地址寄存器和译码电路 按同一地址并行地访问各自的对应单元。
优点:并行访问存储器按地址在一个存取周期内可读出n*w位的指令或数据,使主存带宽提高n倍
速度和多体并行的速度基本完全一致
缺点:指令和数据在主存中必须是连续存放的,一旦遇到转移指令,或者操作数不能连续存放,效果不行
主存储器和CPU的连接
总线信号命名:
地址A0 ~ A7,数据 D0 ~ D7
现在计算机模型
主存的基本组成
内存条插槽内有存储器总线
内存条中的信息通过【内存条的引脚】,再通过【插槽内的引线】连接到【主板】上,通过【主板上的导线】连接到【CPU芯片】。
位扩展
原因:芯片的字长(bit数)和CPU的字长(bit数)不统一,需要横向连接多块芯片来满足CPU的读取一次时的bit数需求
即:扩展一次性可以读出的数据字长
最开始只有一块芯片的时候(数据线不够)
例如再连一块
最后连接8块芯片
这样就把八个8K * 1位的芯片通过【位扩展的方法】扩展为了8K * 8位的芯片
字扩展
原因:芯片的字长和CPU已经满足了,可是CPU的地址总线上还是有很多根没有充分利用。故可以通过在地址中设置片选信号来增加地址数目
即:扩展主存字数
最开始的时候地址线还有3个引脚没有连接
法一:线选法,CPU每一根多的地址线就连接着对应的芯片的CS。【这样CPU多了N根线,就可以多连接N个芯片】
地址空间不连续
法二:译码片选法,CPU的每一根对应的地址线都连接一个非门和一根线,这样可以控制两个芯片。【所以CPU多了N根线,可以多连接2^N个芯片】
译码片选法连接多个芯片(此处选择了A13,A14,所以A15无论是多少都不会改变A0-A14的地址映射)
这样就把4个8K * 8位的芯片通过【字扩展的方法】扩展为了32K * 8位的芯片
字位扩展法:
两个芯片(16K * 4)为一组进行【位扩展】,所以机器字长为8bit(16K * 8)。再将四组通过【字扩展】连接在一起,形成(64K * 8)的存储空间
地址空间为: 0000 0000 0000 0000 ~ 1111 1111 1111 1111
每个地址对应一个字的数据(此处一个字=1 Byte)
注意CS和WE线
补充:译码器
普通的3-8译码器
"使能"端
EN使能
74ls138利用使能端控制片选 信号的生效时间
MREQ
CPU通过控制一个使能端,来控制CPU的操作顺序
CPU先把地址信号传递到地址线上面去,检测到信号稳定后,CPU才会把MREQ设置为0,芯片才能进行运作
考频:中
09-11、16、18、21
外部存储器
考频:低
13*2、15、19
磁盘存储器
硬盘存储器的组成
执行流程
磁盘驱动器
负责接收磁盘控制器的控制命令,并控制磁头组件和盘片组件进行读写操作。(操作工)
磁盘控制器
磁盘高速缓存
在内存中开辟一部分区域,用于缓冲将被送到磁盘上的数据。
优点:写磁盘时是按“簇”进行的,可以避免频繁地用小块数据写盘;有些中间结果数据在写回磁盘之前可被快速地再次使用。
磁头
盘片
磁盘的概念
磁道
一个又一个的【同心圆】
磁道间隙
每两个同心圆之间的【间隙】
扇区
一个磁道可以分为若干个【扇区】
又称:磁盘块(物理上)
扇区间隙
每两个扇区之间的间隙
柱面
多个磁盘垂直叠在一起时,所有磁道组成的垂直面就是柱面
块
物理块
扇区
物理上读写一次的基本单位
逻辑块
簇
OS中存储空间分配的最小单位
性能指标
磁盘的容量 非格式化和格式化
一个磁盘所能存储的字节总数
记录密度
道密度
道密度是沿磁盘半径方向单位长度上的磁道数
位密度
位密度是磁道单位长度上能记录的二进制代码位数
面密度
面密度是位密度和道密度的乘积。
平均存取时间
寻道时间+旋转延迟时间+传输时间 寻道时间和旋转时间通常取平均值
数据传输率
磁盘存储器在单位时间内向主机 传送数据的字节数
假设磁盘转数为r转/秒,每条磁道容量为N字节,则数据传输速率为Dr=rN
磁盘地址形式:
<磁盘组号、柱面、盘面、扇区>
磁盘组号:可以将磁盘分为多个磁盘组,每个磁盘组包含多个盘面。
柱面号(磁道号):移动磁头臂(寻道)
盘面号(磁头号):激活某个磁头
扇区号:通过旋转将特定扇区划过磁头下方
注意:磁盘属于机械式部件,读写操作是串行的,不可能同一时刻既读又写
磁盘阵列
RAID (独立冗余磁盘阵列)是指将多个独立的物理磁盘组成一个独立的逻辑盘,数据在多 个物理盘上分割交叉存储、并行访问,具有更好的存储性能、可靠性和安全性。
• RAID0:无冗余和无校验的磁盘阵列。 ( 条带化技术)
把连续多个数据块交替地存放在不同物理磁盘的扇区中,几个磁盘交叉并行读写,扩大了存储容量,提高了磁盘数据存取速度,但没有容错能力 (类比低位交叉编址的多体存储器)
无容错能力
• RAID1:镜像磁盘阵列。
使两个磁盘同时进行读写,互为备份,若一个磁盘出现故障,可从另一磁盘中读出数据。
但容量减少一半
• RAID2:采用纠错的海明码的磁盘阵列。
• RAID3:位交叉奇偶校验的磁盘阵列。
• RAID4:块交叉奇偶校验的磁盘阵列。
• RAID5:无独立校验的奇偶校验磁盘阵列。
固态硬盘SSD
执行流程
固态硬盘
基于闪存的存储器
存储介质:NAND颗粒,闪存芯片
读写速度比较:
(硬件茶谈)
组成:
闪存翻译层 + 多个闪存芯片
市面上的厂家的SSD都有一个缓存
读写单位
CPU下令要读取一个块的内容
SSD的读取单位:一个页 相当于磁盘的扇区
SSD接受到这个块的地址
SSD的闪存翻译层通过电路迅速 把它翻译为SSD中对应的数个页的地址
SSD把这些页的数据发到IO总线上,返回CPU
具体大小:机械磁盘的一个块大小可能在1KB;SSD的一个页大小是512B~4KB,一个块中有32~128个页,一个块大小为16KB~512KB
读写原则:
读:以一个页为单位来读 ✅
写:以一个页为单位来写
擦除:以一个块的单位来擦除
擦除方法:先把要写那页的整块复制到另一块,然后再擦除原来那块
复制过后,在闪存翻译层中会建立新的: ‘逻辑地址’ —— ‘物理地址’ 的转换关系
擦除的缺点:
擦除多了会造成磨损
支持随机访问
平均磨损
静态平均:
SSD在进行擦除后的数据迁移的时候,会让寿命比较老的闪存块担任“读”的责任,让新的闪存块担任“写”的责任
静态平均的效果比动态平均效果更好
动态平均:
在SSD写入新数据的时候,会优先选择磨损次数少的块进行写入
高速缓冲存储器Cache
问题引入:
前提
局部性原理
时间局部性
空间局部性
数组访问【空间局部性】很好 👍🏻
数组访问【空间局部性】差劲 👎🏻
分析:
上述问题的三个其他点:
数组访问的时间局部性:
都差,因为都只访问了一次
for循环代码段的局部性:
时间、空间都很好
对于指令
因为指令中存在大量的循环结构,导致同一条指令短时间内可能会多次运行,所以指令有时间局部性;同时指令往往也是顺序执行,执行完第x条指令后,很可能执行第x+1条指令,所以指令有空间局部性。
对于数据
同一个变量可能会短时间内被多次访问(例如循环体里面的变量),即数据有时间局部性。同时许多数据常以数组等连续结构存储,它们被存放在相邻的位置里,且常在一段时间内被顺次访问,所以这类数据具有空间局部性。
操作系统采用页式存储
<页号、偏置值>
Cache的基本工作原理
主存块大小等于Cache 行中数据区大小
Cache中的内容是主存的复制(缓冲区_______)
可以将局部性好的内容放入到Cache中
Cache命中后直接把标记后的数据部分进行读取(就可以不访问内存了)
先访问Cache,若Cache未命中再访问内存
同时访问Cache和主存,若Cache命中则立即停止访问主存
Cache的访问速度t,H为命中率,tc是cache时间,tm是访问主存时间(通常把从主存读入一个主存块到cache的时间tm称为缺失损失。)
通常采用SRAM构成
现代计算机把Cache集成在了CPU的内部
速度快、成本高、集成度低
主存与Cache之间以“块”为单位进行数据交换
CPU在Cache中的访问过程
①CPU执行程序过程中,需要从主存取指令或读数据时,先检查cache中有没有要访问的信息,
②若有,就直接从cache中读取,而不用访问主存储器,即cache命中。
③若没有,就从主存中把当前访问信息所在的一个主存块复制到cache中,即cache未命中。因此,cache中的内容是主存中部分内容的副本。
流程图
这些工作要求在一条指令执行过程中完成,因而只能由硬件来实现。因此,Cache对程序员来说是透明的,程序员编程时不用考虑信息存放在主存还是在Cache。
大题看到题目第一步怎么做:
下面那个地址可以不画
Cache和主存的映射关系
Cache每一行的内容
(计数位 + 脏位) + 有效位+标记+存储的内容
【计数位】是用于LRU算法的
也叫替换控制位
比如是2^n 路组相联,就需要n bit的计数位
【脏位】是用于Cache写策略的
【有效位】为1说明该Cache行的内容有效,为0则不然
【标记】是用于主存块和Cache块是否匹配的验证信息
配合使用
【存储的内容】就是对应的主存页面的副本
全相联映射 (任意放)
映射规则:
主存中的块可以存入Cache中的任意位置
映射公式
【无】
查找方式:遍历所有Cache行
地址变化:
大题第二步(根据地址映射规则计算正确的地址形式)
此时主存的地址样子
CPU访问例子(大题第三步)
原理
首先获得访问的地址<块号、块内地址>
<页号、偏移量>
解析页号,【遍历】整个Cache标记,进行比较,找到标记相同的
特点
灵活、冲突率低、利用率高、命中率高
速度最慢,实现成本高(需要为每个Cache行设置一个比较器),需要昂贵的TLB(相联存储器)进行地址映射
Cache每行有 1+1+3+22+64*8 = 539 bit
有效位:LRU算法需要3bit
直接映射 (特定放)
直接映射规则:
主存在Cache中的行号 = 主存块号 % Cache总块数
映射公式
Cache中有2^c页,则主存中第 i 页对应在Cache中的行号 j(相当于留下最后的c位二进制数) 主存块号末尾c位直接反映她在Cache中的位置
替换算法:如果出现冲突,则直接将块移出cache
地址变化:
大题第二步(根据地址应声规则计算正确的地址形式)
此时主存的地址样子
CPU访问例子(大题第三步)
电路图
首先获得访问的地址<块号、块内地址>
<页号、偏移量>
解析页号,获得最末尾的c位,【直接定位到】Cache的对应行,把前t位与当前标记位进行比较,如果相同则命中。
Cache每行结构:
Cache每行有 1+1+19+64*8 = 533 bit
特点
优点:简单,速度最快, 缺点:不够灵活,冲突率高,空间利用率低 只能放在固定的位置
课后题目:
已知主存地址,装入Cache的对应地址
已知主存地址,问对应的Cache行的标记
例如:Cache一共有8行,页面大小为1K,地址总数为16bit
100, 110, 0010010011
3bit标记号、3bit行号、10bit偏置值
前3+3bit指明了内存中对应的块号(前3需要存储在Cache中,而后3是Cache当前行的行号)
组相联映射 (分组放)
组相联映射规则:
主存在Cache中的组号 = 主存块号 % Cache总组数
N路组相联 --- Cache每个组中有N个Cache行
2路组相联:两个一组
映射公式
把Cache分为大小相同的组,每个组对应了主存的一个区域的内容。组间采用直接映射,组内采用全相联映射(i 为 主存的页号,j 为 Cache的行号、Q为Cache的组数) 相当于留下最后log2Q位二进制 主存块号末尾Log2Q位直接反映她在Cache中的位置
地址变化:
大题第二步(根据地址应声规则计算正确的地址形式)
此时主存的地址样子
CPU访问例子(大题第三步)
Cache每行结构:
Cache每行有 1+1+1+20+64*8 = 535 bit
查找Cache时就是查找标记阵列的标记项是 否符合要求
标记项组成的二维标记阵列
奇葩的题目
组相联映射还可以把最末的几位作为组号
总结
比较器个数
全相联
全相联映射下,每块可以映射到所有cache行(总共有n个cache行),因此需要设置n个比较器。
直接映射
直接映射因为每块只能映射到唯一的Cache行,因此只需设置1个比较器。
组相联
而r路组相联映射需要在对应分组中与r个Cache行进行比较,因此需设置r个比较器。
主存地址划分
全相联
直接映射
组相联
Cache的替换算法
与OS的请求分页置换算法一致 注意:每次被访问的主存块,一定会被立即调入Cache
直接映射:
冲突直接覆盖
组相联和全相联
硬件实现
替换时机
组相联
分组内满了才需要替换,需要在分组内选择替换哪一块
全相联
Cache完全满了才需要替换,需要在全局选择替换哪一块
RAND --- 随机算法
随机确定一个替换的块 完全没有考虑局部性原理,命中率低,效果不稳定
FIFO --- 先进先出算法
将最早调入的行调出
会出现Belady异常、抖动
LRU --- 最近最少使用算法
堆栈类算法,在每个cache中添加一个“counter位”;基于“局部性原理”
组相联映射下,计数值的位数与Cache组大小有关,二路时有1位,四路时有2位(log2组数)
全相联映射下,计数值的位数与Cache行数有关(log2行数)
举例
使用counter计数来模拟堆栈的实现,阴影数值越小,说明越新进入Cache
counter的值是有范围的 0 ~ 2^n-1,不会超过
若被频繁访问的主存块数量>Cache行的数量,可能抖动1,2,3,4,5,1,2,3,4,5...
LFU --- 最不经常使用算法
每行都添加一个counter位,在一段时间内,每被访问一次,counter++。换出时把counter最小的换出
没有遵循局部性
counter的大小未知
Cache的写策略
原因:Cache存储的是主存内容的副本,当Cache内容进行变更时,需要使得Cache和主存的内容保持一致
写命中
全写法/写直通法 (直写法)
把数据同时写入Cache和主存
能随时保持一致性
但增加了访存次数,降低Cache的效率
当需要进行替换时,可以不做其他操作,直接进行替换操作
优化【CPU对主存的访问次数过多】:
写缓冲 SRAM
在Cache和主存中加入一个写缓冲,CPU写数据到写缓冲中,写缓冲再自行控制将数据写入主存 缺点:若写操作频繁,写缓冲饱和而发生阻塞
写回法
脏位
CPU只对Cache进行修改
在Cache的每一行中添加一个脏位
如果要进行Cache块置换的时候,如果发现该行的脏位为 1,则需要把该Cache块写回内存
写不命中
写分配法
每次写不命中,在写回主存后,把写入过的主存块调入Cache中,设置脏位为 1
非写分配法
每次写不命中,只写入主存,不进行调块 (只有“读”未命中才调入Cache)
不遵循程序的局部性原理
通常搭配
【全非】全写法 + 非写分配法
写命中同时写回Cache和内存,写不命中只写回内存
【回写】写回法 + 写分配法
写命中只写入Cache并修改脏位,写不命中则把块调入到Cache中,并只修改Cache
多级Cache的混合搭配
CPU -> Cache -> L2 Cache
采用的是全写法 + 非写分配法(因为有写缓冲)
Cache -> L2 Cache -> DRAM
采用的是写回法 + 写分配法
离CPU越远,容量越大,速度越慢
Cache 存 L2 Cache 的复制 L2 Cache 存 DRAM 的复制
考频:超高
09*2、12、14、16、17、21、22、10大、13大、16大、20大
虚拟存储器 强化课看
考频:超高
10、13、15*2、19、20、22、11大、18大、21大
虚拟存储器对应用程序员是透明的,是操作系统使用虚拟技术创造的具有主存速度辅存容量的存储器
快表中存储的是页表项的副本; Cache中存储的是主存块的副本
用户编程使用逻辑/虚地址来进行编程,操作系统自行将其转为对应的物理/实地址
虚拟存储器的三个地址空间
页式虚拟存储
页表 DRAM
作用:找到逻辑地址对应的物理地址
虚拟地址的空间:内存 + 外存
实地址的空间:内存
页表项
主存中的页表实例:<有效位、脏位、引用位、物理页号>
有效位:装入位,表示是否已经装入内存
脏位:是否被修改过
采用【写回法】
引用位:使用位,访问位。给置换算法用的
磁盘地址/页号:有效位为 1,则存的是内存页号。有效位为0,则存的是磁盘块号
虚页号:逻辑页号
地址转化:
快表 SRAM
TLB 相联存储器,由高速缓冲器组成
快表项
<虚页号、物理页号>
作用:能够更快速的进行逻辑->物理的地址转化
利用局部性原理,如果在TLB中命中,就可以不用去内存中查询慢表了(少了一次内存访问)
采用:全相联映射/组相联映射
快表同样可以采用所有Cache的映射方式和替换算法
TLB命中了,主存一定命中
Cache命中了,主存也一定命中
给定逻辑地址,执行流程
TLB + Cache 的多级存储系统
第一步:虚拟地址到物理地址
第二步:物理地址的Cache表示形式
CPU给出虚拟地址<虚页号 + 页内地址>
OS层:
解析虚页号,查快表
若命中了直接跳到合成物理地址
若没命中,首先定位到页表寄存器,获得页表始址 + 页表大小,如果页表溢出了就报错
随后通过(页表始址 + 一级页号)访问到对应的页目录表,找到对应的二级页表
通过(二级页表表号 + 二级页号)找到对应的页表项,获得页表项中的存储的实页号
如果过程中发现了对应的页面不在内存中,则进行缺页处理程序(换出页面、把磁盘中的页【调入到内存】,更新页表)
把【虚拟地址】 ( 实页号 + 页内地址 ) 合成为【物理地址】
同时要更新TLB
在这一步的时候,页面一定在内存中了
硬件层:
解析物理地址,得出Tag、组号、块内地址
通过组号对应的Cache组,随后遍历Tag找到对应的Data,进行访问
如果遍历了所有Tag没有找到Data,那么直接去访问主存找对应的数据
如果Cache访问缺失了,则换出Cache中的一行,把对应的主存块的内容写入到Cache中,设置标记项
把数据送到CPU
也可以合起来图
重要考点
段式虚拟存储
与主存交换信息采用”段“
略
段页式虚拟存储
与主存交换信息采用”页“
略
Cache、TLB、页表的组合情况:
虚存 和 Cache
相同处
都提高了系统性能,两者都有容量、价格、速度等的梯度
都把数据分成了若干块,虚存的块更大(页面大小) ,Cache的块更小(内存块大小)
都有地址映射、替换算法、更新策略
都运用了局部性原理
不同处
Cache解决系统速度问题
虚存解决主存容量问题
Cache - 空间换时间;虚存 - 时间换空间。
Cache纯硬件实现,对所有程序员都透明
虚存对系统程序员不透明
Cache不命中对速度影响没有虚存不命中的影响那么大
Cache不命中:读内存
虚存不命中:读外存
Cache不命中时,CPU直接访问主存
虚存不命中时,只能先把硬盘的数据调入内存,再与CPU通信
END