目录
废话不多说,先上简化图:
进一步,如果TLB采取全相联映射,页表采用二级页表,Cache采用二路组相联,则是下图所示:
另外,注意相关微观上的硬件:
(1)页表寄存器PTR:页号P和页表长度M比较康康是否越界,若没越界才根据页表起始地址找到对应的页号&块号(虚实地址页号替换);另外说的硬件支持介绍:
(2)界地址寄存器(限长寄存器):比较逻辑地址的值和寄存器的值判断是否越界
(3)重定位寄存器(基址寄存器):逻辑地址+寄存器的值=物理地址(下面右图所示)
1.CPU访问存储系统的整体流程
(1)提供逻辑地址
程序员交给CPU的是逻辑地址,要进行虚实地址转换才能找到该虚拟地址所对应的数据实际存放的位置。
(2)虚实地址转换
虚页号与实页号的对应关系存在页表(页表存在主存)中【页表的每个页表项纪录一个虚页号和对应的一个实页号】,比较活跃的页表项存在TLB中(TLB相当于专用于存页表项的Cache)。故转换时先查TLB,若TLB不命中,再查页表,若页表还不命中,说明该页面还未调入主存,需发出缺页中断,从辅存中调入并更新页表和TLB(切记:如果再次访问该页,通过TLB即可得到物理地址,访存一次)。——若被置换的页面已被修改(曾经修改过==)则处理缺页中断过程中还要写回外存中。
(3)访Cache-主存
得到物理地址后,需要访问Cache-主存体系以操作相应的数据。
先访问Cache,若Cache未命中,说明该块在主存中,需要先把该块调入Cache再处理,或者边调入Cache边处理(虽然CPU与Cache之间的数据交换是以字为单位、Cache与主存之间的数据交换是以Cache块为单位,但是如果Cache不命中,是把该字所在的块一次性从主存中调入Cache)。
【注意】TLB或页表命中后说明该页面在主存中。快表是单独的寄存器,页表是存在于主存。
Cache总容量=标记项容量+数据区容量(如果分为指令Cache和数据Cache,下表的“数据”就可能是指令/数据)
标记项 | 数据 |
标记项 | 数据 |
标记项 | 数据 |
标记项:(每块Cache对应一个标记项,与映射关系无关)
有效位(1位) | 标记位 | 一致性维护位 (脏位) | 替换算法位 |
必须有 地址映射 写策略则有1位 替换策略(一般无)
PS:脏位:判断数据是否被更新,若脏位为1则需写回内存;有效位:代表该Cache行信息是否有效。
组相联映射:
主存字块标记 | 组地址 | 字块内地址 |
组相联中,组号=主存块号 ÷ Cache的组数。
直接映射:
主存字块标记 | Cache行号 | 字块内地址 |
全相联映射:
主存字块标记 | 无 | 字块内地址 |
每行的TAG用于指出该行来自主存的哪一块
——即全相联劣势:tag的比较速度慢(CPU访存时需要与所有Cache行的tag进行比较)。
2.地址结构
(1)虚实地址
虚拟地址分为虚页号和页内地址;物理地址分为实页号和页内地址。
(2)Cache-主存地址映射
Cache-主存体系中,地址先分为块号和块内地址。对应不同的映射方式,主存地址的块号需要拆分成不同的字段,高位均为标记字段,需要存入Cache。
【注意】页表到TLB的映射与主存到Cache的映射方式类似。
最后,总结一波【带有TLB的CPU访问过程】
常考点:
(1)访存次数
【2015年408】“x=x+3”转换为指令“add xaddr,3”,其中xaddr是x对应的存储单元地址。
已知用页式虚存,有TLB,Cache用直写方式。则该指令至少访存(1)次。
【解析】指令过程——取数、运算&写回。取数读取xaddr可能不需要访存(直接访问Cache),而写直通法需要把数据同时写入Cache和主存。(注意:读取xaddr不涉及虚实转换)
【注意】每个Cache行都有一个标记项(与映射方式无关,映射方式影响的是标记项的位数);
回写法(先修改Cache中的数据,当Cache中的数据块要调回主存时再次写回主存)需要一个一致性维护位(标志Cache中该块是否修改过,如果有,要修改主存相应的那块【更新】)。
【变式】若题目改为Cahce初始为空,则需要访存(2)次。
(2)虚实转换地址“变化”;
(3)王道模拟题
某存储系统中主存容量是Cache容量的4096倍,Cache被分为64块,当主存地址和Cache地址采用直接映射方式时,地址映射表的大小应为多少?(假设不考虑一致性维护位)
【解析】由4096倍知道Tag为12位,即主存地址长度比Cache地址长度长12位,加上1位有效位,所以地址映射表大小为13bit × 64. (主存-Cache地址映射表(标记阵列)中的内容:映射的Cache地址(直接映射不需要因为Cache地址唯一,组相联只需要要组号)、主存标记tag(命中判断)、有效位)。
PS:Cache地址就是比主存地址少了个Tag,其他(块号&块内地址)一样。
(4)虚存大小
虚存大小≤ 内存+外存容量 同时,虚存大小 ≤ 地址位数所寻址的容量。
虚存容量由CPU的寻址范围决定。
(5)虚存&Cache 区别
虚存是【时间换空间】——解决容量问题(虚实地址转换,多次访存增加延时,降低计算机速度;使用一部分辅存);
Cache是【金钱换时间】——解决速度问题(缓和CPU与主存的速度不匹配)。
(6)TLB
TLB用高速存储器(SRAM)组成,按查找内容访问(查找速度快依赖于硬件本身,而非搜索算法)。
(7)冷静“翻译”题目
用户编程空间为32个页面即指逻辑地址高5位为虚页号;主存为16个页面即物理地址高4位为物理块号。
-----------PS:前提是十六进制转成二进制要转对,如题目给0AC5H逻辑地址,由条件分析得出逻辑地址是15位则不要多写一位。
若访问的页号【不在页面映射表中】但【没产生页号越界】则是 缺页中断;若访问的页号【超过该用户进程/程序的总页号】则是 越界中断。
(8)【段页式存储管理】
首先访问内存中的段表,然后访问内存中的页表,最后访问指令/数据所在的内存页面。(共访问内存3次)
(9)2个肯定
一个页面如果在主存中,则页表肯定是有记录的,即可把【页表】理解为在主存中所有页面的“目录”。
访问Cache若未命中,则该块肯定在主存中(因为能到这步就意味着前面访问TLB或页表有一命中),需要先把该块调入Cache再处理 或 边调入Cache边处理。
(10)描述访存过程
【2020年408】数据Cahce和指令Cache用8路组相联,初始Cache均为空。
描述CPU访问主存单元0001 0003H的指令的过程。-------主存地址=20位Tag、6位组号、6位块内偏移。
【解析】0001 0003H知组号为0号——该地址所在的主存块要被映射到指令Cache的第0组;
因为Cache初始为空,所以Cache行的有效位均为0,即初始访问缺失。所以
(1)要从将主存块调入Cache中第0组的任意一行,
(2)将Tag(主存地址的高20位00010H)填入该行标记字段,
(3)设置有效位,修改LRU位,
(4)根据块内地址000011B,取出该块内对应内容。
【变式】若初始Cache不为空,且组号为0号的地址阵列(即Tag)为00010H,则显然命中;
而若第二组的地址阵列内容为
组内块号 | 地址标记阵列(Tag) |
0 | 00100(B) |
1 | 01011(B) |
若上表第一个为最近最少使用的Cache,且根据LRU替换算法置换Cache,则替换该Cache,并修改Tag为新的Tag。
注意:主存地址中并没有【组内块号】字段,组相联映射是组间采用【直接映射】——主存中的每一块只能转入Cache的唯一位置,而组内采用【全相联映射】——与组内的所有Cache的Tag进行一一匹配。
(11)写命中&写不命中
Cache写命中:
因为CPU是通过内存单元地址对单元进行读写操作的,当CPU获得一个内存单元地址,就开始对内存单元进行操作了,然而,在实际操作之前,因为在Cache高速缓存的计算机中,CPU会首先检查CPU所要操作的内存单元的内容有没有调入Cache中,如果已经调入Cache中,就称这种现象为“Cache写命中”;
如果发现内存单元中的内容没有调入Cache中,就称这种现象为“Cache写不命中”。
cache一致性问题:
因为cache中的内容是主存块副本,当对cache的内容进行更新时,就存在cache和主存如何保持一致性问题。
cache操作:两种情况
1.写命中 write hit
:要写的单元已经在cache当中
两种处理方式
(1).write through(直写)
同时写cache和主存单元
由于CPU写数据到cache很快,但是cache写到DRAM很慢,为了解决这个问题所以我们加入了写缓冲(write buffer)
(2).write back( 回写)
即写cache时不管主存,直接在cache上面改就行,这个时候锁死主存那块数据(我想到了我们打开excel文件时,再修改桌面名字时发现一致性问题),
我们加入dirty-bit脏位:即判断cache里面内容修改没,没修改就不改主存
2.写不命中(write Miss)
:要写的单元不在cache中
有两种处理方式
(1).write allocate(写分配)
将主存装入Cache,然后更新相应单元
(2).no write allocate(非写分配)
直接写主存单元,不装入到cache, 与第一种相比没有利用到空间局部性,因为没有装入到cache中。