请升级 HydroOJ 到 4.19.0 以上版本以正常使用此插件功能。
#pw1013. 光与影的对白
光与影的对白
Description
在现代计算机中,程序使用的是虚拟地址,CPU访问内存时需要将虚拟地址转换为物理地址,整个过程涉及快表(TLB)、页表和缓存(Cache)三种结构。快表是CPU内部用于加速虚拟页号到物理页号转换的小容量缓存,页表记录虚拟页号与物理页号的映射关系,缓存用于存储最近访问的物理内存数据块以提高访问速度。现模拟CPU对虚拟地址的访问过程,统计每次访问中快表命中与否、页表是否命中(或缺页)、缓存是否命中。
访存过程详细说明
-
虚拟地址拆分
- 从32位虚拟地址中提取:
- 高20位作为虚拟页号(VPN,Virtual Page Number)。
- 低12位作为页内偏移(Offset),表示页内具体地址。
- 从32位虚拟地址中提取:
-
查询快表(TLB)
- 查找快表中是否存在该虚拟页号对应的物理页号(PPN,Physical Page Number)。
- 如果找到(TLB命中):
- 直接获得对应的物理页号,进入步骤4。
- 如果未找到(TLB未命中):
- 进入步骤3查询页表。
-
查询页表
- 在页表中查找该虚拟页号对应的物理页号。
- 如果页表中存在映射(页表命中):
- 将该映射加入快表。
- 若快表已满,则淘汰最近最少使用(LRU)的条目。
- 进入步骤4。
- 如果页表中无对应映射(缺页,页表未命中):
- 访问失败,结束本次访问。
- 输出相应状态。
-
计算物理地址
- 由物理页号左移12位加上页内偏移,得到完整物理地址。
-
查询缓存(Cache)
- 计算缓存行号(例如使用物理地址的某些位对缓存行数取模)。
- 检查该缓存行存储的数据标签是否与物理地址标签匹配。
- 如果匹配(缓存命中):
- 访问缓存成功。
- 如果不匹配(缓存未命中):
- 需要从物理内存加载该数据块。
- 更新缓存行中的标签和有效位。
-
输出访问状态
- 输出本次访问的:
- 快表是否命中(TLB_HIT / TLB_MISS)。
- 页表是否命中或缺页(PAGE_HIT / PAGE_MISS)。
- 缓存是否命中(CACHE_HIT / CACHE_MISS)。
- 注意:如果发生缺页(PAGE_MISS),缓存状态统一输出CACHE_MISS。
- 输出本次访问的:
Format
Input
第一行包含四个整数:N M C Q
N— 物理页数(1 ≤ N ≤ 2^16)M— 快表容量(1 ≤ M ≤ 2^14)C— 缓存行数(1 ≤ C ≤ 2^14)Q— 访问次数(1 ≤ Q ≤ 10^5)
接下来 N 行,第 i 行包含一个整数 P_i(-1 ≤ P_i < 2^20),表示物理页 i 映射的虚拟页号,若为 -1 表示无映射。
接下来 Q 行,每行一个无符号 32 位整数,以十进制的形式给出,表示访问的虚拟地址。
Output
对于每次访问,输出一行,包含三个用空格分隔的状态:
TLB_HIT/MISS PAGE_HIT/MISS CACHE_HIT/MISS 具体含义如下:
-
TLB(快表)状态
TLB_HIT表示快表中找到了该虚拟页号对应的物理页号。TLB_MISS表示快表中未找到该虚拟页号映射。
-
页表状态
PAGE_HIT表示页表中存在对应的物理页号。PAGE_MISS表示页表中不存在对应的物理页号,发生缺页异常(访问失败,此时缓存状态统一为CACHE_MISS)。
-
缓存状态
CACHE_HIT表示缓存中存在对应物理地址的数据块。CACHE_MISS表示缓存中没有对应数据块,需要从物理内存加载并更新缓存。- 当页表状态为
PAGE_MISS时,缓存状态固定输出CACHE_MISS。
Samples
4 2 4 5
0
1
-1
3
4096
8192
12288
4096
61440
TLB_MISS PAGE_HIT CACHE_MISS
TLB_MISS PAGE_HIT CACHE_MISS
TLB_MISS PAGE_MISS CACHE_MISS
TLB_HIT PAGE_HIT CACHE_HIT
TLB_MISS PAGE_HIT CACHE_MISS