1. 程式人生 > >linux核心page結構體的PG_referenced和PG_active標誌

linux核心page結構體的PG_referenced和PG_active標誌

linux核心使用了lru演算法來置換記憶體頁面,但是實際上並不是純的lru演算法,裡面摻雜了很多別的思想,比如第二次機會,比如雙時鐘指標等等。這裡著重說一下第二次機會的體現。在核心中有一個mark_page_accessed函式,它實際上體現一個狀態機,這是它的實現:
if (!PageActive(page) && PageReferenced(page) && PageLRU(page)) { 
    activate_page(page);  
    ClearPageReferenced(page);
} else if (!PageReferenced(page)) {
    SetPageReferenced(page);
}
基本上這段程式碼體現了函式註釋中的言詞:
inactive,unreferenced        ->      inactive,referenced
inactive,referenced          ->      active,unreferenced
active,unreferenced          ->      active,referenced
一個被記憶體管理系統管理的page的生命週期就是:夥伴系統->active list->inactive list->夥伴系統。
當一個page在兩個list之間晃盪的時候,並不是一次性從active轉移到inactive或者相反的移動,而是有兩次機會,inactive的page要先referenced才能進一步變成active的,同樣的active的page要先清除了referenced才能變成inactive的,上面的函式是到active的變換,下面的page_referenced其實是到inactive的變換,每當置換演算法掃描到一個頁面的時候,就要老化它一次,這裡有一個技巧,那就是不管它是active的還是inactive的,只是清除一下referenced,只要它被referenced了,那麼它就理應不該被釋放,除非它既是inactive的又是unreferenced的:
int page_referenced(struct page *page, int is_locked)
{
    int referenced = 0;
    if (page_test_and_clear_young(page))
        referenced++;
    if (TestClearPageReferenced(page))
        referenced++;
    if (page_mapped(page) && page->mapping) {
        ...//檢查page是否剛被使用
    }
    return referenced;
}

相關推薦

linux核心page結構PG_referencedPG_active標誌

linux核心使用了lru演算法來置換記憶體頁面,但是實際上並不是純的lru演算法,裡面摻雜了很多別的思想,比如第二次機會,比如雙時鐘指標等等。這裡著重說一下第二次機會的體現。在核心中有一個mark_page_accessed函式,它實際上體現一個狀態機,這是它的實現: if

linuxpage 結構的一點筆記

