Swap Out(换出)与 Swap In(换入)全流程解析


Swap Out(换出)与 Swap In(换入)全流程解析


swap_avail_heads (优先级链表)
   │
   ├─→ [swap_info_struct 0] (prio=5) 
   │    ├─→ swap_map[0...N] → slots(逻辑页槽位)
   │    └─→ swap_extent_root (红黑树)
   │         ├─→ swap_extent_A: start_page=0,  nr_pages=100, start_block=1024
   │         └─→ ...
   │
   └─→ [swap_info_struct 1] (prio=3) 
        ├─→ swap_map[0...M] → slots
        └─→ swap_extent_root (红黑树)
             ├─→ swap_extent_C: start_page=0,  nr_pages=200, start_block=4096
             └─→ ...

swp_entry_t = (type=0, offset=42) → 指向 swap_info_struct[0] 的 slot 42
1. Swap Out(换出):内存页 → 交换区

目标:将物理内存中的不活跃页移动到交换区,释放物理内存空间。


步骤 1:选择要换出的页
  • 触发条件:物理内存紧张(如分配失败、kswapd线程唤醒)。
  • 选择策略
    • LRU算法:从最近最少使用的页链表(inactive_list)中选择候选页。
    • 脏页处理:若页是脏的(已修改),需先写回磁盘(非交换区)。

步骤 2:分配交换区槽位(slot)
  1. 选择交换区

    • 遍历swap_avail_heads优先级链表,选择优先级最高的可用交换区(如swap_info[0])。
    • 若多个交换区优先级相同,轮询选择以避免单点磨损。
  2. 分配slot

    • 在交换区的swap_map中查找空闲slot(swap_map[offset] == 0)。
    • 分配成功后,swap_map[offset]置为1(引用计数)。

步骤 3:生成swp_entry_t
  • 将分配的交换区编号(type)和slot号(offset)编码为swp_entry_t
    swp_entry_t entry = swp_entry(type, offset);
    
  • 记录映射:将该swp_entry_t写入进程页表项(PTE),标记页为“已换出”。

步骤 4:写入交换区
  1. 查找swap_extent

    • 根据offset,在交换区的红黑树(swap_extent_root)中查找包含该slot的swap_extent
    • 例如:若存在swap_extent_Astart_page=0, nr_pages=100, start_block=1024),则offset=42属于此范围。
  2. 计算物理磁盘块

    • 物理块号 = start_block + (offset - start_page) = 1024 + (42 - 0) = 1066
  3. 写入数据

    • 将内存页内容写入磁盘块1066(若交换区为分区)或文件块1066(若交换区为文件)。

2. Swap In(换入):交换区 → 内存页

目标:当进程访问已换出的页时,将其从交换区读回物理内存。


步骤 1:触发缺页异常
  • 场景:进程访问虚拟地址VA,其页表项为swp_entry_t(标记为换出)。
  • CPU触发缺页中断 → 内核调用缺页处理函数(do_swap_page)。

步骤 2:解析swp_entry_t
  • 解码swp_entry_t,得到交换区编号(type)和slot号(offset):
    type = swp_type(entry);
    offset = swp_offset(entry);
    

步骤 3:定位物理磁盘块
  1. 查找交换区

    • 通过swap_info[type]找到对应的swap_info_struct
  2. 搜索swap_extent

    • 在交换区的红黑树中,根据offset查找包含该slot的swap_extent
    • 示例:若offset=42,匹配到swap_extent_Astart_page=0, start_block=1024)。
  3. 计算物理块号

    • 物理块号 = 1024 + (42 - 0) = 1066

步骤 4:读取数据到内存
  • 从磁盘块1066读取页内容到物理内存。
  • 分配物理页:若系统无空闲页,可能触发新一轮换出(递归处理)。

步骤 5:更新页表和引用
  1. 更新页表

    • 将进程页表项中的swp_entry_t替换为新分配的物理页地址。
    • 清除换出标记,恢复可访问权限。
  2. 减少引用计数

    • 交换区的swap_map[offset]减1。若计数为0,标记slot为空闲。

关键数据结构协作

操作swap_extentswp_entry_tswap_info_struct
Swap Out根据offset查找或创建连续块映射生成逻辑标识(type, offset)分配slot,管理swap_map和红黑树
Swap In通过红黑树查找物理块号提供逻辑位置(type, offset)提供交换区元数据和红黑树根节点

性能优化设计

  1. 连续I/O优化

    • swap_extent描述连续的磁盘块,换出时优先分配连续slot,减少磁盘寻址时间。
  2. 红黑树高效查询

    • 换入时通过O(logN)复杂度快速定位swap_extent,避免线性扫描。
  3. 优先级链表

    • swap_avail_heads按优先级管理交换区,优先使用高性能设备(如SSD)。

与虚拟内存的类比

概念虚拟内存(VMA)交换区(swap_extent)
逻辑单元虚拟地址范围slot范围(start_page ~ +nr_pages)
物理映射物理页帧磁盘块号(start_block ~ +nr_pages)
组织结构进程VMA红黑树交换区swap_extent红黑树

总结

  • Swap Out:释放物理内存,生成swp_entry_t,通过swap_extent将页写入连续磁盘块。
  • Swap In:通过swp_entry_tswap_extent逆向定位磁盘块,读回内存。
  • 核心协作swp_entry_t提供逻辑位置,swap_extent完成逻辑到物理的转换,swap_info_struct管理交换区元数据。
    这一机制在保证高效性的同时,对上层屏蔽了交换区物理布局的复杂性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值