是啥让一个指向页表条目的指针数组比拥有一个页表条目数组更好?
Posted
技术标签:
【中文标题】是啥让一个指向页表条目的指针数组比拥有一个页表条目数组更好?【英文标题】:What makes having an array of pointers to page table entries better than having an array of page table entries?是什么让一个指向页表条目的指针数组比拥有一个页表条目数组更好? 【发布时间】:2021-01-07 23:05:00 【问题描述】:在this lecture 中,讨论了页表的一些极端实现以及一些合理的实现。
一种极端情况是分配一个平面数组,将每个可能的虚拟地址映射到一个物理地址。
在19:19
(给定链接将从该处开始)的那一刻,讲师说他正在谈论指向 PTE 的平面指针数组。然后提到他本可以做一些更愚蠢的事情,那就是使用一组实际的页表条目。
为什么拥有一个指向 PTE 的指针数组比拥有一个实际的 PTE 数组更好?
他说的是32位系统,地址是4字节,但是PTE也是4字节。
指针数组不是更浪费吗,因为它会占用双倍的空间(4 个字节用于指针,4 个字节用于 PTE)?
另外,我认为分配大量分布在物理内存中的 PTE 会导致碎片化并且难以管理,而不是只创建一个 PTE 数组,这将是一块内存,不会需要大量的管理。
为什么有一个指针数组会更好?
【问题讨论】:
【参考方案1】:如果您有许多每个都是 4 GiB 的虚拟地址空间;你可能会发现:
一大片区域(例如 1 GiB)用于内核,并且需要在所有虚拟地址空间中都相同。因为这在所有的虚拟地址空间都是一样的,所以这个区域的任何修改都需要同时修改每一个虚拟地址空间。
由于其他原因 - 内存映射文件、共享库、共享内存、由“fork()
”引起的“写入时复制”区域等,各种区域将被 2 个或更多虚拟地址空间共享。
某些区域在相同的虚拟地址空间中是相同的(例如,引用相同的“全零只读物理页”来实现“写时分配”策略)
大量空间将完全未使用(可能平均每个虚拟地址空间 2 GiB)
适用于在多个地方使用的任何东西; “指向 PTE 的指针”将为您提供一个 PTE,无论页面使用了多少地方,都可以对其进行修改。
举个例子;假设您有一个由 40 个不同进程共享的“C 标准库”(并包含在 40 个不同的虚拟地址空间中),但该库的部分代码仍在磁盘上,并且这些部分的 PTE/s 显示“不存在”。当任何进程需要共享库的该部分时,您会遇到页面错误(因为它还不存在)并且操作系统必须从磁盘获取页面。在这种情况下,“指向 PTE 的指针”意味着操作系统可以更改一个 PTE(从“不存在”到“存在”)并且不需要计算需要更新多少个 PTE,然后为 40 个不同的 PTE 更新 40 个不同的 PTE虚拟地址空间/进程。
指针数组不是更浪费,因为它会占用双倍的空间(4 个字节用于指针,4 个字节用于 PTE)?
指向 PTE 的指针数组会浪费更多空间,但很难说有多少空间(它不会是“双倍”,因为大量 PTE 会被多次使用,并且可能会增加 50% 以上的空间) .相反,PTE 数组会浪费更多 CPU 时间(在内核代码中试图管理所有内容),并且(如果您考虑内核使用自己的额外数据/内存来确定哪些页面在哪里共享)实际上可能会花费更多内存。
不过……
它们都比较糟糕;我希望讲师准备引入多级分页(其中“每页一个指向 PTE 的指针”被替换为“一个指向 PTE 组的指针”),这是大多数真正的 CPU 使用的。
【讨论】:
感谢您的回答!是的,他实际上讨论了 PTE 的链表,然后介绍了多级分页。【参考方案2】:遍历页表以查找翻译时会产生开销。时不时会发表一篇新论文,解释他们的实施如何优越。有人建议hashing the page tables。建议大家不要想太多,了解走页表的原理,一个简单的实现就可以掌握了。
【讨论】:
以上是关于是啥让一个指向页表条目的指针数组比拥有一个页表条目数组更好?的主要内容,如果未能解决你的问题,请参考以下文章