【问题标题】:Why do we need to write dirty pages back to disk to evict it?为什么我们需要将脏页写回磁盘来驱逐它?
【发布时间】:2021-10-20 09:13:50
【问题描述】:

"...如果页面已被修改,因此很脏,则必须将其写回磁盘以将其逐出,这很昂贵。" (在chapter 22 of OSTEP

我不知道为什么。为了将其从内存中逐出,脏页将被移动到交换空间,然后将其移回。是否需要再次写入磁盘?这意味着当我们驱逐一个脏页时,我们需要两个磁盘 I/O。

【问题讨论】:

  • 你对“交换空间”的理解是什么?
  • @MartinJames 为了支持比物理可用更多的内存,我们需要一些磁盘空间来来回移动页面。我们通常将此类空间称为“交换空间”,因为系统可以将内存中的页面交换到它,并将页面交换到内存中。
  • @dazhu 只有匿名页面才需要交换空间,因为文件支持的页面已经在磁盘上有一个位置来存储它们,即它们来自的原始文件。

标签: caching memory-management operating-system dirty-data


【解决方案1】:

我认为您将两个不同的东西结合在一起。交换空间(它是磁盘上的一个内存区域)充当匿名页面(没有后备文件的页面)的后备存储。您引用的语句可能是指文件支持的脏页。这意味着页面来自磁盘中的文件;此页面无需转到交换空间,只需将其写回磁盘上的文件位置即可。尽管如此,它必须被写回以保留新数据。

如果文件支持的页面被驱逐到交换空间,正如您的帖子所暗示的那样,您是正确的:首先将脏页写回磁盘上的文件然后再将磁盘 I/O 浪费掉也将其写入磁盘上的交换空间。但是,文件支持的页面不会被驱逐到交换空间,因此这是不正确的。


交换空间使处理文件支持的页面和匿名页面变得容易,因为现在这两种类型的页面都可以被驱逐到磁盘,只是匿名页面将被驱逐以交换,而文件支持的页面将恢复正常在磁盘中找到。

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

【讨论】:

  • 我只学习了操作系统的第一部分,虚拟化。因此,我对您的答案中的某些术语知之甚少,例如匿名页面和文件支持页面。也许等我读完这本书,我会对你的答案有更好的理解!
  • @dazhu 我认为你回答问题的关键是交换空间驻留在磁盘上,所以无论是什么类型的页面(匿名或文件支持)页面都必须写回磁盘是否脏,因为脏页有尚未存储的新信息。
  • @dazhu 或者更确切地说,RAM 中所有脏的内存都包含未存储在硬盘驱动器上的新内存,因此它有可能在断电时丢失。因此,如果内存被逐出,则必须先将其写入磁盘,以便以后可以访问。交换空间是一种特殊类型的磁盘空间,用于一种类型的内存,但现在只考虑“移动到交换空间”相当于“写回磁盘”。
  • 当内存不够时,我们应该驱逐一个脏页或干净页来交换空间。如果一个干净的页面被驱逐,我们只需要一个磁盘 I/O 将其写入交换空间。如果一个脏页被驱逐,我们需要两个磁盘 I/O。一种是将其写入磁盘上的某个位置,另一种是将其写入交换空间。我理解正确吗?
  • @dazhu 不,这不正确。干净的页面是从磁盘上的原始版本完全没有修改过的页面。所以当一个干净的页面被驱逐时,不需要做任何 I/O,只需将页面标记为无效。另一方面,脏页包含未存储在支持磁盘上的新信息。这就是我试图解释两类页面的地方:文件支持的页面需要一个磁盘 I/O 才能写回到它们在磁盘上的文件位置。匿名页面(来自进程堆的内存,例如不受文件支持的内存)需要一个磁盘 I/O 才能进入交换空间。
【解决方案2】:

如果以后不需要这些内容,则在被驱逐时不需要将其内容写入磁盘(或其他类型的媒体)。

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

(我应该补充一点,内存内容是指整个内存页面的内容。)

【讨论】:

  • 如果以后需要脏页的内容,我们可以将脏页从交换空间交换到内存中。为什么交换空间中脏页的内容发生了变化?
  • @dazhu - 支持媒体仅用于存储和检索。脏页被写入支持媒体。当存储在支持媒体中时,它们不会改变。当需要它们时,它们会从支持媒体加载到内存中。交换空间只是一类支持媒体。
  • @dazhu - 从支持媒体(例如硬盘)的角度考虑问题可能会有所帮助。数据是按块访问的,而不是按字节访问的。尽管没有必要,但您通常可以认为内存页面和磁盘块的大小相同——比如 4 kB。要更新磁盘上的块,您必须首先将整个块加载到内存中。然后更新内存。然后将整个块写回磁盘。
  • “当存储在支持介质中时,它们不会改变” 所以我认为我们只需要一个磁盘 I/O 来写入脏页以在内存不足时交换空间。但是在引用中,我们似乎需要两个磁盘 I/O(另一个是将脏页写入磁盘上的某个位置)。我不知道为什么我们需要两个磁盘 I/O。
  • @dazhu - 一个磁盘 IO 是将被驱逐的脏页的内容写入后备媒体。但是,如果被驱逐的页面不是脏的,则不需要写入。另一个磁盘 IO 是从支持媒体读取一个新页面到内存中。
猜你喜欢
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 2011-12-12
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多