有两种类型的计算机,分别以不同的方法管理物理内存:
1. UMA计算机,将可用内存以连续方式组织起来。SMP系统中的每个处理器访问各个内存区都是同样快
2. NUMA计算机,总是多处理器计算机。系统的每个CPU都有本地内存,可支持特别快速的访问,各个处理器之间用总线连接起来,以支持对其他CPU的本地内存访问
在NUMA当中,内存被划分为节点,单个节点的结构如下所示:
-
typedef struct pglist_data {
-
struct zone node_zones[MAX_NR_ZONES];// 当前节点上的各个区域的数组
-
struct zonelist node_zonelists[MAX_ZONELISTS];// 备用节点列表
-
int nr_zones;// 节点当中不同区域的个数
-
..
-
unsigned long node_start_pfn;//NUMA节点第一个页帧逻辑编号,所有节点页帧依次编号,页帧号全局唯一
-
unsigned long node_present_pages; /* total number of physical pages */
-
unsigned long node_spanned_pages; /* total size of physical page
-
range, including holes */
-
int node_id;// 全局节点id
-
wait_queue_head_t kswapd_wait; // 交换守护进程等待队列
-
wait_queue_head_t pfmemalloc_wait;
-
struct task_struct *kswapd; /* Protected by
-
mem_hotplug_begin/end() */
-
int kswapd_order;
-
enum zone_type kswapd_classzone_idx;
-
-
int kswapd_failures; /* Number of 'reclaimed == 0' runs */
-
...
-
/* Write-intensive fields used by page reclaim */
-
ZONE_PADDING(_pad1_)
-
spinlock_t lru_lock;
-
/* Fields commonly accessed by the page reclaim scanner */
-
/*
-
* NOTE: THIS IS UNUSED IF MEMCG IS ENABLED.
-
*
-
* Use mem_cgroup_lruvec() to look up lruvecs.
-
*/
-
struct lruvec __lruvec;
-
unsigned long flags;
-
ZONE_PADDING(_pad2_)
-
/* Per-node vmstats */
-
struct per_cpu_nodestat __percpu *per_cpu_nodestats;
-
atomic_long_t vm_stat[NR_VM_NODE_STAT_ITEMS];
-
} pg_data_t;
这样的话,物理内存的管理,实际上就是这个节点的管理了,各个节点上又分了不同的区域,其中区域的定义如下:
-
enum zone_type {
-
#ifdef CONFIG_ZONE_DMA
-
ZONE_DMA,
-
#endif
-
#ifdef CONFIG_ZONE_DMA32
-
ZONE_DMA32,// 两个DMA区域,
-
#endif
-
ZONE_NORMAL,// 内核态虚拟内存地址减掉固定常数,直接映射的部分,
-
#ifdef CONFIG_HIGHMEM
-
ZONE_HIGHMEM,// 高于上面直接映射的部分
-
#endif
-
ZONE_MOVABLE,// 划分为可移动与否,可以避免内存碎片
-
#ifdef CONFIG_ZONE_DEVICE
-
ZONE_DEVICE,
-
#endif
-
__MAX_NR_ZONES
-
-
};
每个区域分为多个页,内部使用伙伴系统来进行分配,其中每个区域的定义如下:
-
struct zone {
-
/* Read-mostly fields */
-
-
/* 区域当中的水印,与内存交换有关,min,low,high等 */
-
unsigned long _watermark[NR_WMARK];
-
unsigned long watermark_boost;
-
unsigned long nr_reserved_highatomic;
-
long lowmem_reserve[MAX_NR_ZONES];// 各个区域保留,给无论如何都不能失败的调用使用
-
-
...
-
struct pglist_data *zone_pgdat;
-
struct per_cpu_pageset __percpu *pageset;// cpu的冷暖数据,用两条链表表示
-
-
...
-
-
/* zone_start_pfn == zone_start_paddr >> PAGE_SHIFT */
-
unsigned long zone_start_pfn;
-
...
-
atomic_long_t managed_pages;
-
unsigned long spanned_pages;
-
unsigned long present_pages;
-
-
const char *name;
-
-
...
-
/* Zone 相关统计信息 */
-
atomic_long_t vm_stat[NR_VM_ZONE_STAT_ITEMS];
-
atomic_long_t vm_numa_stat[NR_VM_NUMA_STAT_ITEMS];
-
} ____cacheline_internodealigned_in_smp;
阅读(1412) | 评论(0) | 转发(0) |