当CPU首次触及匿名文件(CSAPP)时,数据是否实际在磁盘和内存之间传输

时间:2015-07-03 17:29:55

标签: linux computer-science virtual-memory

在CSAPP第2章第9章第8节(第807页)

  

匿名文件:区域也可以映射到匿名文件,   由内核创建,包含所有二进制零。第一次   CPU触及这样一个区域的虚拟页面,内核找到一个   在物理内存中适当的受害者页面,交换受害者页面   如果它是脏的,用二进制零覆盖受害者页面,并且   更新页面表以将页面标记为常驻页面。注意没有   数据实际上是在磁盘和内存之间传输的。为此原因,   有时会调用映射到匿名文件的区域中的页面   需求为零的页面。

当受害者页面变脏时。我认为它应该写回磁盘。为什么"请注意,磁盘和内存之间实际上没有传输任何数据。"?

1 个答案:

答案 0 :(得分:1)

不幸的是,这是Unix的坏术语。部分问题是历史上缺乏硬文件系统(在某些Unix变体中已得到纠正)。在理想化的分页模型中,用户创建的文件可以用作页面文件。可以直接从可执行文件中分页静态数据(包括代码)。从页面文件中分页读/写数据。从这个意义上说,映射是匿名的,因为实际上没有文件而是页面文件的一部分。

在大多数Unix变体中,没有页面文件而是交换分区。这是因为原始Unix文件系统的设计很糟糕,已经存在了几十年。传统的Unix文件系统没有连续文件的概念。这使得无法对页面文件执行逻辑I / O.因此,传统的Unix使用交换分区。

即使您映射到命名文件,在许多Unix变体上,映射仅适用于第一个READ。在匿名映射的情况下,第一次读取创建需求零页面。将它写回磁盘将转到两种情况下的交换分区。从Unix的角度来看,将其称为“匿名”映射类型是有道理的,但从概念的角度来看(人们期望内存到文件映射是双向的)根本没有任何意义。