技术来源
- 来源1:来源于服务器中虚拟化feature的实现,不同的程序需要共享一片硬件资源,包括计算资源与存储资源;如何有效且安全的共享存储器就是关键。
- 来源2:消除有限的主存容量对大的程序的限制。远古时代,大的程序需要程序猿手动分块,每块大小不能超过主存容量,并且保证后看的块不会用到之前的块的数据。
最终,主存就相当于是磁盘的“cache”了,并很好的适应了近些年云计算的需求。
一些概念
- 虚拟地址(VA):CPU发出的地址,用于访问抽象出来的虚拟寄存器的地址;
- 物理地址(PA):经过转换后的实际地址,会真正用来访问cache/ddr和磁盘的地址;
- 页(page):可以理解成存储块,主存与磁盘/闪存进行数据搬运的最小单位;
- 页表:用于将CPU的虚拟地址到物理地址的查找表,每个程序(进程)有专有的页表,存于主存中;
- 主存:目前指DRAM阵列,包括DDR和HBM,内部存放的信息包括页表与页;
- TLB:主存中页表的缓存,加速VA到PA的转换,并降低TLB缺失代价;
- 共享内存:每个进程的页表中的页表项对应到主存中的同一个物理页面,即内存共享;
访存流程
这里需要确认一下,这里有两条路:
- 页表的更新
- 数据的更新
有几个确定结论:
- 如果主存中的页表缺失,那TLB一定是缺失的,因为TLB只是一个页表的cache;
- 如果主存中的页表缺失,那么该页在主存中一定也是没有的,
- 是否主存中的页表更新后,主存中的页也会立即进行更新?
多级页表
问题:如果一个页大小为4KB,虚拟地址空间为4GB,那么一个进程产生的页表项为1M,大量进程会使得主存被页表占用。
- 对于一级页表,220为1M,每个页表项中,物理页号再为20bit,一个程序的页表大小在20Mb
- 对于两级页表,相当于把虚拟页号再细分,一个程序的页表大小约等于(210+210)*20=40Kb
- 但是这样带来的代价直接代价是VA到PA地址转换变慢。
- 在一级页表中,读取内存中一页内容需要2次访问内存,第一次是访问页表项,第二次是访问要读取的一页数据。但在二级页表中,就需要3次访问内存了,第一次访问页目录项,第二次访问页表项,第三次访问要读取的一页数据。访存次数的增加也就意味着访问数据所花费的总时间增加。