ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

操作系统进程调度:课堂练习3.3手算与Python模拟

操作系统进程调度:课堂练习3.3手算与Python模拟 操作系统这门课进程调度几乎是绕不过去的一道坎而课堂练习3.3往往就是第一次真正让你坐下来算数、画图、比较算法的那道题。它看起来只是几行表格加几个时间数字实际上考的是你对进程调度这件事的整体理解进程什么时候被选中、CPU什么时候被让出去、队列里的顺序怎么变、一组数据算下来谁优谁劣。很多同学卡在这里不是因为不会算减法而是因为脑子里没有一个清晰的时间轴模型导致每道题都要重新猜一遍规则。这篇内容我想按着“先讲清题目在考什么、再把概念和时间量理顺、接着手算一遍经典算法、最后用代码把这套逻辑固化下来”的顺序展开。适合正在做这道练习的同学也适合已经学过但一算就乱的读者。你会看到完整的推演过程、参数选择背后的理由、代码实现里几个容易写挂的细节还有我在做题和写模拟器时踩过的坑。全文以 Python 模拟为主但核心是思路换成 C、Java 甚至 Excel 手工推演都不影响。1. 这道课堂练习到底在考什么1.1 把“进程调度”四个字拆开看看到“课堂练习3.3进程的调度”这个标题第一反应不应该是去找公式而是先问自己调度这件事到底在调什么答案是把有限的 CPU 时间分配给多个都想要 CPU 的进程。一旦接受了这个前提问题就变成三个必须回答的点谁来排就绪队列的组织方式、按什么规则排调度算法、什么时候重新排调度时机。这三件事只要有一件没想清楚整道题的结果就是错的。课堂练习之所以把它单独拎出来是因为它同时踩中了两条主线一条是数据结构的应用队列、优先队列另一条是操作系统的核心机制进程状态迁移。很多教材把它放在进程管理这一章的中后段前面刚讲完 PCB、进程状态图、原语后面紧接着就是调度算法这个位置绝不是随便放的。它要你做的是把这些散点串成一条能跑起来的时间线。所以拿到题目第一件事我建议先把题干里的表格抄一遍列出进程名、到达时间、服务时间有的题叫运行时间或 CPU 突发时间这三列。如果题干还给了优先级那就再加一列。抄的过程本身就是一次信息核对很多错题都源于看错了某一行的到达时间或者漏了一个进程。别嫌这一步土我做过统计同一批人里出错的原因纯粹计算失误的比例其实低于看错数据的比例。1.2 老师为什么偏偏在这里设卡调度是操作系统的分岔路口进程调度之所以成为设卡点是因为它是一个典型的“多条路都能走但结果差很多”的问题。同一个进程集合用 FCFS 算出来的平均周转时间可能是 11.8用 SJF 可能降到 9.6用时间片轮转又可能反弹回 13 以上。这组数字的落差会逼着你思考为什么短作业优先看起来更“聪明”为什么时间片轮转反而变差了它真的差吗这里其实藏着一个很重要的认知评价指标不同最优算法就不同。SJF 在平均等待时间上表现优秀但它对长作业不公平长作业可能一直排在后面。时间片轮转的平均周转时间看起来不占优但它保证每个进程都能在有限时间内拿到 CPU响应更均等。老师出这道题的真正意图是让你体会到“没有免费的午餐”每种调度策略都是在对某类指标做优化同时牺牲另一类指标。理解了这一层你在答题时就不会只盯着一个平均数字下结论。我见过不少同学算出 SJF 平均周转最小就直接写“SJF 是最好的算法”这种结论在考试里很容易被扣分因为它忽略了对长作业的公平性和实现成本。正确的表述应该是“在给定指标下 SJF 更优但它需要预知服务时间且对长作业不利”。这句话是加分的。1.3 动手前的准备一张表把参数对齐真正开始算之前我习惯先做一张“参数对齐表”把每个进程的关键信息固定下来。以一道常见的五进程题目为例进程到达时间服务时间优先级数字越小越高P1053P2131P3284P4322P5445这张表的作用是后续所有推演的唯一数据来源。我会在草稿纸旁边留出一块空白专门画时间轴标出 0、1、2、3……每个整数时刻上发生了什么谁到达了、谁被选中、谁运行完。这个习惯能极大降低“算了后面忘了前面”的概率。对齐数据时有两个细节特别容易忽略。第一是到达时间的边界到达时间等于当前时刻的进程算不算已经就绪绝大多数教材的约定是“到达时间 ≤ 当前时刻”即视为就绪也就是说 t2 到达的 P3在 t2 这一刻就可以被调度。第二是同时到达的处理如果有两个进程在同一时刻到达题干通常会补充“按进程号顺序”或者“按先来先服务”如果没有说明我一般按进程编号小的优先并在答题时注明这个假设——写清假设本身就是一种严谨。2. 概念不清就必错先把三个时间量彻底理顺2.1 PCB、进程状态和调度队列之间的关系调度的对象不是一段代码而是一个 PCB进程控制块。教材里那张状态迁移图三个基本状态是就绪、运行、阻塞调度器真正操作的是就绪队列从里面挑一个让它从就绪态变成运行态当它时间片用完或者被更高优先级抢占又从运行态退回就绪态重新进入队列。这个过程反复发生就构成了整个调度的动态画面。把这个画面记住很多题目里的“坑”就自动失效了。比如有一类题会问“进程在等待 I/O 时会不会被调度”答案是不会因为它在阻塞态根本不在就绪队列里。再比如“时间片用完的进程去了哪里”答案是回到就绪队列尾部在时间片轮转里而不是直接结束。这些判断都依赖于你脑子里那幅状态迁移图是否清晰。我在做题时会在草稿纸角落画一个小三角就绪、运行、阻塞然后用箭头标注每次调度对应的迁移。这个动作看起来多余但当题目有六七个进程、频繁切换时它能帮你避免把“阻塞”和“就绪”混为一谈。尤其是涉及 I/O 的题一个进程可能多次进出就绪队列没有这张小图很容易乱。2.2 周转时间、等待时间、带权周转时间的算法与记忆法这三个时间量是进程调度练习的评分核心公式本身很简单但一混就全错。我把它拆成一句话记忆周转看头尾等待扣掉跑的时间带权就是周转除以服务。周转时间 完成时间 − 到达时间。它衡量的是从进程到达到它彻底做完一共花了多久包含了它排队的全部时间。等待时间 周转时间 − 服务时间。它衡量的是这个进程在就绪队列里干等了多久因为真正占用 CPU 的那部分时间是服务时间不算等待。带权周转时间 周转时间 ÷ 服务时间它是把周转时间按作业大小“归一化”后的结果。带权周转时间为什么要引入因为单纯的周转时间对长作业不公平。一个服务时间为 20 的进程周转 24看起来很久但相对它自身的规模只多等了 20%一个服务时间为 1 的进程周转 5绝对数字不大但它是自身规模的 5 倍用户体验极差。带权周转时间把这种“相对感受”量化了所以平均带权周转时间比平均周转时间更能反映调度对不同规模作业的影响。计算时最容易错的地方有两个。一是CPU 空闲时间段的处理如果某个时刻没有进程就绪CPU 是空闲的下一
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表