“工作集窗口给出“活跃需求”的可计算定义,并区分引用历史与实际驻留。局部与全局替换用同一12步访问复算跨进程干扰;抖动与负载控制再把缺页数换成声明成本下的历时,并检查减少活跃进程后是否真的释放…”
系统看起来很忙:不断换入页面、切走等待进程,应用却几乎没有推进。要解释这种情况,既要知道活跃工作集理路工作集窗口与驻留需求Working-set model · Working set window · 工作集模型用每进程引用窗口定义工作集并逐步更新,区分历史需求、实际驻留与未来预测,处理暂停、窗口选择和共享物理页去重。有多大,也要知道缺页处理理路按需分页与缺页处理Demand paging · Page fault handling · Lazy page allocation依据合法区域与访问种类分类故障,完成零页分配、文件换入或拒绝访问,并保持失败时的映射和数据不变量。会让程序等待内容和可用页框,而不是立即完成原访问。
形式陈述
先区分容量压力与已经发生的抖动
页面抖动描述一种运行状态:程序反复换入仍将很快使用的页面,换页工作占据大量时间或带宽,有用计算因此严重受损。一次首次缺页,或有计划地顺序读一个大文件,都不足以单独证明抖动;需要结合重访、缺页率和有效进展看持续行为。
令活跃集合A的联合工作集需求估计为
本页用局部与全局替换实验理路局部与全局页面替换Local page replacement · Global page replacement · 局部全局替换在固定交错访问轨迹上比较全局LRU与局部配额,逐步复算缺页和淘汰对象,并用反向例子说明隔离与容量共享的取舍。的LRU模拟作为工具,固定引用顺序并计算缺页数,再额外接上串行时间模型。所有成本是教学参数;它们给出可检验的因果链,不用于预测某台机器的实际毫秒数。
直觉
少一帧,可能不只是多一次缺页
单进程循环访问三个页a、b、c,只给两帧。读a、b后帧满;读c淘汰a;下一步读a又淘汰b。程序每次都把稍后要用的页换走,形成持续循环。替换器每次都执行了合法动作,整个配置仍然低效。
若能给三帧,第一次装入a、b、c后就不再换出它们。额外一帧改变的是能否容纳整个循环的内容,因此收益可以远大于“多一帧少一次缺页”。这也是只看已用内存百分比,难以推断应用进展的原因。
例子与边界
十二次访问的时间账本
分别从空驻留集重放 a b c 四轮。假定每次引用最终带来1毫秒有用CPU工作;每次缺页在此前额外等待5毫秒I/O。只有一个运行进程,不预取、不重叠I/O,也不额外收费页表、调度或脏页写回。
| 帧数 | 第1轮缺页 | 后3轮缺页 | 总缺页 |
有用CPU | I/O等待 | 总历时 |
|---|---|---|---|---|---|---|
| 2 | 3 | 9 | 12 | 12 | 60 | 72 |
| 3 | 3 | 0 | 3 | 12 | 15 | 27 |
串行总历时为
这里的“有用CPU比例”特意不把内核处理开销算进分子。实际监控中的CPU利用率可能包括内核回收与缺页处理,因此CPU很忙也不必然表示应用推进得好。要核算业务进展,至少要另看完成引用、请求或作业的数量。
为什么低CPU利用率有时不能再加任务
一般情况下,一个进程等待I/O时运行另一个进程,可以隐藏等待。但若新增进程又带来一份装不下的工作集,它会挤走旧进程的热页,使后者下一次恢复时继续缺页。于是可能出现:换页等待增加,CPU有用工作减少,系统误以为空闲而继续增加活跃任务,换页压力又更大。
这是一条可能的正反馈链,不是“增加并发总会更慢”的定理。若新任务工作集很小或访问不共享紧张资源,它也可能填满CPU空档。判断关键在联合需求和瓶颈资源,不在任务计数本身。
把准入决定算成容量不等式
另起快照:MEM-16中只有8帧可供本组进程使用。P、Q、R各有3页不共享且稳定的工作集,总需求
第三个进程不能因此被宣称“已经完成”,也不能无限期遗忘。可以先暂停它参与新的引用,等一批工作完成或预算增加后再恢复。选择谁等待需兼顾截止时间、交互需求和公平;只按工作集最小者优先,可能长期排挤大任务。容量条件解决能否装下,不能独自决定服务次序。
推论与应用
暂停CPU与释放页框是两项操作
仅把R移出运行集合,不会自动释放它的驻留页。如果R仍占3帧不让出,P与Q依旧可能拿不到所需6帧。控制器必须明确将哪些R页移出预算,保存必要内容,完成映射撤销和相关TLB失效,再把可安全复用的帧交给其他进程。
清洁且有可靠后备副本的页可以不写回;已修改且无当前副本的页必须先保全内容。页被锁定或正在I/O时还可能暂时不能回收。恢复R时,重新调入又有成本,因此频繁在“全放进来”和“全赶出去”之间切换,可能制造新的开销。
控制需要观察窗口和迟滞
可同时观察每进程缺页次数、因换页阻塞的时间、活跃需求估计和单位时间完成的工作。连续多个窗口表现出过载时减少准入,恢复到更宽松阈值并稳定一段时间后再扩大活跃集合,能避免对偶发冷启动立即作大幅调整。具体窗口和阈值必须在目标负载下验证,本页不提供脱离成本模型的通用数值。
把帧数、窗口、页大小与准入变化分开试验,才能知道改善来自哪里。例如把基本页换成大页理路大页与TLB覆盖范围Huge pages · Superpages · TLB reach在数据全部驻留的模型中复算大页减少TLB未命中的条件,分开翻译覆盖、物理连续性、内部碎片与权限变更粒度。可以减少翻译未命中,却不会自动解决这里9页活跃内容塞不进8页容量的问题;某些稀疏访问还会因大页内部碎片更占空间。
最终复算应交出两层证据:先用引用轨迹证明缺页数,再用声明的时间合同把缺页换算成历时。若允许多进程隐藏I/O,72与27的加法账本就需重建,不能继续当作整机吞吐答案。
参考资料
- Peter J. Denning,“The Working Set Model for Program Behavior”,1968,pp.330–332,系统需求、平衡政策与工作集互相挤出的过载分析。
- Arpaci-Dusseau与Arpaci-Dusseau,OSTEP, Ch.22, §22.11 “Thrashing”:内存过载与准入控制。本文12次访问、1/5毫秒成本和8帧准入例子均为自定可复算模型。