FCFS 调度算法操作系统里最朴素的公平先来后到最简单的调度也是所有调度的起点。一、调度的本质是排队操作系统里CPU 只有一个进程却可能挤破头。当多个进程同时就绪谁先用 CPU这就像银行窗口只有一个、顾客却排了一队——柜员必须先决定服务谁。调度算法直接决定系统的响应速度、吞吐量、用户体验。而先来先服务First Come First ServedFCFS是所有调度算法里最简单、最直观的一个。二、FCFS 的核心先来后到四个字的精髓先来后到。无论是作业调度还是进程调度FCFS 都按任务到达系统的先后顺序安排 CPU。先进入就绪队列的进程先获得 CPU。生活里随处可见 FCFS 的影子——超市收银、银行叫号、食堂打饭本质都是同一套逻辑。三个关键特征1. 非抢占式一旦进程获得 CPU就会一直跑下去直到完成或因 I/O 阻塞。期间哪怕有更高优先级的进程到达也不能打断当前进程。2. 公平按到达顺序依次服务不存在长期饥饿。3. 实现极简一个 FIFO 队列就够了。三、一个具体例子四个进程先后到达进程到达时间服务时间A020B515C105D15100 时刻只有 A 到达立即调度 A。运行过程中0~20B、C、D 分别在 5、10、15 时刻到达依次排队。A 完成后系统按 B→C→D 顺序服务。三个时间指标完成时间 开始时间 运行时间周转时间 完成时间 − 到达时间从提交到完成的总耗时带权周转时间 周转时间 / 运行时间单位服务时间对应的等待代价进程完成时间周转时间带权周转时间A20201B35302C40306D50353.5问题暴露进程 C 只要 5 个时间单位的服务却等了 30 个时间单位带权周转时间高达 6。这就是 FCFS 的典型问题——短作业被长作业拖累。四、FCFS 的优缺点优点实现最简单一个 FIFO 队列搞定公平性好按序服务无饥饿开销小不需要复杂优先级计算上下文切换成本低善待长作业和 CPU 密集型作业一旦获得 CPU 就能持续运行不被打断缺点1. 不利于短作业短作业排在长作业后面等待时间可能极长。2. 护航效应Convoy Effect——FCFS 最著名的缺陷一个大作业CPU 密集型占着 CPU 不放后面排队的许多小作业I/O 密集型只能干等。一支车队被一辆慢车挡住后面的快车全被迫低速行驶。期间 I/O 设备可能完全空闲资源严重浪费。3. 平均等待时间可能很长一个长作业率先到达后续所有作业的等待时间都会被拉长。4. 不适合交互式系统分时系统、实时系统需要快速响应FCFS 保证不了。五、代码实现structJCB{intid;// 作业号doublesubmittime;// 提交时间doubleruntime;// 运行时间doublestarttime;// 开始时间doublefinishtime;// 完成时间doublecycletime;// 周转时间doubleqtt;// 带权周转时间};voidFCFS(intnum){for(inti0;inum;i){if(i0){// 第一个作业开始时间 提交时间jcb[i].starttimejcb[i].submittime;}else{// 提交时间早于上一个完成时间 → 需要等待if(jcb[i].submittimejcb[i-1].finishtime){jcb[i].starttimejcb[i-1].finishtime;}else{jcb[i].starttimejcb[i].submittime;}}jcb[i].finishtimejcb[i].starttimejcb[i].runtime;jcb[i].cycletimejcb[i].finishtime-jcb[i].submittime;jcb[i].qttjcb[i].cycletime/jcb[i].runtime;}}关键步骤先按到达时间排序再依次计算每个进程的开始、完成、周转时间。六、适用场景虽然缺陷明显FCFS 仍有它的用武之地批处理系统作业不需用户交互简单就是优势作业长度相近所有任务执行时间差不多时FCFS 表现理想CPU 密集型为主需要长时间计算的任务FCFS 不会频繁打断对响应时间不敏感能接受等待的场景七、总结FCFS 是操作系统调度家族的基础款。它的核心价值是简单 公平——用最朴素的方式解决了谁先运行的问题。但朴素本身也是代价护航效应让短作业苦等平均等待时间居高不下。所以现代操作系统很少单独使用 FCFS更多是把它作为更复杂算法如多级反馈队列的一个组件。学习 FCFS不只是学一个算法更是理解调度思想演进的起点——从「先来后到」的朴素公平到「短作业优先」的效率追求再到「时间片轮转」的交互体验保障每一步改进都在解决前一步留下的痛点。