“伙伴页分配把连续性细化为对齐幂二块的分裂与合并,能复算“总空闲8帧却没有8帧块”的状态。分区与保留预算再加入区域资格,解释有空闲仍拒绝某类请求;NUMA放置则在合法页框之间比较节点距离。三者…”
同一台机器里,一些页框可能只有特定设备能访问,另一些又必须给无法等待的内核路径留用。物理页框分配理路物理页分配与安全回收Physical page allocator · Page frame free list把页框所有权、空闲链、发布前清零和最后使用者释放串成分配协议,解释它与用户堆对象分配的不同粒度。保证一页不会被两个独占所有者同时拿走;分区政策还需要回答:这次请求允许从哪里拿,以及现在是否应该动用最后几页。
形式陈述
一次请求有三道检查
把管理池分成若干区
为便于独立复算,普通请求采用自定的硬预算规则
这里
明确标记为“可动用保留预算”的请求改用
失败的候选区不改变状态;成功才扣减一次
直觉
空闲不是一个可任意挪用的大水桶
MEM-16的新快照有D区
本次初态为
“保留2页”不是让2个固定页号永远封存,而是普通请求完成后不能让该区空闲数跌破2。设备的例外请求可以使用当时仍空闲的任意合格D页。若想用静态页号划出紧急池,那是另一种表示方式,也要明确它何时补充、谁能使用。
例子与边界
逐项扣账,直到有空闲也不能给
| 请求 | 判断 | 结果后 |
|---|---|---|
| 初态 | D共4页空闲,G共6页空闲 | |
| 普通请求4个独立页 | G扣4后剩2,达到预算底线 | |
| 普通请求1页 | G剩1不合格;D扣1后剩3 | |
| 普通请求1页 | G仍不合格;D扣1后剩2 | |
| 普通请求1页 | 两区扣后都会剩1 | 拒绝,仍是 |
| 受限设备请求2个独立页,允许动用预算 | 只试D,扣后0非负 |
第四个普通请求被拒绝时,系统仍有4页空闲。拒绝的证据不是内存已用尽,而是所有合格区都碰到了当前政策底线。最后设备请求成功,也不是推翻前一次结论:它的预算权限不同,但区域资格仍然严格。
如果设备随后还要1页,即使G有2页空闲也会失败,因为D为0。若把该请求悄悄回退到G,表面上所有权与计数都对,设备却无法使用所得页。资源分配的安全条件因此不止“别分配两次”,还包括“分配到的东西满足调用者合同”。
连续性是另一条失败理由
把一个新快照改成G有4个空闲单页,分散在已占用页之间;普通预算为2。一次需要连续2页的请求满足
回收可以增加空闲数量,但不保证增加目标order的块;压实可以改善连续形状,但受不可移动页限制。等待、回收、压实和失败返回,都应由请求所处上下文决定。不能睡眠的路径不能为了拿一页就无条件等待磁盘I/O;此时预算存在也不保证所有请求都成功。
推论与应用
水位把后台准备与紧迫处理分开
可在教学预算之外再设两个后台控制阈值:空闲低于
Linux文档将区域水位与低区保留机制分别列出:通常低于low会唤醒回收线程,min附近可能走直接回收或压实;high以及内存分层模式的promo参与停止条件。lowmem_reserve又用于保护较受限区域。它们作用相关,但不能把本页一个
诊断时保留失败原因
一份有用的分配日志应记录所需页数与order、允许区、实际尝试次序、该区空闲数、预算权限,以及形状检查结果。这样才能区分“总量不足”“资格不符”“保留政策阻止”“缺少连续块”。把所有失败压成一个总空闲数字,会丢掉决定下一步的信息。
若内存还分布在不同处理器附近,区域资格与位置成本可以同时出现。NUMA放置理路NUMA内存位置与迁移成本NUMA memory placement · First-touch allocation · NUMA page migration把页框所有权与节点距离分开,计算首次实际触页的放置、优先和绑定策略,以及线程位置变化下迁移页内容的回本门槛。会增加节点选择,但不会取消本页的资格检查。先确定哪些区域合法,再在合法选择中比较距离,才能避免用性能偏好覆盖硬约束。
参考资料
- Linux内核文档,“Physical Memory”,开头的zone类型、Zones及
_watermark、lowmem_reserve,查阅于2026-10-09:区域资格、回退和水位/保留字段的原始实现说明。MEM-16的D/G区、2页预算与表中轨迹均为教学自定,不是现实配置建议。 - Arpaci-Dusseau与Arpaci-Dusseau,OSTEP, Ch.17, §17.4:连续块分配的形状约束,供区内分配机制对照。