struct list_head inactive_list; //不活跃列表
//内存回收时 ,所扫描的活跃列表中的页面数
unsigned long nr_scan_active;
//内存回收时 ,所扫描的非活跃列表中的页面数
unsigned long nr_scan_inactive;
//活跃链表中的页面个数
unsigned long nr_active;
//非活跃链表中的页面个数
unsigned long nr_inactive;
int all_unreclaimable; /* All pages pinned */
unsigned long pages_scanned; /* since last reclaim */
ZONE_PADDING(_pad2_)
//temp_priority 与 prev_priority 在内存回收算法中使用
int temp_priority;
int prev_priority;
//伙伴分配系统中的位图数组和页面链表
struct free_area free_area[MAX_ORDER];
wait_queue_head_t * wait_table;
unsigned long wait_table_size;
unsigned long wait_table_bits;
ZONE_PADDING(_pad3_)
//pcp 结构 .我们在后面对此结构进行分析
struct per_cpu_pageset pageset[NR_CPUS];
//本管理区所在的存储节点
struct pglist_data *zone_pgdat;
//该管理区的内存映射表
struct page *zone_mem_map;
// 起始页面号
unsigned long zone_start_pfn;
//管理区中的名字
char *name;
unsigned long spanned_pages; /* total size, including holes */
unsigned long present_pages; /* amount of memory (excluding holes) */
}
在计算机系统中 ,并不是每一块内存处理的访问时间对于 CPU 来说都是一样的 ,例如 ,靠近 CPU 的内存插槽的内存访问速度要较快于另外
的插槽 .CPU 缓存的访问速度要大于内存芯片的访问速度 .基于这种情况 ,内核为每个区域都定义了一个结点 ,认为 CPU 访问结点所表示
的内存消耗的时间是一样的 .看一下结点的数据结构 :
typedef struct pglist_data {
struct zone node_zones[MAX_NR_ZONES]; //结点中的管理区数组
struct zonelist node_zonelists[GFP_ZONETYPES]; //按分配内存的先后顺序排列的管理区