当前位置: 首页 > news >正文

内存管理-伙伴系统合并块计算,__find_buddy_pfn,谁是我的伙伴???

开始

用1-7块添加到伙伴举例,其实并不明白这里面的数学内容或算法,仅仅是发现伙伴系统合并块的查找和内存碎片减少有关,伙伴系统的合并不是两个空闲块相连就可以随便合并的

__find_buddy_pfn用于计算一个页的伙伴是谁,这里的位置是free页的时候,计算伙伴在哪,如果伙伴和当前块的阶一致,也空闲,则合并

/root/qemu/linux-5.10.202/mm/page_alloc.c: 1018buddy_pfn = __find_buddy_pfn(pfn, order);		// 相邻的伙伴块,按照 ^ (1 << order) 计算

__find_buddy_pfn函数内容:

/root/qemu/linux-5.10.202/mm/internal.h: 156/** Locate the struct page for both the matching buddy in our* pair (buddy1) and the combined O(n+1) page they form (page).** 1) Any buddy B1 will have an order O twin B2 which satisfies* the following equation:*     B2 = B1 ^ (1 << O)* For example, if the starting buddy (buddy2) is #8 its order* 1 buddy is #10:*     B2 = 8 ^ (1 << 1) = 8 ^ 2 = 10** 2) Any buddy B will have an order O+1 parent P which* satisfies the following equation:*     P = B & ~(1 << O)** Assumption: *_mem_map is contiguous at least up to MAX_ORDER*/
static inline unsigned long
__find_buddy_pfn(unsigned long page_pfn, unsigned int order)
{return page_pfn ^ (1 << order);
}

__find_buddy_pfn

__find_buddy_pfn中有注释,如果是8,1000,1阶,即两个块,pfn是8,这这个块是8和9两个页
伙伴 = 8 ^ (1 < 1) = 10,也就是和10、11两个页(当前为1阶,这里不判断这两个页是否真的在一介,后面其他函数会判断,如果这两个页在一阶且为空)互为伙伴

伙伴初始化时块的分配规则

/root/qemu/linux-5.10.202/mm/memblock.c: 1900static void __init __free_pages_memory(unsigned long start, unsigned long end)	// 伙伴系统初始化,会按照 page 的 pfn 按阶存放 每个阶存档的page地址一定是 2**n 对齐
{int order;while (start < end) {order = min(MAX_ORDER - 1UL, __ffs(start));		// ffs 第一个有 1 的 bit 位置 - 1,相当于根据 pfn 地址确定 orderwhile (start + (1UL << order) > end)			// 和 1912 行的 start += (1UL << order); 有联系,如果有连续大块,放到对应 orderorder--;memblock_free_pages(pfn_to_page(start), start, order);  // 加入到伙伴系统start += (1UL << order);

下面举例:

举例

加入有1-13,一共12个页要加入伙伴系统

pfnhex__ffs加入到伙伴的阶解释
11001 + (1 << 0) <= 13
210112 + (1 << 1) <= 13
3111跳过2 += (1 << 1)
4100224 + (1 << 2) <= 13
51012跳过4 += (1 << 2)
61102跳过4 += (1 << 2)
71112跳过4 += (1 << 2)

假如3变成了0阶,现在释放了3需要加入的伙伴系统,那么3的伙伴就是2,这两个可能合并为1阶,2的伙伴页同样是3

2 ^ (1 << 0) = 3
3 ^ (1 << 0) = 2

同理,4和5互为在0阶时候的伙伴,4和5可组合到1阶时,可以和6和7组成的1阶合并到2阶

4 ^ (1 << 0) = 5
5 ^ (1 << 0) = 4

4 ^ (1 << 1) = 6 (1阶时伙伴为6,和(6,7)提升到2阶)
6 ^ (1 << 1) = 4

http://www.dtcms.com/a/391415.html

相关文章:

  • 【LVS入门宝典】LVS核心原理与实战:Director(负载均衡器)配置指南
  • 算法常考题:描述假设检验的过程
  • IEEE会议征集分论坛|2025年算法、软件与网络安全国际学术会议(ASNS2025)
  • 洞见未来:计算机视觉的发展、机遇与挑战
  • MongoDB集合学习笔记
  • C++ 中 std::list使用详解和实战示例
  • IO流的简单介绍
  • 【AI论文】SAIL-VL2技术报告
  • 基于 SSM(Spring+SpingMVC+Mybatis)+MySQL 实现(Web)软件测试用例在线评判系统
  • 【2/20】理解 JavaScript 框架的作用:Vue 在用户界面中的应用,实现一个动态表单应用
  • Android冷启动和热启动以及温启动都是什么意思
  • Java数据结构 - 单链表的模拟实现
  • git忽略CRLF警告
  • 不用手也能玩手机?多代理协作框架让 APP 自动执行任务
  • 装备制造企业支撑智能制造的全生命周期数据治理实践
  • 【论文阅读 | AAAI 2025 | Mamba YOLO: 基于状态空间模型的目标检测简单基线​​】
  • AdMergeX与小川科技最右App合作案例入选中国信通院“高质量数字化转型典型案例集”
  • LoadBalancer配置
  • 国内外主流开源密码库:演进背景、国密适配与企业维护挑战
  • 车规级MCU在特种车辆车身控制中的应用研究
  • 深度学习基本模块:GRU 门控循环单元
  • 通过Keepalived+LVS搭建NAT模式的高可用集群系统保姆级教程
  • 设备硬件能力调用:传感器、蓝牙与定位
  • 完全二叉树的链式创建以及遍历
  • 数据结构——二叉树和BST(2)
  • 一文解码百度地图ETA
  • 好题推荐-剑指S10
  • Python 中的魔术方法(Magic Methods)
  • JavaScript事件循环机制----event loop
  • C++编程学习(第33天)