Operating system 多级页表实际上如何节省空间

Operating system 多级页表实际上如何节省空间,operating-system,virtual-memory,page-tables,Operating System,Virtual Memory,Page Tables,我一直在尝试研究多层页表为什么能节省空间,我想我对页表本身的工作原理有点困惑。我从中发现了以下内容: 页面表每页需要一个条目。假设有4GB(2^32字节)的虚拟和物理地址空间以及4kB(2^12字节)的页面大小,我们可以看到2^32字节的地址空间必须拆分为2^20个页面 据我所知,每个流程都有自己的页面表。这是否意味着每个进程都有4GB的虚拟地址空间?虚拟地址空间如此巨大有什么意义?为什么不根据需要分配虚拟页面?是不是因为操作系统希望所有可能的地址都能映射到虚拟页面?为什么不阻止程序取消引用任何

我一直在尝试研究多层页表为什么能节省空间,我想我对页表本身的工作原理有点困惑。我从中发现了以下内容:

页面表每页需要一个条目。假设有4GB(2^32字节)的虚拟和物理地址空间以及4kB(2^12字节)的页面大小,我们可以看到2^32字节的地址空间必须拆分为2^20个页面

据我所知,每个流程都有自己的页面表。这是否意味着每个进程都有4GB的虚拟地址空间?虚拟地址空间如此巨大有什么意义?为什么不根据需要分配虚拟页面?是不是因为操作系统希望所有可能的地址都能映射到虚拟页面?为什么不阻止程序取消引用任何不是页表有效索引的虚拟页码

我曾读到,多级页表的优点之一是,它不为未使用的虚拟页提供页表条目,从而节省了空间。参见卡内基梅隆大学的以下内容:


但是为什么不只是一个具有连续条目的单级页表呢?为什么流程需要PTE 1、2,然后跳到8?为什么允许这样?即使如此,为什么所有未使用的跟踪PTE都存在?为什么不缩短页表?

考虑一个具有32位逻辑地址空间的系统。如果 在这样的系统中,页面大小为4KB(2^12),那么一个页面表可能包含超过 100万条(2^20=2^32/2^12)。假设每个条目由4个字节组成, 对于页表,每个进程可能需要多达4 MB的物理地址空间 独自一人

显然,我们不希望在中连续分配页表 主存储器。这个问题的一个简单解决方案是划分页表 切成小块。我们可以通过几种方式完成这一分工。 一种方法是使用两级分页算法,其中页表 它本身也被分页。例如,再次考虑系统 32位逻辑地址空间和4KB的页面大小。逻辑地址是 分为由20位组成的页码和由20位组成的页偏移量 12位的。因为我们对页表进行分页,所以页码被进一步划分 转换为10位页码和10位页偏移量。

--西尔伯沙茨A.,加尔文p.B

因此,对于上面提出的情况,我们将使用2^10*4B=4KB作为外部页面(p1),而仅使用N*2^10*4B=N*4KB的内部页面表,其中N是进程所需的页面数,总的来说小于非级别页面表(4MB)所需的空间


您还应该注意,该进程只占用所需的页数和内存,而最大虚拟地址空间决定了给定系统配置(32/64位地址空间)的进程的最大可寻址内存和占用内存。

也许您应该从阅读开始。谢谢您的建议,我已经读过了。我想让我困惑的关键是为什么每个进程都需要如此庞大的页面表。为什么他们不能想象有一个巨大的虚拟地址空间,而页面表只能包含进程当前使用的虚拟页面的映射?我猜你也会对幻灯片中“间隙”和“1023未分配页面”之间的差异感到困惑,那么“节省空间”并不意味着“最小化虚拟地址空间。“这意味着节省页表本身占用的空间,这样它就不需要分配整个连续的PTE数组,而在分配从0到4GB的每一页时,非叶节点会占用更多的空间。如果它不能跳过2-7的间隙,它将不得不为每个分配1024个PTE,从而导致内存使用量增加+(6*1024*8)字节。虚拟地址空间的意义在于启用分页,即创建一个透明的“幻觉”,即可用内存比实际存在的内存还要多。这支持按需文件映射,操作系统内核在请求时将文件加载到内存中,在系统需要内存执行更重要的任务时丢弃和/或刷新文件到磁盘。这是一个稀疏数组,其中大部分从未写入/始终为0,但我们可以依赖MMU并分配大量虚拟内存空间,而不是软件驱动的密集编码等。