2012-06-21 105 views
1

这是我的第一个问题。我不确定它是否偏离主题。为什么内存映射文件总是映射在页面边界?

虽然自学,我发现关于操作系统下面的语句:在页面边界被映射

操作系统,使内存映射文件总是需要的文件。例如,对于4 KB页,文件可以在起始于虚拟地址映射到4096,而不是在开始虚拟地址5000

此语句以下列方式解释:

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

我想问这个问题的答案。特别是,说“单个虚拟页面需要磁盘上的两个部分页面来映射它”意味着什么?根据我对内存映射文件的了解,虚拟页面被映射到磁盘上的文件,而不是分页文件。这是什么意思的“部分页面”?

此外,这里的“scratch page”是什么意思?我试图在书籍(Tanenbaum的“现代操作系统”和“结构化计算机组织”)和Web上查找这个术语,但还没有找到它。

回答

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并不是一个巨大的收益。在我看来,看看收益和成本,我会说收益不够重要。

0

虚拟地址页面(在我听过的每台机器上)都在页面大小的边界上对齐。这只是因为它让数学变得非常简单。在x86上,页面大小为4096.这正好是12位。要确定一个地址指向哪个虚拟页面,只需将地址右移12即可。如果要将磁盘块(假定为4096字节)映射到5000的地址,则它将从第1页开始( 5000 >> 12 == 1)并在第2页(9095 >> 12 == 2)处结束。内存映射文件通过映射虚拟地址空间块到文件中工作,但数据按需加载(事实上,文件可能比物理内存大得多,可能不适合)。当您第一次访问虚拟地址时,如果数据不存在(即它不在物理内存中)。处理器将发生故障,操作系统必须提取数据。当您获取数据时,您需要获取页面的所有数据,否则您将无法关闭该错误。如果您没有对齐地址,那么您将不得不引入多个磁盘块来填充页面。你当然可以做到这一点,它只是混乱和低效率。