“伙伴页分配把连续性细化为对齐幂二块的分裂与合并,能复算“总空闲8帧却没有8帧块”的状态。分区与保留预算再加入区域资格,解释有空闲仍拒绝某类请求;NUMA放置则在合法页框之间比较节点距离。三者…”
一页内存分配正确、内容也正确,访问它的处理器仍可能要经过更远的链路。物理页框分配理路物理页分配与安全回收Physical page allocator · Page frame free list把页框所有权、空闲链、发布前清零和最后使用者释放串成分配协议,解释它与用户堆对象分配的不同粒度。决定哪些帧可交付;NUMA还给每帧附上位置,使“放在哪”成为独立的成本问题。
形式陈述
页在哪里,执行它的线程又在哪里
NUMA是非均匀内存访问:从不同处理器位置访问同一内存节点,延迟、可用带宽等成本可能不同。教学MEM-16分成两个节点:N0管理页框0到7,N1管理8到15。两边CPU都能正确访问全部页框;本例仅规定跨节点更贵,没有把远端内存当成不可访问。
对一次访问记录CPU节点
迁移线程改变CPU执行位置,页内容未必移动;迁移页面把内容复制到另一节点的帧,并更新所有相关映射,虚拟地址可以保持不变。两个动作改变不同坐标。线程移到N1后,原来在N0的页不会因为变量指针没变,就自动变成N1本地页。
直觉
第一次真正取页,才决定初始位置
在本页的按需匿名分配模型中,预留虚地址时不立即取物理页。线程第一次写入某页触发实际分配,若采用本地优先且有合格空间,就从当时执行CPU附近的节点拿页。这种first-touch说的是触发实际分配的访问;只读共享零页、文件映射或已有驻留页不必遵循这条简化轨迹。
假设一个初始化线程在N0依次写满8页,然后N1上的工作线程反复计算。按照上述合同,初始页全在N0,后续计算会访问远端。若让两节点的工作线程分别首次写入自己将长期使用的4页,则可在两边各放4页。实际收益还取决于任务分工能否持续、线程是否迁移及页面是否共享。
程序调用分配函数的那个时刻,未必就是所有物理页的首次分配时刻。若库已经复用了旧页,或系统提前分配,后来再写并不会重新选节点。因此解释first-touch实验,需要确认初态,而不是只看代码中谁调用了分配函数。
例子与边界
同一CPU位置下,迁移要用多少次访问偿还
一页当前在N0,此后线程固定在N1。把它迁到N1一次需8000单位,之后每次访问从180降到100。若未来还有
所以整数访问次数至少101。恰好100次时两者都为18000,只是打平;99次时迁移仍亏80。只报“访问很多次值得迁”不如把一次成本和每次收益放进同一单位里核算。
如果另一半访问来自原节点
现在不再假设全部访问来自N1。未来
当
若
位置偏好与合法节点集
设N1暂时没有合格空闲页。本地优先政策可以尝试N1,失败后退到N0;严格只允许N1的绑定政策则不能通过远端回退来满足请求。前者获得较贵但合法的页,后者可能等待、回收或失败。两种接口向调用者承诺的内容不同。
分区与保留预算理路分区页分配与保留预算Page allocation zones · Zone watermarks · 分区水位将页框分配拆成区域资格、形状可用性与保留预算三个检查,追踪普通请求和受限设备请求,并区分教学阈值与实际系统水位。可作为每个候选节点内部的资格检查工具。距离最近的节点若没有设备可寻址的区、没有所需连续块,或不允许动用保留页,也不能仅凭“本地更快”就使用。节点位置和区的访问约束是可以同时存在的两层属性。
Linux的NUMA策略文档将MPOL_PREFERRED与MPOL_BIND明确区分:前者允许在偏好失败后寻找其他节点,后者把分配限制在给定集合中。实际还受cpuset及具体映射类型等约束。这里引用它们说明合同差异,不把两节点教学例子当完整内核策略实现。
推论与应用
页迁移需要保住内容和映射
把N0页复制到N1空帧后,不能立即把旧帧交给别人。若另一个线程仍持有旧TLB翻译,它可能继续向旧帧写入,使副本落后甚至破坏新的所有者。实际迁移要协调并发访问、复制时机、页表更新和相关翻译失效,只有旧引用都不能再使用后才回收旧帧。
只读共享页也不代表可无条件随意复制:新增副本改变驻留量与映射管理。可写共享页若存在多个独立副本,还需要额外的一致性合同。本页只迁移同一逻辑页的物理位置,不引入复制协议。
数据缓存一致性保证相关访问观察到应有的数据变化,并不承诺访问成本均匀。一个跨节点共享的频繁写变量可以逻辑上完全正确,却仍因数据移动或争用变慢。要研究这种行为,需要扩展当前忽略缓存的100/180模型。
把决定写成可推翻的预测
一份放置建议应同时说明当前页位置、未来CPU位置分布、预计剩余访问次数、一次迁移代价与可用目标帧。之后若线程被重新调度、任务进入新阶段或迁移耗时高于估计,原收益判断应重新计算。指针地址和进程名称不包含这些信息。
整个MEM-16单元的终点见容量、连续性与局部性练习:分别判断数量、形状、资格、驻留、翻译和位置,给每个结论附上能复算的轨迹或不等式。它们都影响“内存表现”,但需要不同证据。
参考资料
- Linux内核文档,“NUMA Memory Policy”,Scope、Components及Memory Policies and cpusets,查阅于2026-10-09:本地/偏好/绑定分配、策略作用域与已有页不会自动重新放置。
- Linux内核文档,“Physical Memory”,Nodes及“Page migration”,查阅于2026-10-09:节点背景与页面迁移的实际协调职责。100/180/8000及两种访问比例均为本页自定成本模型。