亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 2801 | 回復(fù): 1
打印 上一主題 下一主題

頁(yè)面分配函數(shù)_alloc_pages()中shrink_zone()函數(shù)的各種變量的意義? [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2006-01-06 17:57 |只看該作者 |倒序?yàn)g覽
/*
* 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.
         */
               /////////////////////////////////////////////////////////////////
               //從這里開始就暈,很多參數(shù)都不知道有什么意義? 比如 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 [報(bào)告]
發(fā)表于 2006-01-06 19:27 |只看該作者
以前沒怎么看過(guò)內(nèi)存管理這塊的代碼,粗略看了以下,寫了一些自己的理解,歡迎指正。

shrink_zone這個(gè)函數(shù)要做這些事情: 將某個(gè)zone中的page LRU 按照某個(gè)程度削減,削減的方法是:在active list中的部分page轉(zhuǎn)移到inactive list中,將inactive list中的page swap到磁盤上。

你沒看懂的那段代碼就是決定:多少active list中的page (nr_active) 要轉(zhuǎn)移到inactive中, 多少inactive list 中的 page 要swap 到磁盤上。


/* 計(jì)算累計(jì)的active檢查量,sc->proority 是指掃描list的深度 */
        zone->nr_scan_active += (zone->nr_active >> sc->priority) + 1;
        nr_active = zone->nr_scan_active;
/* 如果累計(jì)量大于水平值,清空累計(jì)量,nr_active個(gè)page可能被轉(zhuǎn)移到inactive list 中 */
        if (nr_active >= sc->swap_cluster_max)
                zone->nr_scan_active = 0;
        else
/* 否則,轉(zhuǎn)移page數(shù) =0 */
                nr_active = 0;

/* 同上統(tǒng)計(jì)inactive list  swap到磁盤的page數(shù) */
        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;

/* 設(shè)置最多有多少page可以被swap到磁盤上,所以inactive list中的page數(shù)會(huì)越來(lái)越多,保證每次swap的工作量?? */
        sc->nr_to_reclaim = sc->swap_cluster_max;

/* 限制每次 轉(zhuǎn)移工作量?? 不清楚為什么要用循環(huán),而不是一次完成所有遷移 */
        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數(shù)量的page轉(zhuǎn)移到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;
/* 將指定數(shù)量的page swap 到磁盤上 */
                        shrink_cache(zone, sc);
                        if (sc->nr_to_reclaim <= 0)
                                break;
                }
        }
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP