为什么我们需要将脏页写回磁盘以驱逐它?

Why do we need to write dirty pages back to disk to evict it?

“...如果页面已被修改并因此变脏,则必须将其写回磁盘以逐出它,这是昂贵的。” (在chapter 22 of OSTEP

我不知道为什么。为了将它从内存中逐出,脏页会被移动到swapspace,然后再被移回去。是否需要重新写入磁盘?这意味着当我们驱逐一个脏页时,我们需要两个磁盘I/Os。

如果稍后不需要内容,则在逐出时无需将其内容写入磁盘(或其他类型的媒体)。

同样,如果稍后需要这些内容,则这些内容必须在被逐出时写入磁盘(或其他类型的媒体),以便它们可以加载回内存以后没有更改这些内容。如果它们被更改,那将类似于内存损坏。

(补充一下,内存内容是指整页内存的内容。)

我认为您将两个独立的事物组合在一起。 Swap space(磁盘上的内存区域)充当匿名页面(没有备份文件的页面)的后备存储。您引用的语句可能指的是文件支持的脏页。这意味着该页面来自磁盘中的文件;这个页面不需要去交换 space,它可以被写回它在磁盘上的文件位置。尽管如此,它必须写回以保留新数据。

如果文件支持的页面被逐出以交换 space,正如您的 post 暗示的那样,您是正确的:首先会浪费磁盘 I/O将脏页写回其在磁盘上的文件,然后将其也写入磁盘上的交换 space。但是,文件支持的页面不会被逐出以交换 space,因此这是不正确的。


Swap space 可以很容易地以类似方式处理文件支持页面和匿名页面,因为现在两种类型的页面都可以被逐出到磁盘,只是匿名页面将被逐出交换,而文件支持页面将回到磁盘中的正常位置。

此外,干净的页面永远不需要写回磁盘,因为它们已经以当前状态存在于磁盘上。即使对于干净的匿名页面也是如此。那是因为干净的匿名页面只是虚拟分配的页面,所有页面都映射到同一个共享归零页面。所以不需要交换这个内存。但是当它们被写入时,这会触发 COW 页面错误,它们会收到自己的内存,被标记为脏,如果被驱逐,现在必须移动到交换区。