OS之《CPU调度》
CPU调度层次
- 高级调度:是作业调度。将外村的作业加载到内存里,分配对应的资源,然后加入就绪队列
- 低级调度:将就绪队列中的进程调度到CPU执行
- 中级调度:为了提高内存的利用率和系统的吞吐量,将暂时不能运行的进程调到外存等待。也称为挂起状态
调度算法的目标
- 资源利用率:CPU有效的工作时间/(CPU有效的工作时间+空闲等待时间)
- 公平:避免发生饥饿现象
- 平衡:有的程序中会出现网络IO,磁盘IO,或者是CPU计算密集型,运行的时候要让他们都忙起来,相对平衡。这也是为什么IO行进程要先被调度执行的原因。
- 强制策略执行:有些进程必须按照设定的优先级或者指定时间来执行。即使是对其他的进程造成延迟也要执行。
批处理系统的目标
- 平均周转时间短:周转时间是指从作业提交,到作业完成时间;
- 系统吞吐量:单位时间内,完成的作业数量
- 处理机利用率
分时系统目标
- 响应时间快:作业提交到开始收到响应的时间
- 均衡性:用户提交的作业执行的复杂度肯定都不一样,系统根据不同的复杂度,调度执行,最后得到的响应时间应该是复杂的任务时间长,简单的任务响应时间短。
实时系统目标
- 能保证截止时间:
- 可预测性:可以预测用时
作业调度算法
- 先来先服务:短作业的可能排到后面,不能及时响应
- 短作业优先:多数都是短作业的话,对长作业不利;计算作业的长短麻烦,并且不准确
- 按照优先级调度:
- 高响应比:(等待时间+要求服务时间)/要求服务时间 ; 等待时间+要求服务时间 = 响应时间 ;缺点还是计算执行时间对系统有较大开销
进程调度任务
- 保存cpu现场信息。如程序计数器、多个通用寄存器的内容等
- 按照某一种算法选取进程。从就绪队列里面选一个出来,修改进程的状态为运行态
- 把cpu分配给进程。讲PCB中的数据恢复到寄存器上,把执行权限交给进程
进程调度机制
- 排队器:将就绪进程排成一个或多个队列
- 分配器:将就绪队列中的进程选一个出来】
- 上下文切换:切换有两个操作
- 将当前进程的cpu寄存器上的数据保存到PCB中
- 把新的进程现场信息装入各个对应寄存器中
在上下文切换的时候需要执行大量的load 和story等操作指令,这些指令即使是在现代的计算机上,执行的耗时时间也可以上千调指令。因此现在大多数计算机,一般都采用用两组或多组寄存器,其中一组寄存器是内核态使用,一组是应用程序使用。这样在上下文切换的时候,只需要改变指针,让他指向当前寄存器组就可以了
进程调度算法
- 轮转调度算法:每个一段时间就产生一次中断,激活进程调度程序,完成进程调度;时间片大小不好确定。
- 优先级调度算法:
a.抢占式和非抢占式;非抢占式就要等到进程任务执行完成;
b.静态优先级:系统开销小,但是不够精准;可能会出现低优先级的任务得不到调用
c.动态优先级:解决了饥饿问题;动态计算更精准 - 多级返回队列:优先级越高的队列,时间片越小;如果没有执行完,就加入下一个队列的队尾;如果入到抢占式进程进来,就要吧当前正在运行的进程放大它所在队列的队尾;
影响调度的因素:
进程PCB中,就绪时间,开始时间,截止时间,处理时间,资源要求,优先级对调度都是有影响的。
所以,在实际代码中,即使你设置了线程优先级等参数,实际调用还是操作系统说了算。
本文来自博客园,作者:Eular,转载请注明原文链接:https://www.cnblogs.com/euler-blog/p/18600037
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY