operating-system - 分页:基本、分层、散列和倒置

标签 operating-system hashtable paging page-tables

关于操作系统和页表,分页和页表似乎有4种通用方法

基本 - 存储页码和偏移量的单个页表

分层的 - 将虚拟地址分解为多个部分的多层表

散列 - 散列页表,通常可能包含映射到同一条目的多个散列

Inverted - 逻辑地址还包括 PID、页码和偏移量。然后使用 PID 在表中查找页面,并将表中的行数添加到偏移量以找到主内存的物理地址。 (粗略的,可能是糟糕的定义)

我只是想知道每种方法的优缺点是什么?看起来 basic 是更简单的方法,但也可能占用更多内存空间以获得更大的地址空间。 还有什么?

最佳答案

构建可用页面模型的关键是尽量减少不必要条目的未使用空间。您希望最小化所需的内存量,同时保持较低的内存查找计算成本。

  • Basic 会占用大量内存(对于使用 4GB 内存的现代系统,仅表可能就需要 300 MB),因此不切实际。

  • Hierarchical 通过仅添加实际使用的子表来大量减少内存。尽管如此,每个进程都有一个根页表。而如果进程的内存占用是分散的,那么从表中可能还会有很多不需要的表项。这是一个比 Basic 更好的内存解决方案,并且只增加了边际计算量。

  • 由于散列冲突,散列不起作用

  • Inverted 是使 Hashed 工作的解决方案。内存使用非常小(与单个进程的基本表一样大,加上一些 PID 和链接开销)。问题是,如果存在哈希冲突(多个进程使用相同的虚拟地址),您将不得不遵循链信息(就像在链表中一样),直到找到具有匹配 PID 的条目。除了散列计算之外,这可能会产生大量的计算开销,但会保持尽可能小的内存占用。

关于operating-system - 分页:基本、分层、散列和倒置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5544419/

相关文章:

multithreading - 为什么使用单个 'turn' 变量的 Peterson 算法的简化不提供进程同步?

ruby - 高效的 Ruby 代码,用于为单词中唯一的每个单词找到最短的前缀

ios - 从 UIWebView 进行 PDF 分页

operating-system - 虚拟内存的分页或分段,哪个更好?

jquery - 数据表分页类型不起作用

linux - 如何在 Fedora 9 和 Ubuntu 11.10 之间进行双启动

python - 系统托盘应用程序如何在其他平台上完成?

java - 如何从 Swing 应用程序检测到 PC 正在关闭?

python - 在 python 中更新字典的最快方法

c++ - 如何在 cpp 中创建固定大小(就内存而言)的哈希表?