Memory 是什么让指向页表项的指针数组比页表项数组更好?

Memory 是什么让指向页表项的指针数组比页表项数组更好?,memory,memory-management,operating-system,kernel,paging,Memory,Memory Management,Operating System,Kernel,Paging,在这里,我们将讨论页表的一些极端实现以及一些合理的实现 最极端的情况之一是分配一个平面阵列,将每个可能的虚拟地址映射到一个物理地址 在19:19(给定的链接将从这一分钟开始)的那一分钟,讲师说他正在谈论指向PTE的一组平面指针。然后提到他本可以做一些更愚蠢的事情,那就是使用一个实际的页面表条目数组 为什么拥有一个指向PTE的指针数组比拥有一个实际的PTE数组更好 他说的是一个地址为4字节的32位系统,但PTE也是4字节 指针数组占用的空间是原来的两倍(指针为4字节,PTE为4字节),这难道不是更

在这里,我们将讨论页表的一些极端实现以及一些合理的实现

最极端的情况之一是分配一个平面阵列,将每个可能的虚拟地址映射到一个物理地址

19:19
(给定的链接将从这一分钟开始)的那一分钟,讲师说他正在谈论指向PTE的一组平面指针。然后提到他本可以做一些更愚蠢的事情,那就是使用一个实际的页面表条目数组

为什么拥有一个指向PTE的指针数组比拥有一个实际的PTE数组更好

他说的是一个地址为4字节的32位系统,但PTE也是4字节

指针数组占用的空间是原来的两倍(指针为4字节,PTE为4字节),这难道不是更浪费吗

另外,我认为分配大量分布在物理内存中的PTE会导致碎片化,并且很难管理,而不是创建一个PTE数组,它是一个不需要大量管理的内存块


为什么拥有指针数组会更好呢?

遍历页表以查找翻译时会产生开销。时不时会有一篇新的论文发表,解释它们的实现是如何优越的。有人建议。我建议您不要想得太多,要理解遍历页表的原理,一个简单的实现就足以掌握它。

遍历页表以查找翻译时会产生开销。时不时会有一篇新的论文发表,解释它们的实现是如何优越的。有人建议。我建议您不要想得太多,要了解遍历页表的原理,一个简单的实现就足以掌握。

如果您有许多虚拟地址空间,每个都是4 GiB;你可能会发现:

  • 一个大的区域(例如1 GiB)用于内核,并且需要在所有虚拟地址空间中保持相同。由于这在所有虚拟地址空间中都是相同的,因此此区域中的任何修改都需要同时修改每个虚拟地址空间

  • 由于其他原因,2个或更多虚拟地址空间将共享不同的区域-内存映射文件、共享库、共享内存、“写时拷贝”区域由“
    fork()
    ”引起,等等

  • 在相同的虚拟地址空间中,某些区域将是相同的(例如,参考相同的“充满零的只读物理页”以实现“写时分配”策略)

  • 大量空间将完全未使用(可能每个虚拟地址空间平均2 GiB)

对于在多个地方使用的任何东西;“指向PTE的指针”将为您提供一个PTE,无论页面使用了多少个位置,都可以对其进行修改

例如:;假设您有一个由40个不同进程共享的“C标准库”(包含在40个不同的虚拟地址空间中),但库的部分代码仍在磁盘上,这些部分的PTE/s显示“不存在”。当任何进程需要共享库的该部分时,就会出现页面错误(因为它还没有出现),操作系统必须从磁盘获取页面。在这种情况下,“指向PTE的指针”意味着操作系统可以更改一个PTE(从“不存在”更改为“存在”),并且不需要计算需要更新多少PTE,然后为40个不同的虚拟地址空间/进程更新40个不同的PTE

指针数组占用的空间是原来的两倍(指针为4字节,PTE为4字节),这难道不是更浪费吗

指向PTE的指针数组将浪费更多的空间,但很难说有多少空间(这不会是“双倍”的,因为大量PTE将被多次使用,并且可能会多占用近50%的空间)。PTE数组反而会浪费更多的CPU时间(在内核试图管理一切的代码中),而且(如果您考虑到内核使用其自己的额外数据/内存来确定哪些页面在何处共享),实际上可能会消耗更多内存

然而


它们都比较可怕;我希望讲师准备引入多级分页(其中“每页一个指向PTE的指针”替换为“一个指向PTE组的指针”),这是大多数真实CPU所使用的;你可能会发现:

  • 一个大的区域(例如1 GiB)用于内核,并且需要在所有虚拟地址空间中保持相同。由于这在所有虚拟地址空间中都是相同的,因此此区域中的任何修改都需要同时修改每个虚拟地址空间

  • 由于其他原因,2个或更多虚拟地址空间将共享不同的区域-内存映射文件、共享库、共享内存、“写时拷贝”区域由“
    fork()
    ”引起,等等

  • 在相同的虚拟地址空间中,某些区域将是相同的(例如,参考相同的“充满零的只读物理页”以实现“写时分配”策略)

  • 大量空间将完全未使用(可能每个虚拟地址空间平均2 GiB)

对于在多个地方使用的任何东西;“指向PTE的指针”将为您提供一个PTE,无论页面使用了多少个位置,都可以对其进行修改

例如:;假设您有一个由40个不同进程共享的“C标准库”(包含在40个不同的虚拟地址空间中),但库的部分代码仍在磁盘上,这些部分的PTE/s显示“不存在”。当任何进程需要共享库的该部分时,就会出现页面错误(因为它还没有出现),操作系统必须从磁盘获取页面。在这种情况下,“指向PTE的指针”表示操作系统可以更改