为什么内存映射文件总是映射到页面边界?

时间:2012-06-21 20:38:09

标签: memory-management computer-architecture

这是我的第一个问题;我不确定这是不是主题。

在自学的过程中,我发现了以下有关操作系统的声明:

  

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

本声明以下列方式解释:

  

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

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

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

2 个答案:

答案 0 :(得分:1)

首先,在阅读书籍和文档时,总是试着仔细看看你看到的内容。有时作者倾向于使用像#34这样的语言;没有其他方式"只是为了宣传他们所描述的解决方案。其他方式总是可行的。

现在就此事。现代操作系统始终为每个分配的内存页面提供磁盘位置。这是有道理的。一旦有必要丢弃内存中的页面 - 已经很清楚,如果页面脏了,那么放在哪里。或者如果没有修改就丢弃它。这种策略被广泛接受。虽然也可以采用替代政策。

磁盘位置可以是分页文件或内存映射文件。内存映射文件最常见的用途 - 可执行文件和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并不是一个巨大的收获。在我看来,看看效益和成本,我会说效益不够显着。

答案 1 :(得分:0)

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

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