feat(scheduler): M5 饥饿防护(抢占计数提升有效级 + 抢占冷却)

设计依据 docs/zh/input-scheduler-design.md §9、§11.5(G1/G2)。

- Task 增加 PreemptCount / LastPreemptAt;effectiveLevel(t) =
  min(L4, Level + min(PreemptCount, 2)):被抢占越多越“值钱”,
  逐步追上抢占它的流,但封顶 L4 因而抢不过真正的紧急输入
- 选择函数 taskBefore 改用有效级;requestPreempt 与 preemptGrantedFor
  同样以有效级比较
- 抢占冷却 preemptCooldown=2s:刚被抢占的任务期内不再被抢占,
  避免同一任务被反复打断到永不完结
- 新增 scheduler_starvation_test.go 4 项:提升与封顶、冷却期内不得再抢占、
  提升后同级不得抢占而更高可、选择函数确实用有效级
- 验收:agent 全量 + -race;全仓 build/vet 通过
This commit is contained in:
JianFeeeee
2026-09-13 00:38:30 +08:00
parent 0f78d7094d
commit 1b7c3fa53e
5 changed files with 180 additions and 25 deletions

View File

@ -210,7 +210,7 @@ func TestPreempt_LowerOrEqualDoesNotPreempt(t *testing.T) {
if a.sched.requestPreempt(e2, LevelBackground) {
t.Fatal("更低级不得抢占")
}
if a.sched.preemptGrantedFor(LevelInteractive) {
if a.sched.preemptGrantedFor() {
t.Fatal("未 arm 让位信号,preemptGrantedFor 应为 false")
}