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

您所在的位置:网站首页 高速缓存和内存的区别在哪里 快表、页表和cache之间的关系

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

2024-07-05 00:03| 来源: 网络整理| 查看: 265

快表、页表和cache之间的关系 进程与内存的关系图偏移量的含义全相联映射的TLB命中【快表是集成在CPU里的】全相联映射TLB未命中【二级页表】四路组相连映射的【TLB】23年复习引入部分单级页表【一个进程一张页表】二级页表PCB、页表、页表始址、MMU、TLB、Cache、页表始址寄存器Cache部分全相联映射直接映射组相联映射 页框 and 主存块 的关系

进程与内存的关系图

在这里插入图片描述

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

任何一个进程的虚拟地址空间都是相互独立的。 例如一个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未命中【二级页表】

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

快表未命中,查慢表

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

在这里插入图片描述

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

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

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

23年复习 引入部分

在这里插入图片描述

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

在这里插入图片描述

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

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

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

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

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

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

二级页表查询的方式

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

在这里插入图片描述

在这里插入图片描述

内核区保存的信息有:【页表、PCB】|(每一个进程低地址or高地址部分肯定是映射到同一片【内核空间】)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块的副本数据【不失效】,因为新旧进程可能共享同一片物理地址 Cache部分 问题:Cache块的大小和主存页框的大小【是否是一定】是一致的 答:不一定,通常Cache块的大小会比主存页框的大小更小一些 当然在408考试当中,【主存块】和【Cache块的大小】是相同的 但是【页框(页)的大小】和【Cache块的大小】是不同的注意: 在有的os老师教材当中,直接认为主存块= 页框,408中不是这样

在这里插入图片描述

全相联映射

在这里插入图片描述

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

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

直接映射

在这里插入图片描述

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

直接映射如何找到目标Cache

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

在这里插入图片描述

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

页框 and 主存块 的关系

在这里插入图片描述

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

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

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

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

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

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

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

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3