Chinaunix首页 | 论坛 | 博客
  • 博客访问: 37073
  • 博文数量: 11
  • 博客积分: 265
  • 博客等级: 二等列兵
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-03 12:48
文章分类
文章存档

2012年(11)

我的朋友

分类: LINUX

2012-09-12 15:38:18

内核对于一致和非一致内存访问系统使用相同的数据结构


enum zone_type {
#ifdef CONFIG_ZONE_DMA
ZONE_DMA,
#endif
#ifdef CONFIG_ZONE_DMA32
ZONE_DMA32,
#endif
ZONE_NORMAL,
#ifdef CONFIG_HIGHMEM
ZONE_HIGHMEM,
#endif
ZONE_MOVABLE,
MAX_NR_ZONES
};

  • ZONE_DMA标记适合DMA的内存域,该区域的长度依赖于处理器类型,在IA32计算机上,限制为16MB
  • ZONE_DMA32标记了使用32位地址可寻址
  • ZONE_NORMAL标记了可映射到内核段的普通内存域,无法保证该地址范围对应有实际的物理内存
  • ZONE_HIGHMEM标记了超出内核段的物理内存


首先,内存划分为结点,每个结点关联到系统的一个处理器,pg_data_t实例,每个结点又划分为内存域,是内存的进一步细分
每个内存域都关联一个数组,用来组织属于该内存域的物理内存页,对于每个页帧都分配一个struct page实例以及所需关联数据
由于性能的考虑,为进程分配内存时,内核总是试图在当前运行的CPU相关联的NUMA结点上进行,但是这并不总可行,每个结点都提供一个备用列表,该列表包含了其他结点可用于代替当前结点分配内存


节点管理
pg_data_t用于表示结点的基本元素
typedef struct pglist_data {
struct zone node_zones[MAX_NR_ZONES];  // node_zone结点中各内存域的数据结构
struct zonelist node_zonelists[MAX_ZONELISTS]; // node_zonelists备用结点极其内存域列表,当前结点没有可用空间时,在备用结点分配内存
int nr_zones;  //结点中不同内存域的数目
struct page *node_mem_map; //描述结点中所有物理内存页
struct bootmem_data *bdata;  //系统启动期间,内存管理子系统初始化之前,内核也要使用内存,自举内存分配器
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
struct pglist_data *pgdat_next; //连接到下一个内存结点,所有结点都通过单链表连接起来
wait_queue_head_t kswapd_wait;
struct task_struct *kswapd;
int kswapd_max_order;
} pg_data_t;

结点状态管理
系统中的结点多于一个,内核维护一个位图,提供各个结点的状态信息。

内存域
内核中采用zone结构来描述内存域
对zone结构的访问非常频繁,在多处理器系统上,有不同的CPU试图同时访问结构成员,采用锁的方式防止它们彼此干扰,内核对于该结构访问十分频繁,因此经常性获取该结构的两个自旋锁
zone->lock和zone->lru_lock
数据保存在CPU高速缓存中,会处理的更加快速,高速缓存分成行,每一行负责不同的内存区.
阅读(1553) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~