使用交换空间

时间:2016-05-18 23:35:20

标签: memory memory-management operating-system

我正在尝试了解Swap空间和虚拟内存。这些线程:thread1thread2表示虚拟内存是抽象,交换空间仅用于实现虚拟内存。现在,我的问题是:

1)交换空间是硬盘中用于临时存储从RAM中分页的页面的特殊位置吗?

2)还有一个问题是:假设我在硬盘中有一个文件F1,而我目前正在文件F1的页面P1上操作(第P1页在RAM中)并且我更新了我的页面P1。目前,内存中的页面P1和硬盘中的页面P1是不同的。让我们说操作系统决定从内存中输出P1。因此,必须发生的是页面P1必须移出RAM并进入硬盘中的某个位置。我的理解是,它会发生以下任何一种情况:

a)必须转到交换空间,在这种情况下,磁盘中的页面P1仍未更新(尚未刷新)

b)页面P1被刷新到磁盘,在这种情况下,磁盘中的文件F1是最新的。

这里会发生什么,a或b?

1 个答案:

答案 0 :(得分:3)

  

1)交换空间是否是硬盘中常用的特殊位置   暂时存储从RAM中分页的页面?

是。根据操作系统的配置方式,交换空间可能是单独的分区,也可能只是文件系统中的特殊文件。在任何一种情况下,它都像你说的那样:它的目的是暂时保存已从RAM中换出的页面。

  

我目前正在文件F1的第P1页上操作(第P1页在RAM中)和   我更新了我的页面P1

你的意思是"操作"有点含糊不清这里 - 您可能意味着您已经使用fopen()(或类似的)来打开文件句柄并使用该文件句柄来读取和/或写入文件的内容。我们将该情景称为A。

或者,您可能已经使用mmap()(或等效的东西)将文件的内容映射到虚拟内存中,以便您可以通过指针直接访问文件的内容,就好像它一样是一个常规的内存缓冲区。我们称那个场景为B。

  

目前,内存中的页面P1和硬盘中的页面P1是不同的。   让我们说操作系统决定从内存中输出P1。

在方案A(使用fopen())中,文件的页面本身并不是#34;在内存中#34;在任何相关意义上;相反,当程序调用fread()(或类似)时,操作系统会将文件中的一些字节复制到程序传递给fread()调用的内存缓冲区中。确实存在来自内存中文件的一些数据的副本,并且该数据可能被分页到交换文件,但该数据不依赖于文件本身(除非程序可能最终计划进行fwrite) ()它回到文件中 - 但操作系统不知道)。因此,在这种情况下,分页内存将进入交换空间,但不会以任何方式影响磁盘文件。

在方案B(使用mmap())中,操作系统"知道"内存中的页面与文件的相应子集有直接的一对一映射,在这种情况下,操作系统可以很好地将数据直接分页到mmap文件中,而不是通过标准交换空间,然后交换到文件。 (操作系统肯定不是必需的以这种方式聪明,但我相信大多数现代/流行的操作系统都会以更有效的方式实现它,因为它效率更高而且没有理由不去)