【Linux 内核 内存管理】分区伙伴分配器 ③ ( 备用内存区域列表 | ZONELIST_FALLBACK 枚举 | zoneref 结构体 | 备用内存区域借用物理页规则 )
文章目录
一、备用内存区域列表
假如 首选 内存节点 或 内存区域 不能满足 内存分配请求 ,
就需要从 " 备用内存区域 " 借用 物理页 进行 内存分配 , 该操作需要遵守如下算法规则 ;
" 内存节点 " 使用 pglist_data
结构体 进行描述 , 该结构体定义在 Linux 内核源码中的 linux-4.12\include\linux\mmzone.h#601 位置 ;
pglist_data
结构体中的 struct zone node_zones[MAX_NR_ZONES]
成员是 内存区域 数组 , struct zonelist node_zonelists[MAX_ZONELISTS]
成员是 备用内存区域列表 ;
typedef struct pglist_data {
struct zone node_zones[MAX_NR_ZONES];
struct zonelist node_zonelists[MAX_ZONELISTS];
}pg_data_t;
源码路径 : linux-4.12\include\linux\mmzone.h#601
二、ZONELIST_FALLBACK、ZONELIST_NOFALLBACK 枚举
UMA 系统中 , 有
个备用区域列表 , 内部的备用区域 按照 区域类型 , 由高到低 进行排序 ;
如 : 该 UMA 系统有 " 普通区域 " , " DMA 区域 " , 那么备用区域列表如下 { 普通区域 , DMA 区域 } ;
UMA 系统的 每个 内存节点中 , 都有
个 备用内存区域列表 ,
- 一个包含了 所有内存节点 的 备用内存区域列表 ,
- 另外一个 包含了 当前内存节点 的 备用区域列表 ;
ZONELIST_FALLBACK
枚举 包含了 所有内存节点 的 备用内存区域列表 ;
ZONELIST_NOFALLBACK
枚举 包含了当 前内存节点 的 备用区域列表 ;
enum {
ZONELIST_FALLBACK, /* zonelist with fallback */
#ifdef CONFIG_NUMA
/*
* The NUMA zonelists are doubled because we need zonelists that
* restrict the allocations to a single node for __GFP_THISNODE.
*/
ZONELIST_NOFALLBACK, /* zonelist without fallback (__GFP_THISNODE) */
#endif
MAX_ZONELISTS
};
源码路径 : linux-4.12\include\linux\mmzone.h#545
三、zoneref 结构体
struct zone *zone
成员 指向 内存区域 数据结构 ;
int zone_idx
成员 指向 内存区域 的 类型 ;
/*
* This struct contains information about a zone in a zonelist. It is stored
* here to avoid dereferences into large structures and lookups of tables
*/
struct zoneref {
struct zone *zone; /* Pointer to actual zone */
int zone_idx; /* zone_idx(zoneref->zone) */
};
源码路径 : linux-4.12\include\linux\mmzone.h#561
四、备用内存区域借用物理页规则
从 " 备用内存区域 " 借用 物理页 规则 :
① 相同类型区域借用物理页 : 内存节点 的 指定类型区域 可以从 另一个 内存节点 相同类型区域 借用 物理页 ,
如 : 内存节点
普通区域 从 内存节点
的普通区域 借用物理页 ;
② 高类型借用低类型区域 : 高区域类型 从 低区域类型 借用 物理页 ,
如 : 普通区域 向 DMA 区域 借用 物理页 ;
注意 : 低类型区域 无法从 高类型区域 借用 物理页 ; 如 : DMA 区域 无法从 普通区域 借用物理页 ;
相关文章
- Linux文件名命名规则(linux文件名命名)
- 掌握Linux内存信息,管理系统更有效(linux内存信息)
- 使用情况深入了解 Linux 内存使用情况(如何查看linux的内存)
- 为Linux系统查找未分配空间(linux查看未分配空间)
- 管理利用Linux系统精准掌控内存管理(linux系统内存)
- Linux网卡激活:一步一步实现(linux网卡激活)
- Linux下快速使用共享库(linux共享库的使用)
- Linux目录结构:深入解析(linux表示目录)
- 内存探索Linux内存:快速查找内存大小(查找linux)
- Linux下检测硬盘状态的命令指南(linux检测硬盘命令)
- Linux 多播技术:实现网络沟通的新方式(linux多播)
- Linux在ARM处展现强大优势(linux和arm的关系)
- Linux服务器解放内存,实现最优性能(linux服务器释放内存)
- Linux上的虚拟硬盘:极速存取体验(linux内存虚拟硬盘)
- 量Linux内存最佳配置:最佳条数量(linux内存条数)
- 和历史Linux分支及其发展历史(linux的分支)
- Linux线程内存占用分析(linux线程内存占用)
- Linux文件类型:简明指南(linux文件的类型)
- Linux如何挂载光驱?(linux挂光驱)
- Linux限制内存,如何应对?(linux内存被限制)
- Linux系统下如何查看内存使用情况(linux 内存查看)
- Linux内存清理:提高系统运行效率的不二选择(linux清理内存)
- Linux IP与端口——简明完整的网络连接方式(linux ip和端口)