在 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
现代操作系统通常以称为页面的小块形式实现虚拟内存,包括交换到磁盘。与早期 UNIX System V 中交换整个程序相比,这是一种改进。
一些人强调,分页与旧的交换不同,包括理解Linux虚拟内存管理器。但请注意,交换项仍然存在。
令人困惑的是,交换只是分页的一个子集可执行文件或内存映射文件是页面错误可以独立于交换空间发生的示例。这些文件映射已由永久存储支持。相反,交换空间围绕匿名页面移动。
因此,sar
分页统计信息与vmstat
换入/换出。
没有交换空间,就没有办法回收匿名页面。工作负载仍然需要内存,因此文件缓存的压力更大。 添加一些交换空间也有助于移动匿名。它作为“紧急内存”没有帮助,积极回收缓慢的交换空间对于性能来说是可怕的。
打个比方:考虑一下搬家。内存分配的“时间表”可能会迫使内核“搬运工”在时间紧迫的情况下拿起并移动所有东西。添加一个外部存储柜,不需要立即使用的东西可以提前存放在那里,减少干扰,减少装载量。这就是交换空间的有效利用。
答案2
即使你没有启用交换,内核仍然使用虚拟内存
在 Linux 中,进程定义结构是内核内存(逻辑地址),这意味着在内存不足的情况下,Linux 内核不会交换进程结构。
Linux 不会像 Solaris 那样交换自身,Solaris 也会交换进程的内核结构。
几乎每个操作系统都使用分页将虚拟内存转换为物理内存
当内存不足或含有用户数据的未使用页面时,Linux 使用页面回收系统来释放内存,因此使用交换。
与用户空间相关的进程页面被称为虚拟内存,这些用户页面最终可以进入交换空间。
这些术语中有许多是 unix 的通用术语,但 Linux 和 unix 之间也存在一些细微的差别
进程段文本、数据、堆栈、bss、堆位于用户空间。