页式、段式、段页式存储访存次数
页式/段式 存储:(2次)
- 第一次,访问内存中的页表,利用逻辑地址中的页号查找到物理块号,与逻辑地址中的页内偏移拼接形成物理地址;
- 第二次:得到物理地址后,再一次访问内存,存取指令或者数据。
段页式 存储:(3次)
-
第一次:访问内存中的段表,查到页表的起始地址
-
第二次:访问内存中的页表,找到页帧号,形成物理地址
-
第三次:得到物理地址后,再一次访问内存,存取指令或者数据
多级页表
-
若页表划分为 \(N\) 级,则需要访问内存 \(N+1\) 次。
-
若有快表,在快表命中时,只需访存 \(1\) 次即可。
引入快表后:
- TLB 命中:可直接得到物理块号,与页内偏移拼接成物理地址后访问内存,进行指令或者数据的存取。(一次访存)
- TLB 不命中:
- 第一次,需去内存中访问页表,形成物理地址
- 第二次,根据物理地址,访问内存进行指令或者数据的存取。(需要访问两次内存)
注:
- 读出页表项后,应将其存入快表,以便下次使用,快表已满则需用算法置换;
- 有些处理机是先查快表,快表不命中再去查内存,有些则是快表和内存同时查找,快表命中就终止内存查找。
- 在内存中查找页表时,对比页表项的状态位,看该页是否调入了内存,若没有调入内存则产生一个缺页中断,请求外存把该页调入内存。
补充:
- 内核区保存的信息有:【页表、PCB】(每一个进程低地址 / 高地址部分肯定是映射到同一片【内核空间】)
- \(PCB\) 和 页表 都是存放在内存里面的【系统区】。
- 【页表始址】保存在 \(PCB\) 中
- 【页表始址】指明了这个 \(PCB\) 所对应的进程他的页表从哪儿开始存放
- 【页表始址寄存器】包含在 \(MMU\)(Memory Management Unit 的缩写)【内存管理单元】
- 【MMU】 是一个硬件,被集成在 【CPU】中
- 【TLB】本质上是一个 \(SRAM\) 芯片,当然也可以是其他的高速的存储芯片去实现 \(TLB\)
- 【TLB】他也是用于内存地址的映射,将 \(VA\) 转为 \(PA\),所以 \(TLB\) 也是【MMU】里面的一个硬件部件,推得 \(TLB\) 是 \(CPU\) 里面的部件
- 【TLB】里面保存的是当前进程的【页表项】的【副本数据】
- 【Cache】里面保存的是【内存块】的【副本数据】(注意:页表项的数据也是存放在内存当中的,但是页表项的副本数据单独存放在 \(TLB\) 中)
- 当一个进程他被【操作系统】调度,在这个进程将要开始运行之前,\(CPU\) 会把接下即将要运行的这个进程的【页表起始地址】这个信息给复制到 \(MMU\) 里面的【页表始址寄存器】当中。每换一个进程,那么【页表始址寄存器】的值就会改变(也就相当于切换了一套【页表】),这个页表始址值都是从 \(PCB\) 里面来的,每个进程在被调度的时候,肯定会查他的 \(PCB\)。
- 当切换到一个【新进程】之后,以前 \(TLB\) 里面包含的那些页表项的副本数据将会【失效】,【TLB】里面保存的是当前进程的【页表项】的【副本数据】
- \(Cache\) 块的副本数据【不失效】,因为新旧进程可能共享同一片物理地址