【Linux】【内存】Buddy内存分配基础 NUMA架构
【Linux】【内存】Buddy内存分配基础 NUMA架构
NUMA架构
在 NUMA 架构中,计算机的多个 CPU 被划分为不同的处理单元,每个处理单元有一个本地内存。这些内存被称为内存节点(memory node)。处理器尽量访问自己的本地内存
node_data[]
全局数组用来存储pg_data_t 也就是内存结点数据
node_data[0]访问的就是第一个memory node(内存结点)
pg_data_t
Linux 使用 pg_data_t 结构体来表示每个memory node(内存节点)的信息,并将其保存在全局数组node_data[]中。为了让内核能高效地管理和调度内存
struct pg_data_t *node_data[MAX_NUMNODES];
内核将memory node划分为不同的zone(区域)
区域 | 作用 |
---|---|
DMA zone | 硬件直接内存访问区域 |
normal zone | 普通区域 |
high memory zone | 针对于32位系统 目前基本用不到 |
struct pg_data_t {
struct zone *node_zones[MAX_NR_ZONES]; // 保存该节点上所有内存区域(zone)的指针
unsigned long node_id; // 节点的 ID
// 其他节点相关信息
};
zone
每一个zone(区域)里面均有自己的free_area Buddy内存分配算法主要就是针对于free_area 区域进行管理的
struct zone
{
/* free areas of different sizes */
struct free_area free_area[MAX_ORDER];
};
free_area
每一个free_area(这里是按照2的阶数进行区分free_area) 里面有自己的free_list[] ,free_list[] 来确保这块内存区域的状态 是否是可更改或者不可更改
struct free_area {
struct list_head free_list[MIGRATE_TYPES];//迁移类型 会根据这个类型区分不同内存页面
unsigned long nr_free;
};
free_list
free_list 通常是用来存储当前系统中所有可用(即空闲)的内存块的链表。free_list 的管理是先通过 区分不同状态(如moveable、unmoveable,等),然后再将具有相同状态的内存页通过双向链表连接起来。
参考文章:
https://mp.weixin.qq.com/s?__biz=Mzg4NDQ0OTI4Ng==&mid=2247487669&idx=1&sn=04a41539fcb0c6a56675d6607e53b6ff&chksm=cfb959dcf8ced0cac13acc54a764a69447f41122924140286c2157bf1324dbc17fdff9916ca4&scene=21#wechat_redirect