Linux:“主要页面错误分页”和“手动启用交换”之间的区别

Linux:“主要页面错误分页”和“手动启用交换”之间的区别

在Linux机器上,我们可以通过如下命令启用交换

sudo fallocate -l 500M /data/swapfile
sudo chmod 600 /data/swapfile
sudo mkswap /data/swapfile
sudo swapon /data/swapfile

但即使未启用此功能,当页面不在内存中时,内核仍然会进行分页。

我们可以通过在sar -B 1 30不设置任何交换文件的计算机上运行命令来验证这一点。

03:08:40 AM  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
03:08:41 AM      0.00      0.00      3.00      0.00     44.00      0.00      0.00      0.00      0.00
03:08:42 AM      0.00      0.00     19.00      0.00     30.00      0.00      0.00      0.00      0.00
03:08:43 AM      0.00      0.00      0.00      0.00      3.00      0.00      0.00      0.00      0.00
03:08:44 AM     24.00      0.00      2.00      1.00      7.00      0.00      0.00      0.00      0.00
03:08:45 AM    364.00     60.00     18.00      3.00      4.00      0.00      0.00      0.00      0.00
03:08:46 AM    140.00      0.00    392.00      2.00    243.00      0.00      0.00      0.00      0.00

还有梅杰弗尔特这将触发将数据分页到磁盘并从磁盘分页数据。

我的问题是:

  • 我们可以说操作系统上有两种类型的交换吗?
  • 这两种机制的工作原理有何不同?
  • 如果分页机制一直在工作,为什么还需要手动启用交换呢?

我知道有些人说

交换是指一次性将整个进程地址空间或至少不可共享的文本数据段复制到交换设备或返回(通常是磁盘)。

而分页是指将地址空间的一页或多页复制入/出。特别是,这是在更细的粒度下。例如,1 GB RAM 地址空间中有大约 250,000 个 4 KB 页。

然而,书中了解 Linux 虚拟内存管理器,Linux下好像不是这样的。

严格来说,Linux 不进行交换,因为“交换”是指将整个进程地址空间复制到磁盘,而“分页”是指复制出各个页面。 Linux 实际上实现了现代硬件支持的分页,但传统上在讨论和文档中将其称为交换。为了与 Linux 中该词的用法保持一致,我们也将其称为交换。

有人可以解释一下吗?谢谢!

答案1

还有梅杰弗尔特这将触发将数据分页到磁盘。

相反:主要错误是页面错误,只能通过分页来解决来自磁盘的数据。

我们可以说操作系统上有两种类型的交换吗?

不完全的;这里的区别在于调出(将内存内容复制到“其他地方”,以便可以丢弃页面)可以使用不同的后备存储。内存中的页面具有不同的调出目标:映射文件通常是它们自己的后备存储,大多数其他页面需要交换文件或分区作为后备存储。交换指的是后者。当内核需要释放内存页面时,如果它想从文件中释放未修改的页面,它可以简单地丢弃它,因为知道该页面可以在需要时从文件中恢复。当需要丢弃文件中修改的页面时,如果该文件被映射为读/写且没有共享,则该页面将在被丢弃之前写入该文件;同样,内核知道它可以从文件中恢复该页面。其他任何东西都需要某种其他形式的存储,否则就无法丢弃。

这两种机制的工作原理有何不同?

往上看。

如果分页机制一直在工作,为什么还需要手动启用交换呢?

大部分见上文。交换的目的是为还没有自己的后备存储的页面提供后备存储。

也可以看看为什么 Linux 需要虚拟机中的交换空间?

答案2

您的两个引文具有交换的历史/原始含义。维基百科寻呼:

在 20 世纪 60 年代,交换是一种早期的虚拟内存技术。一个 整个节目将从 RAM“换出”(或“转出”)到磁盘,另一个将被换入(或转入)。

英特尔手册很明确:

当分页在操作系统或执行程序中正确实现时,物理内存和磁盘之间的页面交换对于程序的正确执行是透明的。

(它继续解释它透明地也适用于 16 位虚拟 8086 模式......)

AMD 也有非常可读的部分:

最后,系统软件可以使用分页机制映射 多个大型虚拟地址空间到更小的物理内存中。每个应用程序都可以使用整个 32 位或 64 位虚拟地址空间。系统软件主动将最常用的虚拟内存页面映射到可用物理内存页池。最不常用的虚拟内存页面是换出到硬盘。这个过程被称为 按需分页虚拟内存

它不考虑没有设置换出到硬盘。在这种情况下,LFU 必须写回文件(如果有)或删除(如果干净)。


有点相关的是这个新的 64 指令:

SWAPGS 指令为系统软件提供了一种加载系统数据结构指针的快速方法。 SWAPGS 可以在由于 SYSCALL 指令或由于中断或异常而进入系统软件例程时使用。

...

这种交换允许系统内核软件通过使用GS 段覆盖前缀 期间记忆参考

总是会回到这个分割

尽管分段在重新定位和保护软件和数据方面提供了很大的灵活性,但使用分段处理内存隔离和重新定位通常更有效。软件与硬件相结合的分页支持。因此,大多数现代系统软件都会绕过分段功能。然而, 无法完全禁用分段,了解分段机制对于实现长模式系统软件非常重要。


因此,您可以说存在 RAM 中的逐页交换,以及交换的上下文切换方面,反映在 60 年代的实现中,而且也反映在现代 SWAPGS 指令中。

相关内容