并发调度模型实验
约 60 分钟
并发调度模型实验
先把问题放到真实机器上
我们继续追踪同一个程序,而不是另起一张术语表。程序已经走到“并发、原子性与内存顺序”这一站,现在你在终端、反汇编、事件日志或性能计数器里看见了与“并发调度模型实验”有关的现象。先别急着背结论,跟我问四件事:眼前的比特或对象属于哪一层,谁有权改变它,改变发生在什么事件之后,失败时哪一份状态仍对程序可见。本节任务是:为《并发调度模型实验》构造一条最短可运行轨迹,逐步记录输入状态、系统动作和输出状态,并用关系 schedule\to observable\ state 复算关键量。只有把输入、动作和输出连起来,原理才不是一句空话。
(反查锚点:cs-39-computer-systems-principles/10/07/并发调度模型实验。)
本课核心关系是 schedule\to observable\ state。它不是装饰公式。你要给每个符号标位宽、单位或状态域,再把它放回一条具体执行轨迹。假设示例中有 4 个对象、机器字长 16 位、基准路径 10 个周期;这些数字只是让模型可手算。换了地址宽度、ABI、缓存参数或异常语义,结论必须跟着变,不能把一次计算当成所有机器的真理。
(反查锚点:cs-39-computer-systems-principles/10/07/并发调度模型实验。)
先分层,再动手
请把“并发调度模型实验”写进六层表:语言层描述程序员看到的对象和规则;ABI层规定二进制接口;ISA层规定指令可见状态;微体系结构层决定怎样实现指令;内核层掌管保护、进程与资源;设备或网络层承担外部传输。一个现象可能穿过多层,但每一步只能由拥有该状态的层执行。把“系统自动处理”拆成明确主体,才不会用编译器行为解释Cache,也不会用CPU流水线替操作系统权限背锅。
(反查锚点:cs-39-computer-systems-principles/10/07/并发调度模型实验。)
现在建立三列账本。第一列是执行前可观察状态,至少写程序计数器、相关地址或对象标识、权限和必要队列;第二列按时间顺序写事件;第三列写事件后的变化与证据。每一步都用 旧状态 --事件/条件--> 新状态。若步骤没有触发者、没有条件或没有失败出口,这条边就还不是系统机制,只是一句叙述。
(反查锚点:cs-39-computer-systems-principles/10/07/并发调度模型实验。)
跟我完整推一遍
第一步固定输入,不允许边算边改题设。第二步按 schedule\to observable\ state 算出应出现的中间量。第三步执行或模拟最短轨迹,把每一步实际值记在旁边。第四步比较期望与实际,只寻找第一个偏差;后面的错误常常只是连锁反应。第五步改变一个边界条件重跑,例如零长度、最大位宽、未对齐地址、未命中、权限不足、并发交错或中途故障。
(反查锚点:cs-39-computer-systems-principles/10/07/并发调度模型实验。)
贯穿练习是:为《并发调度模型实验》构造一条最短可运行轨迹,逐步记录输入状态、系统动作和输出状态,并用关系 schedule\to observable\ state 复算关键量。你最终要交付的不是答案截图,而是一张别人能复算的表:输入状态、操作主体、动作、输出状态、关系式、观测方法。若实际值与计算不同,先检查单位、舍入、隐含缓存和采样边界,然后才提出实现错误的假设。系统原理的严谨,首先来自可证伪,而不是术语数量。
(反查锚点:cs-39-computer-systems-principles/10/07/并发调度模型实验。)
机制为什么这样设计
“并发调度模型实验”面对的通常不是单一目标。系统同时权衡兼容性、速度、空间、隔离、可恢复性和实现复杂度。某种设计在平均路径上更快,可能让最坏延迟更差;少一次复制可能扩大共享状态;隐藏硬件细节可能增加跨边界成本。回答“为什么”时必须写出被优化的量、必须守住的不变量,以及代价转移到了哪里。
(反查锚点:cs-39-computer-systems-principles/10/07/并发调度模型实验。)
请做一次反事实推演:删掉本节机制,程序还能否保持相同可见语义?如果不能,指出首个破坏点;如果能,写出替代方案增加的空间、时间或信任成本。这个动作会迫使你从“机器就是这样”走向“这是受约束的工程选择”,也会为后面的性能诊断建立因果关系。
边界、错误与安全
本节严格边界是:不能把《并发调度模型实验》在语言、ABI、ISA、微体系结构、内核或设备层的对象混成一个‘系统自动完成’,必须声明位宽、权限、时序和失败后的可见状态。把它改写成一个反例。写出错误实现会接受什么非法输入、产生什么错误状态,正确实现应在何处拒绝、回滚或报告。对于并发路径,列出两个执行者各自的程序序,再给出一条具体交错;对于故障路径,指出哪些状态已稳定、哪些仍可丢失,不能只说“可能出错”。
(反查锚点:cs-39-computer-systems-principles/10/07/并发调度模型实验。)
再做极端值检查:零、负值、最大可表示值、跨边界一字节、重复请求、同刻事件和资源耗尽。至少选择两项写测试。若是浮点或性能量,还要说明误差、舍入和观察窗;若是地址或权限,还要说明访问主体和检查先后;若是协议,还要说明重复、乱序和超时后的可见结果。
(反查锚点:cs-39-computer-systems-principles/10/07/并发调度模型实验。)
可运行实验不是伪代码
每章最后一课提供Python标准输入输出实验,它模拟的是一个被公开说明的系统机制,而不是假装在Python里复刻真实CPU或内核。先运行四组内联测试,再自己增加一组失败测试。参考实现必须确定、可重复,不依赖睡眠、随机调度、本机文件或第三方包。只有所有测试都能实际执行,题目才可标为代码题。
(反查锚点:cs-39-computer-systems-principles/10/07/并发调度模型实验。)
实验时保留参考模型和优化模型。二者在相同输入上逐项对照;优化前后还要验证语义没有变化。看到性能改善时,写出工作负载、指标、基线、变化和回归阈值。只报告“快了”不合格,只有一台机器的一次运行也不足以推出普遍结论。
把这一课接回整条运行路径
承接前一课的状态或契约;本节结果会进入《字节怎样进入socket》。向前追问本节输入由谁产生,向后追问本节输出被谁消费。把相邻课程写成因果链而不是目录:上游状态改变本节选择,本节选择又改变下游地址、周期、异常、I/O或网络行为。箭头上必须有具体对象、事件或量,不能只画“相关”。
(反查锚点:cs-39-computer-systems-principles/10/07/并发调度模型实验。)
最后用自己的话给同学讲一次:先讲一个可观察现象,再画对象和时间线,随后用 schedule\to observable\ state 复算,运行最小实验,最后展示一个失败边界。如果同学只听你讲这一遍也能独立重建轨迹,就说明你掌握了机制;如果仍只能背标题,就回到第一张状态账本。
(反查锚点:cs-39-computer-systems-principles/10/07/并发调度模型实验。)
随课练习与闭卷自检
本课绑定单选、多选、计算和论述四题。单选检验层与责任主体;多选检验必要证据;计算题必须写公式、单位与中间量;论述题按对象、状态、事件、边界和验证五项评分。只列知识点、只给最终数字、只贴运行截图或写“系统自动完成”均不得满分。
下课前闭卷回答:一,“并发调度模型实验”操作的对象是什么;二,核心关系 schedule\to observable\ state 的各项是什么意思;三,写出三步合法状态迁移;四,指出一个跨层混淆;五,给一个边界反例;六,说明它怎样接到下一课。六问都能从头推导,再进入后续内容。
(反查锚点:cs-39-computer-systems-principles/10/07/并发调度模型实验。)
Practice
本课练习
先独立作答再提交;编程题会在隔离沙箱中真实编译、运行并对拍。
在“并发调度模型实验”的模型中,两个线程分别完成9次和4次受锁保护的加一,初值0,最终值是多少?只填数值,草稿必须保留公式和单位。
围绕任务“为《并发调度模型实验》构造一条最短可运行轨迹,逐步记录输入状态、系统动作和输出状态,并用关系 schedule\to observable\ state 复算关键量”写出对象与所属层、初态、至少三步状态迁移、关系式schedule\to observable\ state、一个失败反例和验证方法。
【10分量表】对象与分层2分;状态迁移3分;公式与单位2分;失败边界2分;可复核证据1分。只列术语不得分。
输入初值及L/R操作序列;L和R都表示受锁保护加一,输出终值。 使用Python 3,从标准输入读取、向标准输出写入;不得依赖本地文件、随机性或第三方包。
诊断并发调度模型实验的未知故障,哪一步最先形成机制证据?
本题独立场景标识为“u10-5-并发调度模型实验”,不得引用其他试卷结论。
严格验收并发调度模型实验时,哪些证据缺一不可?
本题独立场景标识为“midterm-2-并发调度模型实验”,不得引用其他试卷结论。
多选题:必须选全正确项,漏选或多选均不得分。