快表、页表和cache之间的关系

进程与内存的关系图

在这里插入图片描述

进程会被拆分为一个个页面,而这些页面会被放入内存的页框中

任何一个进程的虚拟地址空间都是相互独立的。
例如一个36位的操作系统,每个进程的虚拟地址空间都是0~236

当电脑在执行进程里面的各个指令的时候,PC指向的是这个进程的虚拟地址空间,而不是物理地址空间
所以CPU在执行下一条指令的时候,PC值也要先转换为物理地址,才能找到下一条指令在内存中的位置
【PC值永远指向当前运行的进程的虚拟地址空间

问题:如果进程发生中断,我要执行的是OS内核的代码,(而PC永远指向的是当前运行进程的虚拟地址空间)这时候该怎么办?
每一个进程他除了拥有自己的一些数据之外,还会把OS内核相关的一些指令and数据映射到虚拟地址空间的低地址or高地址部分
相当于页面共享

在这里插入图片描述

在32位操作系统中,一个地址对应32位2进制数,则能寻址到4GB(232)的地址。
而在linux内存管理中,内存以页为单位进行管理,一般情况下每页4KB大小,
4GB内存就有个4GB/4KB=220页。
所以可将一个32位的地址分为20位+12位。
前20位可以确定出地址在页中的哪一页,剩下的12位就可以确定出在这一页中的哪个位置
反过来,若是知道了页内为12位,那每页大小就肯定为212=4KB了。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

进程的页表是存放在内存里面的
CPU要访问一个VA,要把VA—>PA。
最简单的方法,就是CPU根据虚拟页号去查询内存中的页表【我们的CPU当中会记录当前正在运行的这个进程的页表的起始地址,然后结合每个页表项的大小 x 页号,就可以找到这个页号所对应的页表项】,找到这个表项,从而检索这个页表在内存中的页框号,
然后把页框号和页内偏移量进行拼接,就得到了最终的PA

CPU访问内存的速度是很的,这样就会拖累CPU的执行效率
解决办法:
CPU中有一个部件MMU,MMU里面会有一个很快的芯片SRAM,这个芯片就是用来存储页表的副本数据,把他称为快表(TLB)
当CPU访问了一个页表项之后,他会把最近访问过得这个页表项的数据复制一份到快表当中,
这样的话,如果下次他访问的还是同一个虚拟地址,CPU就可以直接从TLB中找到他所有访问页表项的副本数据。这样就可以提升地址转换的效率

在这里插入图片描述

偏移量的含义

在这里插入图片描述
在这里插入图片描述

首先对进程进行分页,将分好的页以页为单位,存放入内存中。通过页表建立进程的页号与内存中页面实际位置的映射关系

全相联映射的TLB命中【快表是集成在CPU里的】

在这里插入图片描述

全相联映射TLB未命中【二级页表】

在这里插入图片描述
在这里插入图片描述

快表未命中,查慢表

  1. 将虚拟页号分为页目录号(一级页表)和页号(二级页表)
  2. 先查找一级页表,找到985这个页表项,985页表项中的内容指向的页框号为11111H,那就说明二级页表是存储在11111H这个页框里面的。
  3. 11111H中保存了二级页表,在这个表中查找211这个页表项所对应的页框号,进而就确定了985211H这个虚拟页号最终所对应的虚拟页框好
  4. 用985211H的地址与页偏移量拼接,得到完整的物理地址

四路组相连映射的【TLB】

在这里插入图片描述

四路组相连映射,意味着每一组有4份TLB映射
四路组相连映射中,将虚拟页号24位分为21+3两部分
通过低3位定位目标页在哪一组(一共8组)
用剩余的21位和这组中的四个快表标记比对

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


23年复习

引入部分

在这里插入图片描述

  1. 每个进程的虚拟地址空间都是独立的
  2. 但是每个进程的【低】地址部分或者【高】地址部分肯定是映射到同一片【内核空间】
  3. 所以说,两个进程,虽然说他们的虚拟空间各自独立,但是他们两个的【内核区】在物理上对应的是同一块数据
  4. 内核区保存的信息有:【页表、PCB】

在这里插入图片描述

单级页表【一个进程一张页表】

块表命中
在这里插入图片描述
在这里插入图片描述

  1. CPU当中会记录当前进程的这个页表起始项地址,然后再结合每个也页表项的大小,用页表项的大小【乘以】页号,就可以找到某个页号所对应的页表项。
  2. 这些页表项就像数组一样是顺序存储的,
  3. 这个页表起始项地址会被记录在【进程PCB当中】,每个进程有一个自己的PCB(进程控制块)这样当CPU在上这个进程的时候,就知道这个进程的页表对应的内存中的地址在哪
  4. 单级页表的弊端:
    页表项在物理内存中是需要【连续】存储的。单级页表会使得一张页表太大。解决办法:设置多级页表

二级页表

在这里插入图片描述在这里插入图片描述

这个虚拟页号【24bit】,把它拆分成两级的话,前12bit用于查一级页表,后12bit用于查二级页表

只有一级页表时,所占内存的大小为:224
有二级页表时,所占内存的大小为:212 x 212=224
二级页表其实就是把单级页表拆分为多张二级页表,存放在内存的各个位置,然后把每个二级页表的起始地址记录下来,存入一张表,这张表就是一级页表
在这里插入图片描述

