操作系统——进程调度

进程调度方式:分抢占、抢占
调度性能的评价指标:CPU利用率、系统吞吐量、周转时间和带权周转时间、响应时间、对截止时间的保证

进程调度算法:

周转时间=完成时间-提交时间
带权周转时间=周转时间/要求执行时间

1.先来先服务算法(FCFS)
非抢占,因此不能保证紧迫性任务得到及时处理。
有利于长作业。

2.短作业优先调度算法(SJF)
如果两个进程运行时间相同,可使用FCFS。
可以是抢占,也可以是非抢占。
优点:SJF算法能有效降低作业的平均周转时间和平均带权周转时间,提高系统的平均吞吐量。
缺点:(1)实现困难 (2)不公平,对长作业可能饥饿 (3)没有考虑紧迫

3.高响应比优先算法
响应比=(要求服务时间+等待时间)/要求服务时间
非抢占。
不足:每次调度都要计算响应比增加系统开销。不能保证紧迫性任务得到处理。

4.优先级调度算法
(1)非抢占
(2)抢占:确保紧迫性任务得到及时处理

5.时间片轮转调度算法
就绪进程按先来先服务原则排成一个就绪队列,每次调度时,把CPU分配给队首进程,令其运行一个时间片。时间片用完时如果还没运行借书,就重新到就绪队列末尾排队。

在确定时间片长度时,应考虑以下几个因素:
(1)系统的响应时间:能接受的响应时间越长,时间片可适当延长
(2)就绪进程的数量:就绪进程越多,时间片越短
(3)进程调度及上下文切换的时间开销
(4)CPU运行指令的速度:越快,时间片可适当缩短

6.多级队列调度算法
(1)每个队列有自己独立的进程调度算法
(2)各队列之间的优先级不同。高优先级抢占。
不足:低优先级队列容易产生饥饿现象

7.多级反馈队列调度算法
(1)设置多个就绪队列,优先级递减,优先级最高的第一个队列时间片最短
(2)各队列内部按时间片轮转算法
(3)各队列之间采用抢占式优先级算法调度
不足:可能造成 低优先级的长作业 饥饿现象

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,进程调度算法是操作系统中非常重要的一部分。常见的进程调度算法有先来先服务(FCFS)、短作业优先(SJF)、高响应比优先(HRRN)、时间片轮转(RR)等。下面是这些算法的 Python 实现: 1. 先来先服务(FCFS): ```python def FCFS(processes): waiting_time = 0 turn_around_time = 0 completion_time = 0 for process in processes: completion_time += process['burst_time'] turn_around_time += completion_time - process['arrival_time'] waiting_time += turn_around_time - process['burst_time'] return waiting_time / len(processes), turn_around_time / len(processes) ``` 2. 短作业优先(SJF): ```python def SJF(processes): processes = sorted(processes, key=lambda x: x['burst_time']) waiting_time = 0 turn_around_time = 0 completion_time = 0 for process in processes: completion_time += process['burst_time'] turn_around_time += completion_time - process['arrival_time'] waiting_time += turn_around_time - process['burst_time'] return waiting_time / len(processes), turn_around_time / len(processes) ``` 3. 高响应比优先(HRRN): ```python def HRRN(processes): waiting_time = 0 turn_around_time = 0 completion_time = 0 for i, process in enumerate(processes): if i == 0: completion_time = process['burst_time'] else: response_ratio_list = [] for j in range(i): response_ratio = (completion_time - processes[j]['arrival_time'] + processes[j]['burst_time']) / processes[j]['burst_time'] response_ratio_list.append(response_ratio) max_response_ratio_index = response_ratio_list.index(max(response_ratio_list)) selected_process = processes.pop(max_response_ratio_index) completion_time += selected_process['burst_time'] turn_around_time += completion_time - selected_process['arrival_time'] waiting_time += turn_around_time - selected_process['burst_time'] return waiting_time / len(processes), turn_around_time / len(processes) ``` 4. 时间片轮转(RR): ```python def RR(processes, time_slice): waiting_time = 0 turn_around_time = 0 completion_time = 0 while processes: for i in range(len(processes)): if processes[i]['burst_time'] > time_slice: completion_time += time_slice processes[i]['burst_time'] -= time_slice else: completion_time += processes[i]['burst_time'] turn_around_time += completion_time - processes[i]['arrival_time'] waiting_time += turn_around_time - processes[i]['burst_time'] processes.pop(i) break return waiting_time / len(processes), turn_around_time / len(processes) ``` 这里的 `processes` 是一个列表,其中每个元素是一个字典,表示一个进程的信息,如下所示: ```python processes = [ {'name': 'P1', 'arrival_time': 0, 'burst_time': 8}, {'name': 'P2', 'arrival_time': 1, 'burst_time': 4}, {'name': 'P3', 'arrival_time': 2, 'burst_time': 9}, ... ] ``` 在这个列表中,每个进程有一个名称、到达时间和执行时间。你可以根据自己的需要修改这些信息,来测试这些进程调度算法的实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值