快表、页表和cache之间的关系 |
您所在的位置:网站首页 › 高速缓存和内存的区别在哪里 › 快表、页表和cache之间的关系 |
快表、页表和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里的】
快表未命中,查慢表 将虚拟页号分为页目录号(一级页表)和页号(二级页表)先查找一级页表,找到985这个页表项,985页表项中的内容指向的页框号为11111H,那就说明二级页表是存储在11111H这个页框里面的。11111H中保存了二级页表,在这个表中查找211这个页表项所对应的页框号,进而就确定了985211H这个虚拟页号最终所对应的虚拟页框好用985211H的地址与页偏移量拼接,得到完整的物理地址 四路组相连映射的【TLB】四路组相连映射,意味着每一组有4份TLB映射 四路组相连映射中,将虚拟页号24位分为21+3两部分 通过低3位定位目标页在哪一组(一共8组) 用剩余的21位和这组中的四个快表标记比对
块表命中 这个虚拟页号【24bit】,把它拆分成两级的话,前12bit用于查一级页表,后12bit用于查二级页表 只有一级页表时,所占内存的大小为:224 有二级页表时,所占内存的大小为:212 x 212=224 二级页表其实就是把单级页表拆分为多张二级页表,存放在内存的各个位置,然后把每个二级页表的起始地址记录下来,存入一张表,这张表就是一级页表 二级页表查询的方式 先用前12bit页目录号【985H】,【页目录号】*【单个一级页表项大小】找到该页目录号所对应的页表项,这个页表项中的页框号【1111H】对应的就是二级页表存放的地址根据后12bit页号,查找二级页表【步骤2知道了二级页表的地址:1111H】,计算出后12bit所对应的页框号。这个页框号【AE866H】就是虚拟页号最终对应的实际物理页框号 PCB、页表、页表始址、MMU、TLB、Cache、页表始址寄存器字块内地址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 |