二级页表查询的方式

  1. 先用前12bit页目录号【985H】,【页目录号】*【单个一级页表项大小】找到该页目录号所对应的页表项,
  2. 这个页表项中的页框号【1111H】对应的就是二级页表存放的地址
  3. 根据后12bit页号,查找二级页表【步骤2知道了二级页表的地址:1111H】,计算出后12bit所对应的页框号。
  4. 这个页框号【AE866H】就是虚拟页号最终对应的实际物理页框号

PCB、页表、页表始址、MMU、TLB、Cache、页表始址寄存器

在这里插入图片描述

在这里插入图片描述

  1. 内核区保存的信息有:【页表、PCB】|(每一个进程低地址or高地址部分肯定是映射到同一片【内核空间】)
  2. PCB和页表都是存放在内存里面的【系统区】。
  3. 【页表始址】保存在PCB当中
  4. 【页表始址】指明了这个PCB所对应的进程他的页表从哪儿开始存放
  5. 【页表始址寄存器】包含在MMU(Memory Management Unit的缩写)【内存管理单元】
  6. MMU是一个硬件,被集成在CPU里面的
  7. 【TLB】本质上是一个SRAM芯片,当然也可以是其他的高速的存储芯片去实现TLB
  8. 【TLB】他也是用于内存地址的映射,将VA转为PA,所以TLB也是【MMU】里面的一个硬件部件,推得TLB是CPU里面的部件
  9. 【TLB】里面保存的是当前进程的【页表项】的【副本数据】
  10. 【Cache】里面保存的是【内存块】的【副本数据】(注意:页表项的数据也是存放在内存当中的,但是页表项的副本数据单独存放在TLB中)
  11. 当一个进程他被【操作系统】调度,在这个进程将要开始运行之前,CPU会把接下即将要运行的这个进程的【页表起始地址】这个信息给复制到MMU里面的【页表始址寄存器】当中。每换一个进程,那么【页表始址寄存器】的值就会改变(也就相当于切换了一套【页表】),这个页表始址值都是从PCB里面来的,每个进程在被调度的时候,肯定会查他的PCB。
  12. 当切换到一个【新进程】之后,以前TLB里面包含的那些页表项的副本数据将会【失效】,【TLB】里面保存的是当前进程的【页表项】的【副本数据】
    Cache块的副本数据【不失效】,因为新旧进程可能共享同一片物理地址

Cache部分

  1. 问题:Cache块的大小和主存页框的大小【是否是一定】是一致的
    答:不一定,通常Cache块的大小会比主存页框的大小更小一些
    当然在408考试当中,【主存块】和【Cache块的大小】是相同的
    但是【页框(页)的大小】和【Cache块的大小】是不同的
  2. 注意: 在有的os老师教材当中,直接认为主存块= 页框,408中不是这样

在这里插入图片描述

全相联映射

在这里插入图片描述

字块内地址6bit,表示一个Cache块的大小只有26个字节,字块内地址部分的值表示的是要取的数据的具体的地址【这个块里面保存着64B的数据,但是目标数据只取其中的一个数据】
用蓝紫的一个条形表示内存的64B的一个副本
这64B当中,我们要取出哪个字节的数据,需要根据物理地址的末尾6个bit的字块内地址来进行确定,字块内地址确定了我们此次要访问的是64B中的哪一个字节

由于CPU是按照字节寻址,所以他的一个物理地址就会指明某一个字节

直接映射

在这里插入图片描述

行号:用于确定Cache在哪一行。
根据Cache的总行数可以推出行号需要占几个bit

直接映射如何找到目标Cache

  1. 现通过行号,找到Cache的位置
  2. 用物理地址的前22bit与Cache标记对比。若匹配且有效位为1,则命中
  3. 通过字块内地址,在这个Cache块中找到目标数据

组相联映射

在这里插入图片描述

由图像得出:每一组当中由两个Cache行,也就是2路组相联映射

页框 and 主存块 的关系

在这里插入图片描述

  1. 把主存分为一个个页框,是为了要完成虚拟地址VA==>物理地址PA的过程

  2. Cache是以主存块为单位进行存储的,而不是按照页框存储
    主存块 < 页框
    主存块=Cache

  3. 有了PA,在通过PA在Cache中找副本数据的时候,要把他按照【主存块】来区分

  4. 为什么不将二者统一呢
    他俩的力度不一样,你的页框或者页面在存到磁盘的时候方不方便
    如果每个页框他是64B【实际一个页框大小是1KB,Cache大小才是64B】,那就意味着,你每次读写磁盘是以64B为单位读取的。
    但是磁盘的读写是以磁盘块为单位的,一个磁盘块通常是1KB或者4KB,所以页框如果设置的太小,那么在你页面置换的时候,这个读写磁盘时,跟磁盘那边没办法统一

  5. 页框为什么设置的大呢?
    因为磁盘这种块设备的读写,在做页面置换的时候会更方便一些

  6. 为什么主存和Cache间进行数据交换的时候,要以更小的块【64B】为单位呢?
    因为如果假设1个主存块的大小是4KB,基于局部性原理,你很有可能只会访问的十几个字节的数据,而你把一个4KB的主存块全部调入Cache块中,就有点浪费了。Cache这边要把这个块变得比较小,是因为局部性原理,保证效率

总之:页框和页面的大小设置,是因为磁盘的读写是以磁盘块为单位进行置换的,所以进行页面置换的时候更加方便,因此页框页面得大小通常会大一些

而内存和Cache之间的数据交换,我们以更小的单位,这样可以保证Cache的效率会更高一些

  • 67
    点赞
  • 346
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sparky*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值