自学内容网 自学内容网

【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_headfree_list[MIGRATE_TYPES];//迁移类型 会根据这个类型区分不同内存页面
unsigned longnr_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


原文地址:https://blog.csdn.net/m0_64014551/article/details/145077450

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!