先来先服务(First - Come, First - Served,FCFS)
先来先服务(First - Come, First - Served,FCFS)调度算法是一种最简单的进程调度算法,广泛应用于操作系统的进程调度和作业调度中,下面从多个方面为你详细介绍:
基本原理
该算法按照进程进入就绪队列的先后顺序来分配CPU资源。当一个进程进入就绪队列时,它会被排在队列的尾部。调度程序总是选择就绪队列中最前面的进程,将CPU分配给它执行,直到该进程完成或因某种原因阻塞,才会从就绪队列中选择下一个进程。
示例说明
假设有三个进程P1、P2、P3,它们到达就绪队列的时间和所需的执行时间如下:
P1 | 0 | 5 |
P2 | 1 | 3 |
P3 | 2 | 8 |
- 在时间0,P1到达并进入就绪队列,由于此时只有P1,所以P1开始执行。
- 在时间1,P2到达并进入就绪队列尾部,此时P1正在执行,所以P2等待。
- 在时间2,P3到达并进入就绪队列尾部,P1继续执行。
- 直到时间5,P1执行完毕,此时调度程序从就绪队列中选择最前面的P2,P2开始执行。
- 在时间8,P2执行完毕,调度程序选择P3,P3开始执行,直到时间16执行完毕。
算法实现
在操作系统中,FCFS算法可以通过一个队列来实现。进程到达时,将其加入队列尾部;调度时,从队列头部取出进程执行。以下是一个简单的Python代码示例,模拟FCFS调度算法:
class Process:
def __init__(self, pid, arrival_time, burst_time):
self.pid = pid
self.arrival_time = arrival_time
self.burst_time = burst_time
self.start_time = None
self.completion_time = None
self.turnaround_time = None
self.waiting_time = None
def fcfs(processes):
processes.sort(key=lambda x: x.arrival_time)
current_time = 0
for process in processes:
if current_time < process.arrival_time:
current_time = process.arrival_time
process.start_time = current_time
current_time += process.burst_time
process.completion_time = current_time
process.turnaround_time = process.completion_time - process.arrival_time
process.waiting_time = process.turnaround_time - process.burst_time
return processes
# 示例进程
processes = [
Process(1, 0, 5),
Process(2, 1, 3),
Process(3, 2, 8)
]
scheduled_processes = fcfs(processes)
# 输出结果
for process in scheduled_processes:
print(f"进程 {process.pid}:")
print(f" 开始时间: {process.start_time}")
print(f" 完成时间: {process.completion_time}")
print(f" 周转时间: {process.turnaround_time}")
print(f" 等待时间: {process.waiting_time}")
优缺点
- 优点
- 实现简单:该算法的逻辑简单,不需要复杂的计算和数据结构,易于实现和理解。
- 公平性:每个进程按照到达的先后顺序依次执行,对所有进程一视同仁,不会出现饥饿现象。
- 缺点
- 平均等待时间长:如果先到达的进程执行时间很长,后到达的短进程需要等待很长时间,导致平均等待时间和平均周转时间较长,系统的整体性能可能受到影响。
- 不利于短作业:在实际应用中,短作业往往希望能够尽快完成,而FCFS算法可能会使短作业长时间等待,降低了系统的吞吐量和响应速度。
先来先服务调度算法适用于对进程执行顺序有严格要求,且对平均等待时间和响应时间要求不高的场景。
#牛客创作赏金赛#操作系统I 文章被收录于专栏
操作系统(Operating System,简称 OS)是管理计算机硬件与软件资源的核心程序,是用户与硬件之间的桥梁,也是计算机系统的核心组成部分。