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

Joh*_*ler 6 linux swap virtual-memory

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

sudo fallocate -l 500M /data/swapfile
sudo chmod 600 /data/swapfile
sudo mkswap /data/swapfile
sudo swapon /data/swapfile
Run Code Online (Sandbox Code Playgroud)

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

我们可以通过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
Run Code Online (Sandbox Code Playgroud)

还有majflt会触发paging out data到disk paging in data from the disk。

我的问题是:

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

我知道有人说

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

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

但是,在《理解 Linux 虚拟内存管理器》一书中,Linux中似乎不是这样。

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

有人可以对此有所了解吗?谢谢!

Ste*_*itt 5

\n

仍然有majflt会触发将数据分页到磁盘。

\n
\n\n

反之亦然:主要错误是页错误,只能通过从磁盘分页数据来解决。

\n\n
\n

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

\n
\n\n

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

\n\n
\n

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

\n
\n\n

往上看。

\n\n
\n

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

\n
\n\n

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

\n\n

另请参阅为什么 Linux 需要 VM 中的交换空间?

\n