我试图了解多层次的页面表是如何节省内存的。根据我的理解,多层次的页面表比单层的页面表消耗更多的内存.
例如:考虑一个页大小为64 32和32位处理器的内存系统。页表中的每个条目都是4字节。
单层页表:表示页偏移量需要16位(2^16 =64 to )位。因此,rest 16位用于对页表进行索引。所以
*页表的大小=2^16(页的#)*4字节(每个页表条目的大小)= 2^18 Bytes*
多级页面表:在两级页面表的情况下,让我们使用前10位最重要的位来索引到第一级页面表。接下来的10位索引进入第二级页表,该表有页号到帧号的映射。Rest 12位表示页面偏移量。
第二级页表的大小= 2^10 (条目的#)*4字节(每个条目的大小)=4KB
所有二级页表的总大小= 2^10 (第二级页表的#)* 4KB (每个二级页表的大小)=4MB。
第一级页表的大小=2^10(条目的#)* (10/8)字节(每个条目的大小)= 1.25 KB
存储第一级和第二级页表所需的总内存=4MB+1.25KB
,所以我们需要更多的内存来存储多层次的页表.
如果是这样的话,多级页表如何节省内存空间?
发布于 2015-05-27 01:36:39
访问任何数据所需的空间为2^20 *4字节= 4MB。
在您讨论过的2级情况下,您需要第一级可分页,然后是第二级2^10页中的1页。因此,1层大小= 2^10 *4字节= 4KB 2级,我们只需要2^10页中的1页= So大小是2^10 *4字节= 4KB。
现在需要的总大小是: 4KB + 4KB = 8KB。
最后的比较是4MB和8KB。
发布于 2015-04-06 08:29:33
以下是多级页面表的主要优点:
首先,将页面表分割成页面大小的单元;然后,如果整个页面表条目(PTEs)无效,则根本不要分配页面表的页面。
Source. (第20.3条)
因此,页表所需的内存量不是由地址空间的大小决定的,而是由进程正在使用的内存量决定的。
此外,如果物理内存已满,页表条目的页本身也可以被分页--只有页面目录需要始终存在于内存中。
发布于 2020-11-16 10:49:08
要添加到Sai's answer中,这里确实有一个必须强调的想法:您不需要将整个页面表加载到主内存中--只需要达到您想要的位置的部分。这补偿了您的正确直觉,即一个多层次的页面表至少需要和一个单层页面表一样的容量(毕竟,您需要存储所有虚拟地址的映射,而不管表的样式如何)。
值得注意的是,多层分页实际上是由于想要应用上述原则而产生的(而不是相反的,即应用这个原则,因为您想使用多级分页)。单层表的条目存储在页面本身中,而在单层模型中,这些页面可以填满一大块内存;这样,您只需要基地址就可以索引表。然而,现在尝试提取您不需要的条目页:作为一个自然的结果,我们需要一种方法仍然能够引用所有的条目页,即使它们不再作为一个大块出现。因此,出现了一个顶层页表,并且我们有多层分页。
现在只需将我们取出的页面写到磁盘上,然后只检索它们供以后使用。这样,如果程序真的只需要一个最终级别的页面表条目,那么我们将整个4MB存储在磁盘条目中,除了我们实际需要的4 kB +4 kB。节省了很多内存。
https://stackoverflow.com/questions/29467510
复制相似问题