首先虚拟内存的引入是为了解决物理内存不足的情况,可以理解是更为灵活地使用内存,提高程序运行效率,那么话不多说,直接进入正题。
虚拟存储器
虚拟储存器做什么的
首先,我们需要知道虚拟储存器干了一个什么事。
先要知道的是虚拟存储器的内存是远大与主存的,我们想放但是放不下的东西以为放在了主存,其实是放在了虚拟存储器中。计算机只把常用的活跃的程序段和数据存在主存中。
而其他的放在虚拟存储器中在执行指令的时候,会产生一个虚拟地址,一般叫逻辑地址,我们可以通过逻辑地址在页表中找到对应的物理地址,这个地址是可以用来访问主存的。
怎么放
从磁盘中得到的程序会被分为许多页(其实我本人更喜欢理解成块,因为更形象一些,不过只是叫法而已),并且标明页内偏移量和页号,这里还是很好理解的,这里我们还没有放入内存,还是在虚拟存储器中,我们为了定位一个指令,也必须要声明这两个东西吧。
然后将需要的页和活跃的页装入主存,那么我们就要知道它被放入了主存的哪一个页框中,因此这样我们就引入了页表,页表也就是将虚拟地址转化为逻辑地址的东西,里面存了每个页对应的页框号以及物理地址,那么我们就可以通过页表找到物理地址啦,
物理地址=页号对应的页框号*页大小+页内偏移量
怎么更快放
页表是存储在主存中的,我们每次如果都需要通过主存去转化虚拟地址和物理地址那么效率就太慢 了,因此这里就引入了快表(TLB),我喜欢把这个东西类比Cache,它存了页表中常被用的页表项,CPU寻址时会先在TLB中寻找,查不到才去内存中找,并且页表满后未命中也要通过替换算法替换出页表项
注意
页表中的存放是顺序存储,即从页号0 顺序记录到页号n,但是在主存中页表的存放是非顺序的
那我们现在来看个很经典很经典的题
第一问
虚拟地址16MB=B => 24位
逻辑地址和物理地址页面大小相同
所以虚页大小为4KB=B =>页内偏移量占12位
因此虚拟地址组成如下:
物理地址空间大小 1MB=B => 20位
页面大小同样为B
所以物理地址组成为:
高八位为页框号
第二问
Cache采用直接映射
块大小32B=B 所以块内偏移为5位
行 所以块号位3位
根据主存大小得到一共20位
因此访问Cache时的物理地址构成为:
第三问
虚拟地址:00160H
化为二进制:0000 0000 0001 1100 0110 0000
根据虚拟地址的划分:
高12位为页号,此处页号为1,在表中查找虚页号1,有效位为1且对应页框号4,因此在主存中
将虚拟地址转化为物理地址,首先我们看物理地址组成:
因为虚拟地址和物理地址页内偏移都相同,因此将虚拟地址的高12为换位8位页框号就行了,对应物理地址04C60H
访问Cache时,找到中间对应的3位行号,行号为3,在表中查找行号为3时对应标记为105,该地址中标记位为高12位,明显不为105,因此Cache未命中
第四问
四路相联TLB,有八个页表项
那么就有 8/4=2个组,占用1位
虚拟地址024BACH
化为二进制:0000 0010 0100 1011 1010 1100
这里我们回顾一下,一个页是4KB=B
那么低12位就是页内偏移量
组号占1位
那么标记位为剩下11位
标记位=(012)H,且在第一组
那么查表找到第一组,在第一组有标记为012的页,那么该虚拟地址所在页在主存中