L07 多任务调度与Coding Sandbox的责任边界
适用章节:M08–M09。本实验允许多种正确实现;验收不变量固定,不强制特定框架。
工程事故
一个长任务堵住所有用户;Worker被取消后,后台Shell仍在运行;Coding Agent通过改掉测试断言让自己“通过”。你要从资源、取消和验收环境三个角度修复系统。
最终交付
FIFO/SJF模拟器、并发与预算策略、3个原创Coding任务修复、一份隔离环境规格和取消测试计划。真实容器运行属于本地进阶,不放到公共教学网页。
已提供材料
data/evaluation/scheduling_jobs.json、data/coding/tasks.md、starter/coding_tasks.py、reference/agentlab/scheduling.py
先独立写出预期行为再看参考解。所有商店、订单、试次与价格单位都是教学构造;不连接真实资金系统。
接口与不可破坏的约束
调度演示的duration已知,是离线教学oracle,不假装能准确预测真实Agent时长。等待审批不占计算worker;不同工具类型可有独立并发额度。取消是协议:停止新的派发、通知运行中动作、等待或对账已有副作用。
执行环境要隔离进程、文件、网络和资源。只设置cwd不是沙箱。可信测试不可由Agent修改;Agent可提交补丁,grader在独立受控副本运行。
实施步骤
- 用8、1、1三个同到达任务手算FIFO与SJF,之后写模拟器。
- 加入不同到达时刻和2个worker,避免错误地让未来短任务抢占已运行长任务。
- 为每租户设置最大并发/公平队列思路,讨论持续短任务到达时长任务饥饿。
- 修复C01运费向上取整、C02遍历删除与别名、C03跨租户缓存键三题;不修改可信测试。
- 设计工具执行协议,包括exec_id、deadline、输出上限、退出码、artifact引用和cancel状态。
- 写沙箱profile:非特权用户、只读根文件系统、私有workspace、无宿主socket、默认无网络、CPU/内存/PID/输出预算、进程组终止。
- 本地实际实现时做超时进程树测试;未运行容器时在报告中标记“规格已审查,未实测”。
验收矩阵
| 场景 | 期望 |
|---|---|
| FIFO任务8/1/1 | 完成时间8/9/10,平均9 |
| SJF任务8/1/1 | 1/2/10,平均13/3 |
| 长任务t0开始,短任务t1到达 | 非抢占SJF不会倒流时间 |
| FIFO两个worker | makespan=8 |
| 运费1001克 | 1600分,不是800 |
| active_orders | 不修改输入,返回新的字典对象 |
| 同order不同tenant | cache key不同 |
| 模型修改测试文件 | 不改变可信grader结论 |
如何运行已有参考测试
在包根目录运行:
python -m unittest discover -s reference/tests -v
本实验主要参考测试类为SchedulingTests。已有测试默认验证reference/;测试通过不代表你的starter/实现通过。接入自己的实现时,将被测模块显式替换/注入,保持测试和领域契约不变,不要修改断言来迁就实现。
评分
调度与指标25;取消/资源边界25;Coding修复20;可信测试15;隔离威胁模型15。
出现跨租户泄露、未经批准的退款或伪造结果时,不以其他分数抵消。允许记录未完成的选修功能,但必须说明范围。
进阶挑战
加入按租户轮转、预算预留和超时job;记录队列等待与服务时间分开统计。比较复制workspace、共享只读底座加私有覆盖层的成本与污染风险。
提交前自查
保存代码版本、运行命令、输入数据版本、输出日志、失败案例与设计决策。解释至少一个被你否决的方案。没有运行的测试标记“未运行”,不写“预计通过”。参考解见对应答案。