【存储管理】页面的定期换出page_launder()

在发生缺页异常的时候才换出页面,这时已经迟了,Linux内核定期得检查并将若干页面换出,腾出空间,当然也会存在缺页异常时而内存没有空闲页面,只好临时换出的情况。


(1)kswapd是页面的换出守护神,是一个进程,含有task_struct,跟其他进程一样接受内核的调度,但它没有自己独立的地址空间,所以也称为“线程”,它使用的内核地址空间,和中断服务程序类似,它静态链接到内核中,可调用的内核中的各种子程序,而不像其他普通进程只能通过系统调用;


(2)在kswapd_init()在系统初始化期间受到调用;通过swap_setup()设置磁盘的寻道预读,设置参数page_cluster;创建kswapd(), kreclaimd();在kswapd()中,程序进入一个死循环,结尾调用interruptible_sleep_on_timeout()进入睡眠,让内核可以调度其他进程,time_out后该进程被唤醒,有可能内核在小于1/HZ的时间就唤醒该进程,提前开始新的循环;主要有两部分工作,第一,找出若干页面进行页面的映射断开,将物理页面从活跃状态变为不活跃状态,为页面换出做好准备,第二,把已经处于不活跃状态的“脏页面”写入交换设备,使他们成为不活跃“干净页面”继续缓冲,或进一步回收这样的页面成为空闲页面。


(3)kswapd()第一部分任务:使用freepages.high和inactive_target来统计空闲页面和不活跃页面的数量;两者之和为潜在供应量,来源一个是分散在各个页面管理区的2,4,8,......2^N的页面块;一个是现有的不活跃的干净页面,可以马上就可以分配了,但是页面的内容可能会用到,这也保留的原因,也分布在各个页面管理区,但不是合并成块的;一个是不活跃的脏页面,需净化,这些页面在同一个队列中;通过统计计算出我们缺多少不活跃的页面;


(4)使用waitqueue_active()检查是否有需要执行挂在队列中的底层函数;然后调用do_try_free_pages()来释放和换出若干页面;首先调用page_launder()由易而难将不活跃的脏页面洗干净,变为可分配的页面;


(5)page_launder()中,使用cleand_pages用来累计被"洗净"的页面数量,launder_loop控制扫描不活跃脏页面队列的次数,有必要进行第二次扫描时,就设置launder_loop为1;首先判断页面是否正真的进入了不活跃脏页面队列中,需要进入活跃页面,如不活跃脏页面又再一次受到了访问,需要恢复映射查看页面是否被锁住,表明有操作在此页面故而锁住,因此将其移入到队列的尾部;页面是脏PG_dirty的时候,需要将它写到交换设备中,对于未提供页面写的函数直接将页面送回活跃页面队列中,第一次扫描时,姿势将页面移入到统一队列的尾部,不写出,第二趟时,将PG_dirty清零,然后使用writepage()函数写出,写出失败时,还需要恢复PG_dirty的值;然后,如果页面不再是脏的,用于文件缓冲时页面的去向有四种(不活跃脏,活跃,不活跃干净,空闲),如果页面中仍在某一个address_space队列中,已洗净了,将页面转入到不活跃干净队列中;如果要进行第二趟扫描,则设置launder_loop为1回到标号再扫描,每次最多只能扫描两次;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值