【存储管理】页面的定期换出page_launder()
2014-05-02 20:23
239 查看
在发生缺页异常的时候才换出页面,这时已经迟了,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回到标号再扫描,每次最多只能扫描两次;
(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回到标号再扫描,每次最多只能扫描两次;
相关文章推荐
- 【存储管理】页面的定期换出do_try_to_free_pages()
- Linux 内核源代码情景分析 chap2 存储管理 (6) --- 页面的定期换出
- 2.7 Linux存储管理-物理页面分配
- 统一管理页面的验证——由自定义继承Page基类想到的。
- zencart后台管理中选项名称和选项内容和属性控制页面出错解决办法 WARNING: An Error occurred, please refresh the page and try again
- 统一管理页面的验证——由自定义继承Page基类想到的。 .
- 2.6 Linux存储管理-物理页面的使用和周转
- 再读uclinux-2008r1(bf561)内核存储区域管理(5):page初始化
- 【存储管理】页面的换入
- 2.9 linux存储管理-页面的换入
- 操作系统页面存储管理系统
- 【存储管理】物理页面的使用和周转
- 【存储管理】物理页面的分配
- Linux 存储管理 缺页中断和页面换入
- linux 访问tomcat 管理页面时 You are not authorized to view this page 403(真实可用)
- Navisphere 6 EMC存储管理页面无法登陆的解决办法
- Django中使用Celery,定制应用程序中定义的shared_task未在定期任务管理页面的注册任务中显示
- 页面存储管理系统
- PageStatus Android 页面状态管理
- Django自动生成Admin后台管理页面