/* * Each physical page in the system has a struct page associated with * it to keep track of whatever it is we are using the page for at the * moment. Not

Linux下C結構初始化

直觀 tro 擴展性 方式 建議 struct 初始化方式 www 寫到 原文地址在這裏: http://www.cnblogs.com/Anker/p/3545146.html 我 只把裏面的主要介紹和代碼寫到這裏了. 順序初始化   教科書上講C語言結構體初始化

動態替換Linux核心函數的原理實現

c函數 路徑 pla ges sta images 語句 堆棧 mit 轉載:https://www.ibm.com/developerworks/cn/linux/l-knldebug/ 動態替換Linux核心函數的原理和實現 在調試Linux核心模塊時,有時需要

linux核心資料結構以及核心除錯

一、可移植性 1.1 資料型別可移植性 由於核心可能執行在不同的架構上,不同的架構具有不同的機器字長,因而可移植性對核心程式設計非常重要。核心資料使用的資料型別分為 3 個主要型別 標準C型別 明確大小的型別 用作特定核心物件的型別 1.1.1 標準 C 型別 使用標準

結構變數列舉型變數的使用

#include <stdlib.h> #include <stdio.h> //列舉型變數的使用,當一個變數的取值被限定的時候這時可以用列舉變數 //列舉型變數裡面變數的值在輸入、賦值的時候是字元的形式,即是裡面定義的變數;輸出的時候是int型 //在定義列舉型變數

go 結構 (struct) 方法 (method)

結構體(struct) go中沒有物件這一概念,所以採用了結構體的概念,結構體在go中有著非常重要的位置。結構體是值型別,所以可以使用new函式來建立。結構體中欄位必須唯一。 結構體定義如下: type identifier struct { filed type filed type

C語言基礎知識(一)結構struct typedef struct區別

C與C++中struct 和typedef struct區別從三個方面對比 1、宣告變數方便: 在C語言中,常常見到typedef修飾結構體,如: #include<stdio.h> typedef struct _TEST { int value; char mat

Linux核心完全註釋之Linux核心體系結構(續)

Linux核心完全註釋之Linux核心體系結構(續) 2.6 Linux 核心對記憶體的使用方法 2.8 Linux 核心原始碼的目錄結構 2.9 核心系統與使用者程式的關係 2.10 linux/Makefile 檔案 小結

結構指標陣列的使用

同種型別的結構體是可以進行賦值的 【1】結構體陣列 (1)結構體陣列的定義 1)具有相同結構體型別的結構體變數也可以組成陣列,稱它們為結構體陣列。 結構體陣列的每一個數組元素都是結構體型別的資料,它們都分別包括各個成員(分量)項。 2)定義結構體陣列的方法和定義結構體變數的方法相仿

Linux的目錄結構、vivim的使用

Linux的目錄結構 1.基本介紹: Linux的檔案系統是採用級層式的樹狀目錄結構,在此目錄中的最上層是根目錄 “/”,然後在此目錄下在去建立其他目錄。 注:有這樣一句話,在Linux的世界裡,一切皆檔案。 在Linux中的目錄結構大概就如下圖這樣。 2.目錄結構的具體介紹 下來我們

結構 struct 類Class 區別

  c#中結構體和類結構相似,夠可以包括資料成員和方法成員。   二者區別:   1,結構是指型別,在棧中分配空間;類引用型別,在堆中分配空間,棧中儲存引用。    2,結構直接儲存成員資料,其成員資料位於堆中;類堆中儲存物件,棧中的引用指向物件。   C#中的簡單型別,如

關於unity結構struct類class的使用細節注意事項!

        今天在專案中用到了結構體來儲存一些不同型別的資料,結構體目的是在任意地方呼叫和修改其中的資料資訊(相信這裡對結構體比較瞭解的人已經發現問題所在了)。當我決定用結構體的那一刻,我就已經走

linux核心引數tcp_syn_retries、tcp_retries1tcp_retries2的原始碼分析

enum { TCP_ESTABLISHED = 1, TCP_SYN_SENT, TCP_SYN_RECV, TCP_FIN_WAIT1, TCP_FIN_WAIT2, TCP_TIME_WAIT, TCP_CLOSE, TCP_CLOSE_WAIT,

結構 struct 類 class 的比較

C的結構體和C++結構體的區別 1、組成不同 C的結構體內不允許有函式存在,C++允許有內部成員函式,且允許該函式是虛擬函式。所以C的結構體是沒有建構函式、解構函式、和this指標的。 2、許可權不同 C的結構體對內部成員變數的訪問許可權只能是publi

Linux核心裁剪的具體過程方法

        能夠完成系統的基本功能,上網,收發郵件等,支援xwindows圖形介面。   在menuconfig中配置:   詳細介紹核心配置選項及刪改情況   第一部分:全部刪除   Code maturity level options ---> 程式碼成熟等

C語言 一個例子說明結構變數,結構陣列結構指標

輸入三個學生的個人資訊 包含學號 姓名和三門學科的成績 輸出平均成績最高的學生的學號 姓名 各科成績以及平均成績 程式碼如下(譚浩強c程式設計的例子) #include<stdio.h> struct Student {int num;

結構成員結構指標初始化

#include<stdio.h>#include <stdlib.h>#include <string>struct student{   char *name;   int score;   struct student* next;

C語言結構及typedef關鍵字定義結構別名函式指標的應用

結構體(struct)的初始化 struct autonlist { char *symbol; struct nlist nl[2]

結構structtypedef後面接指標的含義

在C語言裡面,struct是用來定義新的資料型別——結構體,typedef是給資料型別取別名。 據說這兩個關鍵詞同時使用有助於減少程式碼量和增加程式碼的可讀性(不過我認為它當typedef和struct在一起的時候反而降低了程式碼的可讀性),很多時候為了方便,我們常常講s