欢迎来到天天文库
浏览记录
ID:50369680
大小:73.75 KB
页数:21页
时间:2020-03-08
《Linux内存管理详解.docx》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、13. 内存管理13.1. 引言Linux对物理内存的描述机制有两种:UMA和NUMA。Linux把物理内存划分为三个层次来管理:存储节点(Node)、管理区(Zone)和页面(Page)。UMA对应一致存储结构,它只需要一个Node就可以描述当前系统中的物理内存,但是NUMA的出现打破了这种平静,此时需要多个Node,它们被统一定义为一个名为discontig_node_data的数组。为了和UMA兼容,就将描述UMA存储结构的描述符contig_page_data放到该数组的第一个元素中。内核配置选项CONFIG_NUMA决定了当前系统
2、是否支持NUMA机制。此时无论UMA还是NUMA,它们都是对应到一个类型为pg_data_t的数组中,便于统一管理。图 71. NodeZone和Page的关系上图描述Linux管理物理内存的三个层次之间的拓扑关系。从图中可以看出一个存储节点由pg_data_t描述,一个UMA系统中只有一个Node,而在NUMA中则可以存在多个Node。它由CONFIG_NODES_SHIFT配置选项决定,它是CONFIG_NUMA的子选项,所以只有配置了CONFIG_NUMA,该选项才起作用。UMA情况下,NODES_SHIFT被定义为0,MAX_NUM
3、NODES也即为1。include/linux/numa.h#ifdefCONFIG_NODES_SHIFT#defineNODES_SHIFTCONFIG_NODES_SHIFT#else#defineNODES_SHIFT0#endif#defineMAX_NUMNODES(1<4、[0]};EXPORT_SYMBOL(contig_page_data);structpglist_data即是pg_data_t的原型。了解pg_data_t中的结构成员对于了解内存管理是必经之路:enumzone_type{ZONE_DMA,ZONE_NORMAL,ZONE_MOVABLE,......__MAX_NR_ZONES};typedefstructpglist_data{structzonenode_zones[MAX_NR_ZONES];structzonelistnode_zonelists[MAX_ZONELISTS]5、;intnr_zones;#ifdefCONFIG_FLAT_NODE_MEM_MAP/*means!SPARSEMEM*/structpage*node_mem_map;#ifdefCONFIG_CGROUP_MEM_RES_CTLRstructpage_cgroup*node_page_cgroup;#endif#endifstructbootmem_data*bdata;....../*forCONFIG_MEMORY_HOTPLUG*/unsignedlongnode_start_pfn;unsignedlongnode_prese6、nt_pages;/*totalnumberofphysicalpages*/unsignedlongnode_spanned_pages;/*totalsizeofphysicalpagerange,includingholes*/intnode_id;wait_queue_head_tkswapd_wait;structtask_struct*kswapd;intkswapd_max_order;}pg_data_t;·node_zones:当前节点中包含的最大管理区数。MAX_NR_ZONES在include/linux/bounds7、.h定义,该文件是在编译过程中根据管理区类型定义中的__MAX_NR_ZONES变量自动生成的。·node_zonelists:内存分配器所使用的管理区链表数组,MAX_ZONELISTS的值在配置CONFIG_NUMA时为2,否则为1。索引为0的链表表示后援(Fallback)链表,也即当该链表中的第一个不满足分配内存时,依次尝试链表的其他管理区。索引为1,的链表则用来针对GFP_THISNODE的内存申请,此时只能申请指定的该链表中的管理区。·nr_zones:指定当前节点中的管理区数,也即node_zones中实际用到的管理区数。它的8、取值范围为[1,MAX_NR_ZONES]。对于UMA来说,它的值为1。·node_mem_map:节点中页描述符数组首地址。·node_page_cgroup:·bdata:系
4、[0]};EXPORT_SYMBOL(contig_page_data);structpglist_data即是pg_data_t的原型。了解pg_data_t中的结构成员对于了解内存管理是必经之路:enumzone_type{ZONE_DMA,ZONE_NORMAL,ZONE_MOVABLE,......__MAX_NR_ZONES};typedefstructpglist_data{structzonenode_zones[MAX_NR_ZONES];structzonelistnode_zonelists[MAX_ZONELISTS]
5、;intnr_zones;#ifdefCONFIG_FLAT_NODE_MEM_MAP/*means!SPARSEMEM*/structpage*node_mem_map;#ifdefCONFIG_CGROUP_MEM_RES_CTLRstructpage_cgroup*node_page_cgroup;#endif#endifstructbootmem_data*bdata;....../*forCONFIG_MEMORY_HOTPLUG*/unsignedlongnode_start_pfn;unsignedlongnode_prese
6、nt_pages;/*totalnumberofphysicalpages*/unsignedlongnode_spanned_pages;/*totalsizeofphysicalpagerange,includingholes*/intnode_id;wait_queue_head_tkswapd_wait;structtask_struct*kswapd;intkswapd_max_order;}pg_data_t;·node_zones:当前节点中包含的最大管理区数。MAX_NR_ZONES在include/linux/bounds
7、.h定义,该文件是在编译过程中根据管理区类型定义中的__MAX_NR_ZONES变量自动生成的。·node_zonelists:内存分配器所使用的管理区链表数组,MAX_ZONELISTS的值在配置CONFIG_NUMA时为2,否则为1。索引为0的链表表示后援(Fallback)链表,也即当该链表中的第一个不满足分配内存时,依次尝试链表的其他管理区。索引为1,的链表则用来针对GFP_THISNODE的内存申请,此时只能申请指定的该链表中的管理区。·nr_zones:指定当前节点中的管理区数,也即node_zones中实际用到的管理区数。它的
8、取值范围为[1,MAX_NR_ZONES]。对于UMA来说,它的值为1。·node_mem_map:节点中页描述符数组首地址。·node_page_cgroup:·bdata:系
此文档下载收益归作者所有