免费注册 查看新帖 |

Chinaunix

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

[内存管理] struct page 的 lru 成员适用场景分析[不断更新] [复制链接]

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:0015-16赛季CBA联赛之吉林
日期:2016-03-23 17:25:0015-16赛季CBA联赛之浙江
日期:2016-04-01 08:25:0615-16赛季CBA联赛之山西
日期:2016-04-01 10:09:1915-16赛季CBA联赛之广夏
日期:2016-06-03 15:58:212016科比退役纪念章
日期:2016-07-28 17:42:5215-16赛季CBA联赛之广东
日期:2017-02-20 23:32:43
发表于 2016-03-09 11:52 |显示全部楼层
本帖最后由 Buddy_Zhang1 于 2016-03-09 15:28 编辑

     简单的说 struct page 的 lru 成员就是负责被各个内存分配器管理.
     1. 假如这个 struct page 属于 Buddy System,那么内核通过将该 struct page 的 lru 加入到对应的 free_area 链表上,可以参照下面代码;
            struct page *page;  /* Page 已知 */
            struct zone *zone;
            int migratetype;
            int order;

            zone = page_zone(page);
            migratetype = get_pageblock_migratetype(page);
            order = page_order(page);

            list_add(&page->lru,
                    &zone->free_area[order].free_list[migratetype]);   /* page 所属的 free_list */
      2. 假如这个 struct page 属于 PCP(per_cpu_pages) 分配器,也就是 hot 或 cold 页.那么这个 struct page 的 lru 就会加入到 PCP 的 冷热页链表中.
          如果这个页是刚刚释放就作为 hot 页加入链表头,如果这个页是冷页,也就是 struct page 的 flags 中函数 __GFP_COLD 标志,该页就被加入到链表尾部.可参照下面代码.
           struct page *page; /* 已知 */
           struct zone *zone;
           struct per_cpu_pages *pcp;
           int migratetype;
           int cold = 0; /* 如果这个页属于 hot 页 cold 为0,如果这个页属于 cold 页那么 cold 为 1*/

           zone = page_zone(page);
           migratetype = get_pageblock_migratetype(page);
           pcp = &zone->pageset->pcp;

           if(cold)
                list_add_tail(&page->lru,&pcp->lists[migratetype]);
           else
                list_add(&page->lru,&pcp->lists[migratetype]);
           pcp->count++;

       3. 如果这个 struct page 属于 SLUB 分配器,那么 struct page 的 lru 就会被加入到 struct kmem_cache->node[0].partial 链表里面.
           作为一个 slab page,被 struct kmem_cache 管理起来.可以参照如下代码:
            struct page *page = alloc_page(page);
            struct kmem_cache *cache;

             cache = kmem_cache_create("Buddy",8,8,0,NULL);

             list_add(&page->lru,&cache->node[0].partial);

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
发表于 2016-03-09 15:32 |显示全部楼层
是的,同样的list_head,在page的不同生命周期里,被挂到了不同含义的链表里,相当于一个union,只是lru这个名字有点误导性。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP