1

这是我在这里的第一个问题;我不确定它是否离题。

在自学时,我发现了以下关于操作系统的陈述:

允许内存映射文件的操作系统总是需要在页面边界映射文件。例如,对于 4 KB 页,文件可以从虚拟地址 4096 开始映射,但不能从虚拟地址 5000 开始映射。

该语句解释如下:

如果一个文件可以映射到页面的中间,则单个虚拟页面将需要磁盘上的两个部分页面来映射它。特别是第一页将被映射到暂存页以及文件页。为它处理页面错误将是一项复杂且昂贵的操作,需要复制数据。此外,没有办法捕获对页面未使用部分的引用。由于这些原因,它被避免了。

我想寻求帮助以理解这个答案。特别是,说“单个虚拟页面需要磁盘上的两个部分页面来映射它”是什么意思?根据我对内存映射文件的发现,虚拟页面映射到磁盘上的文件,而不是页面文件。这就是“部分页面”的意思吗?

另外,这里的“临时页面”是什么意思?我试图在书籍(Tanenbaum 的“现代操作系统”和“结构化计算机组织”)和网络上查找这个术语,但没有找到。

4

2 回答 2

1

首先,在阅读书籍和文档时,请始终尝试批判性地看待您所看到的。有时作者倾向于使用诸如“没有其他方法”之类的语言来宣传他们所描述的解决方案。其他方式总是可能的。

现在谈这个问题。现代操作系统总是为每个分配的内存页分配一个磁盘位置。这是有道理的。一旦有必要丢弃内存中的页面 - 如果它是“脏”的,则已经清楚将该页面放置在哪里,或者如果它没有被修改,则将其丢弃。这种策略被广泛接受。尽管替代政策也是可能的。

磁盘位置可以是页面文件或内存映射文件。内存映射文件的最常见用途 - 可执行文件和 dll。它们(几乎)从未被修改过。如果带有代码的页面有一段时间没有使用 - 丢弃它。如果控制将出现 - 从文件中重新读取它。

在你提到的摘要中,他们说would need two partial pages on disk to map it. The first page, in particular, would be mapped onto a scratch page。他们倾向于呈现这种情况,就像这里只有一种解决方案一样。事实上,可以在页面文件中为这样的组合页面分配页面并处理适当的数据复制。也可以在该页面的页面文件中没有任何内容,并使用临时页面从文件中组装该页面。在 99% 的情况下,磁盘控制器只能从/向页面边界读取/写入。这意味着您需要从第一个文件读取到内存页面,从第二个文件读取到临时页面。从临时页面复制数据并立即丢弃。

如您所见,完全可以在一页中合并多个文件。这里没有原则问题。尽管处理这种解决方案的算法会更复杂,并且会消耗更多的 CPU 时钟。重建这样的页面(如果它将被丢弃)将需要从几个不同的文件中读取。在我们的时代,4kb 是相当小的数量。节省 2kb 并不是一个巨大的收获。在我看来,看看收益和成本,我会说收益不够显着。

于 2012-06-21T21:30:11.463 回答
0

虚拟地址页面(在我听说过的每台机器上)在页面大小的边界上对齐。这仅仅是因为它使数学变得非常容易。在 x86 上,页面大小为 4096。这正好是 12 位。要找出地址所指的虚拟页面,只需将地址向右移动 12。如果要将磁盘块(假设 4096 字节)映射到地址 5000,它将从第 1 页开始( 5000 >> 12 == 1) 并在第 2 页结束 (9095 >> 12 == 2)。

内存映射文件通过将一大块虚拟地址空间映射到文件来工作,但数据是按需加载的(实际上,文件可能比物理内存大得多并且可能不适合)。当您第一次访问虚拟地址时,如果数据不存在(即它不在物理内存中)。处理器将出现故障,操作系统必须获取数据。获取数据时,需要获取页面的所有数据,否则无法关闭故障。如果您没有对齐地址,那么您必须引入多个磁盘块来填充页面。你当然可以这样做,它只是混乱和低效。

于 2012-06-22T18:24:06.447 回答