操作系统(二):4.CPU调度、进程调度的时机、调度算法的评价指标


一、CPU调度

在这里插入图片描述

1.三个层次

在这里插入图片描述

层次任务调度发生频率进程状态变化
高级调度
(作业调度)
调度处于后备队列中的作业,创建进程外存→内存最低无→创建态→就绪态
中级调度
(内存调度)
调度处于挂起队列中的进程外存→内存中等就绪挂起态→就绪态
阻塞挂起态→阻塞态
低级调度
(进程调度)
调度处于就绪队列中进程内存→CPU最频繁就绪态→运行态

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.七状态模型

在这里插入图片描述

  • “就绪挂起态"和"就绪态”、"阻塞挂起态"和"阻塞态"之间分别可以相互转换。
  • 当等待事件出现时,“阻塞挂起态"可以变为"就绪挂起态”(PCB是在内存中的,OS改版PCB内的状态标志就行)
  • 创建好PCB后,没内存时,可以直接调入外存中成为"就绪挂起态"。
  • 进程下CPU时可以直接调到外存,“运行态"变成"就绪挂起态”。

二、进程调度的时机与方式

这里的进程调度就是上面的低级调度的详细理解。
在这里插入图片描述

1.调度与切换

在这里插入图片描述

2.什么时候需要调度

在这里插入图片描述

3.什么时候不能进行进程调度

在这里插入图片描述
【在处理中断的过程中】
中断处理过程复杂,与硬件密切相关,很难做到在中断处理过程中进行进程切换。

【OS内核程序临界区与临界区】
在这里插入图片描述

  • OS内核程序临界区用来访问某种内核数据结构。如果不尽快释放的话,极有可能影响到OS内核的其他管理工作。因此在访问内核程序临界区期间不能进行调度与切换。
  • 如外设I/O很慢,如果不允许进程调度的话,CPU大部分时间在空闲。普通临界区访问的临界资源不会直接影响OS内核的管理工作。因此在访问普通临界区时可以进行调度与切换。

4.方式

在这里插入图片描述

三、调度算法的评价指标

在这里插入图片描述

1.利用率

在这里插入图片描述

2.系统吞吐量

在这里插入图片描述

3.计算时间

(1)周转时间

在这里插入图片描述

(2)等待时间

在这里插入图片描述
在这里插入图片描述

(3)响应时间

在这里插入图片描述

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python本身并不是操作系统,因此不能直接进行进程调度。但是,Python提供了一些模块可以用于操作系统编程,如`os`、`subprocess`等模块。如果你想了解操作系统进程调度算法SPF的Python实现,可以参考以下代码: ```python import heapq class Process: def __init__(self, pid, arrival_time, burst_time): self.pid = pid self.arrival_time = arrival_time self.burst_time = burst_time self.remaining_time = burst_time def __lt__(self, other): return self.remaining_time < other.remaining_time def execute(self, time): if self.remaining_time > time: self.remaining_time -= time return False else: return True def spf(processes): n = len(processes) processes.sort(key=lambda p: p.arrival_time) ready_queue = [] current_time = 0 completed_processes = [] i = 0 while i < n or ready_queue: while i < n and processes[i].arrival_time <= current_time: heapq.heappush(ready_queue, processes[i]) i += 1 if not ready_queue: current_time = processes[i].arrival_time continue p = heapq.heappop(ready_queue) if p.execute(1): p.completion_time = current_time + 1 completed_processes.append(p) else: heapq.heappush(ready_queue, p) current_time += 1 return completed_processes # Example usage processes = [ Process(1, 0, 5), Process(2, 1, 3), Process(3, 2, 8), Process(4, 3, 6), Process(5, 4, 2) ] completed_processes = spf(processes) for p in completed_processes: print(f"Process {p.pid} completed at time {p.completion_time}") ``` 这段代码实现了SPF(Shortest Process First)算法,它按照进程的剩余执行时间来进行调度。在这个实现中,`Process`类表示一个进程,`spf`函数接受一个进程列表并返回已完成的进程列表。在`spf`函数中,我们首先按照到达时间对进程进行排序,然后使用一个堆作为就绪队列,每次选择剩余执行时间最短的进程执行。如果有多个进程剩余执行时间相同,则选择先到达的进程。在每个时间片结束时,如果进程已经执行完毕,则将其加入已完成列表,否则将其重新加入就绪队列。最后,返回已完成的进程列表。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值