此处暂不讲解基本分页的原理。记录一个问题:在一级页表中,为什么每个进程都需要分配一个页表,且各个页表都硕大无比?
首先,还是用大家熟悉的32位地址空间,单页表项4B为例。以2^20为页号,2^12为偏移地址。因此页表项应该有2^20约100万条,而单页大小为2^12=4KB,即单页可存放1K条页表项,总共需要 2^20条 / 2^10(条/页) = 2^10 页。而单页大小为4KB,故存放页表所需要的空间就是2^10页 * 4KB/页 = 4MB。这就是大家经常看到的,一级页表每个页表所需内存过大,若进程增多(如100个进程),则整个内存仅存放页表的开支都会很大了(400MB)。
那么,为什么每个进程都需要一个自己的页表呢?回答这个问题,我们就要意识到,页表的提出是为了解决连续分配管理方式中存在的问题:碎片化(无论是内部碎片还是外部碎片)。因此页表的一个原则,就是使进程可以在逻辑上连续分配内存,通过页表的映射,对上层应用软件屏蔽掉实际内存的碎片存在。如果所有进程共享一个页表,则会面临与内存空间完全一样的分配问题,无法解决碎片问题。
第二个问题,尽管每个进程确实需要拥有自己独立的页表,但是为什么每个页表都要那么大,大到足以与每一个页框(内存中的块,页是进程中的块)?这个问题,是因为进程对内存的动态需求,也就是进程装入的时候无法确定所需内存大小。尽管在曾经的连续分配方式中,每个进程都会评估自己最大需要内存,但这样会丧失一定程度的灵活性。而页表占据整个内存大小,不仅满足了进程对内存需求的动态增长问题,还使每个进程在逻辑上都独占了内存,扩大了虚拟内存空间。利用内存页框与外存块的交换技术,可以使计算机的内存得到巨大扩增。