免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2767 | 回复: 1
打印 上一主题 下一主题

页面分配函数_alloc_pages()中shrink_zone()函数的各种变量的意义? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-01-06 17:57 |只看该作者 |倒序浏览
/*
* This is a basic per-zone page freer.  Used by both kswapd and direct reclaim.
*/
static void
shrink_zone(struct zone *zone, struct scan_control *sc)
{
        unsigned long nr_active;  
        unsigned long nr_inactive;

        atomic_inc(&zone->reclaim_in_progress);

        /*
         * Add one to `nr_to_scan' just to make sure that the kernel will
         * slowly sift through the active list.
         */
               /////////////////////////////////////////////////////////////////
               //从这里开始就晕,很多参数都不知道有什么意义? 比如 sc->priority ,swap_cluster_max
              //nr_scan_active ,nr_active 等等? 望大侠帮忙解释
        zone->nr_scan_active += (zone->nr_active >> sc->priority) + 1;
        nr_active = zone->nr_scan_active;
        if (nr_active >= sc->swap_cluster_max)
                zone->nr_scan_active = 0;
        else
                nr_active = 0;

        zone->nr_scan_inactive += (zone->nr_inactive >> sc->priority) + 1;
        nr_inactive = zone->nr_scan_inactive;
        if (nr_inactive >= sc->swap_cluster_max)
                zone->nr_scan_inactive = 0;
        else
                nr_inactive = 0;

        sc->nr_to_reclaim = sc->swap_cluster_max;

        while (nr_active || nr_inactive) {
                if (nr_active) {
                        sc->nr_to_scan = min(nr_active,
                                        (unsigned long)sc->swap_cluster_max);
                        nr_active -= sc->nr_to_scan;
                        refill_inactive_zone(zone, sc);
                }

                if (nr_inactive) {
                        sc->nr_to_scan = min(nr_inactive,
                                        (unsigned long)sc->swap_cluster_max);
                        nr_inactive -= sc->nr_to_scan;
                        shrink_cache(zone, sc);
                        if (sc->nr_to_reclaim <= 0)
                                break;
                }
        }

        throttle_vm_writeout();

        atomic_dec(&zone->reclaim_in_progress);
}

论坛徽章:
0
2 [报告]
发表于 2006-01-06 19:27 |只看该作者
以前没怎么看过内存管理这块的代码,粗略看了以下,写了一些自己的理解,欢迎指正。

shrink_zone这个函数要做这些事情: 将某个zone中的page LRU 按照某个程度削减,削减的方法是:在active list中的部分page转移到inactive list中,将inactive list中的page swap到磁盘上。

你没看懂的那段代码就是决定:多少active list中的page (nr_active) 要转移到inactive中, 多少inactive list 中的 page 要swap 到磁盘上。


/* 计算累计的active检查量,sc->proority 是指扫描list的深度 */
        zone->nr_scan_active += (zone->nr_active >> sc->priority) + 1;
        nr_active = zone->nr_scan_active;
/* 如果累计量大于水平值,清空累计量,nr_active个page可能被转移到inactive list 中 */
        if (nr_active >= sc->swap_cluster_max)
                zone->nr_scan_active = 0;
        else
/* 否则,转移page数 =0 */
                nr_active = 0;

/* 同上统计inactive list  swap到磁盘的page数 */
        zone->nr_scan_inactive += (zone->nr_inactive >> sc->priority) + 1;
        nr_inactive = zone->nr_scan_inactive;
        if (nr_inactive >= sc->swap_cluster_max)
                zone->nr_scan_inactive = 0;
        else
                nr_inactive = 0;

/* 设置最多有多少page可以被swap到磁盘上,所以inactive list中的page数会越来越多,保证每次swap的工作量?? */
        sc->nr_to_reclaim = sc->swap_cluster_max;

/* 限制每次 转移工作量?? 不清楚为什么要用循环,而不是一次完成所有迁移 */
        while (nr_active || nr_inactive) {
                if (nr_active) {
                        sc->nr_to_scan = min(nr_active,
                                        (unsigned long)sc->swap_cluster_max);
                        nr_active -= sc->nr_to_scan;

/* 将sc->nr_to_scan数量的page转移到inactive list中 */
                        refill_inactive_zone(zone, sc);
                }

                if (nr_inactive) {
                        sc->nr_to_scan = min(nr_inactive,
                                        (unsigned long)sc->swap_cluster_max);
                        nr_inactive -= sc->nr_to_scan;
/* 将指定数量的page swap 到磁盘上 */
                        shrink_cache(zone, sc);
                        if (sc->nr_to_reclaim <= 0)
                                break;
                }
        }
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP