虚拟存储器是依据程序的逻辑地址转换来的,也称线性地址空间。一般每个进程,乃至每个段都有一个,以32位为例,则每个最大可达4G。
而主存现在一般为百M。因而程序中所指的存储单元并不能都放到主存中,也便是并不是每个程序所用的存储单元,都有具体的物理的存储器单元与之对应。
但因为程序的两个局部性原理,在一个时刻,程序只在一个比较小的范围内运转。所以咱们把程序或许用到的整个存储空间分红一个个相同巨细的页(按页办理硬件上简单完成),只把其间的一些页放在主存中,而其它的页则等需求时再建,或放在辅存(磁盘)中。一同树立一个页表,对应于每一页,假如该页在主存中,则页表记载它在主存中的地址;假如不在主存中,则在页表上作不在主存的符号。
这样,当程序需求调用某个存储单元的内容时,先依据它的线性地址,算出其地点的页。查页表,看是不是在主存中?假如在,则直接存取。假如查到页表上是不在的符号,那便是一个page fault。要把主存中的某一页(LRU战略)换到磁盘上,把要拜访的那个单元地点的页调入主存,再进行存取。
就象一个估计有一万学生的校园,理论上每个学生都应有一个位子上课(一万个虚拟位子),而校园只需一千个(物理)位子。但实践上,校园也不会一万个人一同上课,只需让上课的同学有位子(在主存中),而其它同学只需留下联系方法能找到就好。为了下降办理的复杂性,咱们选用按学号分班(页)办理。每个班要么一同上课(主存),要么一同呆在睡房(磁盘)。而在校园保存一个动态表(页表)标明每个班在哪儿(物理地址)上课,或许没上课(不在主存)。现在假定咱们想按学号找一个同学,并且是女同学,只能在教室说话,呵呵。那么:
先算出来是哪个班的,查动态表,看该班是否在教室。在,直接按方位找到(hit);不在(page fault),要先找个不上课的班赶回睡房,把要找女生地点的班调到教室,再按方位找那个同学。
动态表(页表)的巨细=表项数*每个表项所需的位数。
表项数=虚拟班数=虚拟人数(虚拟地址空间)/每班人数(每页巨细)
每个表项的位数=Log(教室数)+恰当操控位数
教室数=实践能够上课的人数(物理地址空间)/每班人数(每页巨细)
虚拟地址换算:
TLB miss:
4G(32-bit)的存储空间,假如按4K分页,则可分1M页。每个页表项为4B,则一个页表巨细为4MB。因为页表太大,只能放在主存中。这样每次读内存都要读主存,大大影响读写速度。而相同依据局部性原理,整个页表在某一时刻,所用的也只是几页罢了。所以咱们把某段时刻经常用的几个页表项,即常用的虚拟页号和其对应的物理页地址,存在Cache中,即TLB。
这样,当程序需求调用某个存储单元的内容时,先依据它的线性地址,算出其地点的页。先查TLB(比较虚拟页号),假如有相同的虚拟页号,则就能够立刻知道其地点的物理地址,依据物理地址进行存取。
假如没有相同的虚拟页号,则阐明该页没有记载在TLB中,那再去查页表,按page fault中所说的进行。
TLB像咱们随身记载电话的小纸片,当要查一个电话时,咱们先看小纸片。有,咱们能够直接打电话。假如没有,咱们再回家查具体的电话号码簿(页表),再打电话。