免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1039 | 回复: 0

[内核入门] page->mapping疑问? [复制链接]

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
发表于 2016-03-14 16:24 |显示全部楼层
本帖最后由 _nosay 于 2016-03-15 10:28 编辑

之前一直疑问page_lanuder()往磁盘写时,int (*writepage)(struct page *) = page->mapping->a_ops->writepage; 这里的page->mapping是什么时候赋值的,其实是这样的:

① swap_out_mm()找一些最适合换出的页面,使page->mapping指向&swapper_space,并挂到inactive_dirty_list,而不真正写到交换文件(虽然它的名字里有“swap_out”):
    swap_out_mm()
      |--> ...
            |--> try_to_swap_out()
                          |--> add_to_swap_cache()
                                    |--> add_to_page_cache_locked()

② page_launder()第二遍扫描inactive_dirty_list时,如果遇到通过swap_out_mm()转移来的页面,page->mapping自然已经指向&swapper_space了,此时才是真正写入交换文件(虽然它的名字里没有“swap_out”)。


另外,refill_inactive_scan()函数将页面转移到inactive_dirty_list之前,并没有给page->mapping赋值,怎么理解呢?
其实,能被refill_inactive_scan()直接转移到inactive_dirty_list的页面,肯定没有虚拟页面的映射,既然没有映射,为什么又会在inactive_dirty_list链表呢?
原因是,do_swap_page()在换入时,会预读页面进来,这些页面不会立即被进程使用,也就不建立映射,暂时放在active_list,如果page->age消耗到0了,就是符合被refill_inactive_scan()转移到inactive_dirty_list的页面了。还有就是,do_swap_page()在恢复一个页面的映射时,并不是立即将页面转移到active_list,而是留给page_lanuder()在系统比较空闲时处理。

转移到inactive_dirty_list,并不代表页面dirty(比如预读进来很久还是没有进程使用的页面),也就是为什么page_lanuder()分两遍扫描的主要原因(分两遍扫描的原因好像正好也能利用一下第二次机会算法吧)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP