操作系统的中央处理器调度算法是指在多道程序环境下,为了让各个进程能够合理地使用CPU资源,从而提高CPU利用率和系统性能而采用的一种算法。下面将介绍几种常见的CPU调度算法。
先来先服务(FCFS)
FCFS是最简单的调度算法,即按照进程到达的顺序,依次分配CPU资源。被称作先来先服务,即进程按照到达时间排入一个队列,等待CPU资源。这种调度算法,容易被饥饿进程的问题所困扰,同时也没有考虑到运行时间的长短,导致一些短进程需要长时间等待。
最短作业优先(SJF)
SJF是基于预测或统计出的进程运行时间,为进程分配CPU资源。算法分为非抢占和抢占两种:
非抢占式SJF
非抢占式SJF算法,会根据进程初始运行时间对所有生成的进程进行排序,然后依次执行。在某些情况下,这种调度算法可能会导致饥饿进程。
def SJF_non_preemptive(processes):
n = len(processes)
processes = sorted(processes, key=lambda x: x[1])
waiting_time = 0
total_time = processes[0][1]
for i in range(1, n):
waiting_time += total_time - processes[i][0]
total_time += processes[i][1]
return waiting_time / n
抢占式SJF
抢占式SJF算法,会在一个进程剩余运行时间小于当前进程剩余时间时,切换到此进程。这种情况可能会导致在短进程执行时,出现调度开销太大的问题。
def SJF_preemptive(processes):
n = len(processes)
processes = sorted(processes, key=lambda x: x[1])
total_time = 0
waiting_time = 0
for i in range(n):
min_loc = 0
for j in range(1, n):
if processes[j][0] <= total_time and \
processes[j][1] < processes[min_loc][1]:
min_loc = j
waiting_time += total_time - processes[min_loc][0]
total_time += processes[min_loc][1]
processes[min_loc][1] = 999999999
return waiting_time / n
轮询调度(Round-Robin)
轮询调度又叫时间片调度,是一种常见的调度算法,它将所有等待CPU的进程排成就绪队列,并让每个进程在每个“时间片”中执行。在每个时间片结束时,进程被强制切换到就绪队列的尾部,以此循环往复。
def Round_Robin(processes, quantum):
n = len(processes)
total_time = 0
waiting_time = 0
remaining_time = [processes[i][1] for i in range(n)]
waiting_for_too_long = [False for i in range(n)]
while True:
done_flag = True
for i in range(n):
if remaining_time[i] > 0:
# process is not completed yet
done_flag = False
running_time = min(remaining_time[i], quantum)
remaining_time[i] -= running_time
total_time += running_time
if remaining_time[i] == 0:
waiting_time += total_time - processes[i][1]
waiting_for_too_long[i] = False
else:
waiting_for_too_long[i] = True
if done_flag:
break
return waiting_time / n
以上就是常见的几种CPU调度算法。根据不同的场景和需求,可以选择合适的调度算法来提高系统性能和CPU利用率。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:操作系统的中央处理器调度算法有哪些? - Python技术站