最近在看操作系统方面的书,看到了虚拟内存中的章节,当看到为了解决巨大的虚拟地址问题的二级页表问题,对于书上所宣称的节约内存消耗产生了疑问:
书上假设的是32位虚拟地址,假设页面大小为4kb,并且假设页表项大小为4B
如果采用一级页表的话,后12位作为地址偏移量,那么就会有2^20=1024*1024个页面,那么就会占用大约4MB的内存空间;
而如果采用二级页表的话,书上的例子是假设进程只需要大约12MB的内存,其最底端是4MB程序正文段,后面是4MB的数据段,顶端是4MB的堆栈段,(当数据段或堆栈段不够用的时候,就会向中间伸展)如下图:
对于这个只需12MB的程序,实际上只需要4个页表:顶级页表,0M-4M的页表(正文段·),4-8M的页表(数据段),顶端4M(堆栈段)的二级页表,每个页表大约4kb,所以只需要16KB的内存,相比4Mb大大节约不少内存。
一开始,我怎么也不理解,因为按照上面的图上所画的,一共需要1025(1024+1,1代表顶级页表)个页表,那么一共要花费1025*4KB的内存,也解释说实际上增加了内存消耗,且需要两次查表映射。
后来去网上查了一下资料,才明白,书上的意思是对于进程本身而言节约了内存,其实每个进程都有其自己的虚拟地址空间,对于32位虚拟地址来说,一级页表的确是需要4MB的内存来存储,而事实上,很少有需要4G内存的程序,很多地址其实进程是用不上的,这些地址就白白浪费。而多级页表的引进是避免把全部页表都保存到内存中去(就像一级页表那样),特别是那些程序没有用到的页表更是如此,二级页表是在进程的确需要更多内存的时候,才会分配更多的页表给当前进程,这样会更加有效率。而且每个进程都有自己独立的页表,如果每个进程都按需分配页表,相比一级页表的“全能”,总体看来,多级页表还是比较节省内存的。
————————————————
转载CSDN博主「whp404」
原文链接:https://blog.csdn.net/whp404/java/article/details/54564400