如何解决什么使拥有指向页表条目的指针数组比拥有页表条目的数组更好?
在this lecture中,讨论了页表的一些极端实现以及一些合理的实现。
一种极端的情况是分配一个平面数组,该数组将每个可能的虚拟地址映射到物理地址。
在19:19
的那一刻(给定链接将在此开始),讲师说他正在谈论指向PTE的平面指针的阵列。然后提到他本可以做一些更愚蠢的事情,那就是使用一组实际的页表条目。
为什么要有一个指向PTE的指针数组比拥有一个实际的PTE数组更好呢?
他说的是一个32位系统,其地址为4字节,但是PTE也是4字节。
指针数组不是更浪费吗,因为它会占用两倍的空间(指针4个字节,PTE 4个字节)?
此外,我认为分配大量分布在物理内存中的PTE会导致碎片化,并且将难以管理,这与仅创建一组PTE相对,而PTE数组将是不占用内存的一块需要很多管理。
为什么使用指针数组会更好呢?
解决方法
在页表中查找翻译时会产生开销。时不时会发表新论文,解释其实现的优越性。有人建议hashing the page tables。我建议您不要过分考虑,了解遍历页表的原理,简单的实现就足以理解。
,如果您有许多虚拟地址空间,每个虚拟地址空间均为4 GiB;您可能会发现:
-
大面积(例如1 GiB)用于内核,并且在所有虚拟地址空间中必须相同。由于在所有虚拟地址空间中都是相同的,因此对该区域的任何修改都需要同时修改每个虚拟地址空间。
-
由于其他原因,两个或多个虚拟地址空间将共享各个区域-内存映射文件,共享库,共享内存,“
fork()
”引起的“写入时复制”区域等。 -
某些区域在相同的虚拟地址空间中将是相同的(例如,引用相同的“充满零的只读物理页面”以实施“写时分配”策略)
-
很多空间将被完全闲置(每个虚拟地址空间平均2 GiB)
用于多个地方的任何内容; “指向PTE的指针”将为您提供一个可以修改的PTE,而不管页面使用了多少位置。
举一个例子;假设您有一个由40个不同进程共享的“ C标准库”(并包含在40个不同的虚拟地址空间中),但是该库的部分代码仍在磁盘上,而这些部分的PTE则说“不存在”。当任何进程需要共享库的该部分时,就会出现页面错误(因为它尚不存在),并且操作系统必须从磁盘中获取页面。在这种情况下,“指向PTE的指针”意味着操作系统可以更改一个PTE(从“不存在”更改为“存在”),并且无需弄清楚需要更新多少个PTE,然后为40个不同的PTE更新40个不同的PTE。虚拟地址空间/进程。
指针数组不是更浪费吗,因为它会占用两倍的空间(指针4个字节,PTE 4个字节)?
指向PTE的指针数组会浪费更多的空间,但是很难说出多少空间(这不会是“两倍”,因为很多PTE会被多次使用,并且可能会多出近50%的空间) 。 PTE阵列会浪费更多的CPU时间(在内核代码中尝试管理所有内容),并且(如果您考虑使用内核自己的附加数据/内存来确定在何处共享哪些页面,则可能会实际花费)更多的内存。
但是...
他们俩都比较糟糕;并且我希望讲师正在准备引入多级分页(其中“每页指向PTE的一个指针”被“指向一组PTE的一个指针”代替),这是大多数真正的CPU使用的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。