【问题标题】:Use of Swap space交换空间的使用
【发布时间】:2016-09-15 15:42:29
【问题描述】:

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

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

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

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

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

这里会发生什么,a 还是 b?

【问题讨论】:

    标签: memory memory-management operating-system


    【解决方案1】:

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

    是的。根据操作系统的配置方式,交换空间可能是一个单独的分区,或者可能只是文件系统中的一个特殊文件。无论哪种情况,就像你说的:它的目的是暂时保存已从 RAM 中换出的页面。

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

    这里的“操作”是什么意思有点模棱两可——你可能意味着你已经使用 fopen() (或类似的)打开一个文件句柄并使用该文件句柄来读取和/或写入文件的内容。我们将这种情况称为 A。

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

    目前,内存中的页面P1和硬盘中的页面P1是不同的。 假设操作系统决定从内存中调出 P1。

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

    在场景 B(使用 mmap())中,操作系统“知道”内存中的页面与文件的相应子集有直接的一对一映射,在这种情况下,操作系统可能会很好地分页数据直接输出到 mmap'd 文件中,而不是通过标准交换空间然后到文件中。 (操作系统当然不是要求以这种方式聪明,但我相信大多数现代/流行的操作系统会以更有效的方式做到这一点,因为它更有效,没有理由不这样做)

    【讨论】:

    • 我指的是 fopen,然后是 fwrite 到页面 P1。所以场景A就是我所指的。作为后续,交换空间的主要优势是什么?假设文件 F1 的页面 P1 被带入内存,我将一些新数据写入 P1。现在该页面与磁盘中的页面不同。现在,如果操作系统将 P1 分页到交换空间,它实际上是从 RAM 移动到磁盘,这需要花费大量时间。相反,它可以将该页面写入磁盘中的实际页面,当再次引用该页面时,直接从文件中获取它而不是交换空间,因为它们都驻留在磁盘中
    • 交换空间的主要优点是,如果您的计算机内存不足,它可以继续运行。 (如果没有启用交换空间,RAM 耗尽意味着某些事情会简单地失败;通常在这种情况下,操作系统会选择一个要杀死的进程以释放一些内存,但在某些(大多数是较旧的)操作系统中,整个操作系统可能会崩溃)跨度>
    • 如果计算机内存不足,它会换出一个页面来交换空间。这样会产生一种错觉,即 RAM 中有更多空间。相反,为什么不将页面推送到磁盘中的实际位置,并在需要时从那里取回呢?这也能保证同样的错觉吧?还是我错过了什么?
    • 当您对数据调用 fwrite() 时,fwrite() 调用会将指定的字节复制到文件系统缓存中。届时,操作系统将负责确保您的更新迟早(但可能不会立即)写入磁盘上的文件。同时,在 fwrite() 调用返回后,应用程序缓冲区中的字节不再与文件有任何特定关系——它们再次只是 RAM 中的一些字节。我想操作系统可能很智能,可以识别文件内容的冗余,并为此进行优化,但我怀疑任何操作系统实际上都那么智能。
    • 实际上,我想到了一个操作系统(可能)无法进行优化的原因。假设您的场景 A 发生,然后在内存页面被换回之前,其他一些程序修改了磁盘上的文件。然后,当您的程序的内存被换回(从磁盘上的文件)时,它的应用程序内缓冲区将“神奇地”不同于页面被换出时的内存......这将是一个错误。所以操作系统必须以某种方式检测并防止这种情况发生。
    猜你喜欢
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 2010-11-27
    • 2017-08-27
    • 2016-08-09
    • 1970-01-01
    相关资源
    最近更新 更多