在 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
仍然有majflt会触发将数据分页到磁盘。
我的问题是:
- 我们可以说操作系统上有两种类型的交换吗?
- 这两种机制的工作方式有何不同?
- 如果总有分页机制在工作,为什么还需要手动启用交换?
我知道有人说:
交换是指将整个进程地址空间,或者无论如何,不可共享的文本数据段,一次复制到交换设备,或者复制回来(通常是磁盘)。
而分页是指复制入/出地址空间的一页或多页。特别是,这是一个更精细的粒度。例如,在 1 GB RAM 地址空间中有约 250,000 个 4 KB 页。
但是,在《Understanding the Linux Virtual Memory Manager 》一书中,Linux中似乎并非如此。
严格来说,Linux 没有交换,因为“交换”是指将整个进程地址空间复制到磁盘,而“分页”是指复制出单个页面。Linux 实际上实现了分页,因为现代硬件支持它,但传统上在讨论和文档中将其称为交换。为了与该词的 Linux 用法保持一致,我们也将其称为交换。
有人可以对此有所了解吗?谢谢!