You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux 2.4.18换入交换区页面时原子计数增加位置问询

Linux 2.4.18 交换页多进程映射时的原子计数逻辑

核心结论

不存在版本bug,你所寻找的“每个页表映射单独计数”的逻辑,并非通过显式调用get_page(p)实现,而是隐藏在page_add_rmap函数的内部调用中。

具体代码执行流程

物理页换出阶段

在page_launder_zone触发页换出时:

  • add_to_swap为物理页分配交换槽,交换槽的引用计数被设为3(对应3个进程的初始映射);
  • try_to_unmap解除所有PTE映射,物理页写入交换区后,其原子计数仅保留页缓存的持有引用。

第一个进程主缺页处理

  1. do_swap_page检测到swap缓存无对应页,调用read_swap_cache_async分配物理页,此时页的原子计数初始化为1;
  2. add_to_swap_cache调用get_page,将原子计数提升至2(对应页缓存的引用);
  3. 更新PTE指向物理页后,调用page_add_rmap——该函数在mm/memory.c中实现,内部执行atomic_inc(&page->count),为第一个进程的页表映射增加计数,此时原子计数变为3。

后两个进程次缺页处理

当后两个进程触发次缺页时:

  1. lookup_swap_cache直接定位到swap缓存中的物理页;
  2. 执行swap_free减少交换槽的引用计数;
  3. 更新PTE指向物理页后,同样调用page_add_rmap,每次调用都会执行atomic_inc(&page->count),分别将原子计数提升至4、5。

计数差异的说明

你预期的“原子计数应为3”是混淆了交换槽引用计数和物理页原子计数:

  • 交换槽的引用计数会随着每个进程的swap_free调用逐步递减,最终变为0;
  • 物理页的原子计数包含页缓存的引用(1) + 3个进程的页表映射引用(3),再加上add_to_swap_cache额外增加的1次引用,最终为5,这是Linux 2.4.18中页引用计数的正常逻辑。

内容的提问来源于stack exchange,提问作者Ilya.K.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 15:11:22