搞定调度算法只需三分钟

java中的线程与进程调度

调度程序:操作系统选择一个进程运行

调度时机

​ 在进程的生命周期中,当进程从一个运行状态到另一个状态变化的时候,会触发一次调度。

​ 这些状态变化的时候,操作系统需要考虑是否要让新的进程给CPU运行,或者是否让当前进程从CPU上退出而换另一个进程运行。

调度算法

​ 如果硬件时钟提供某个频率的周期性中断,那么可以根据如何处理时钟中断,把调度方法分为两类

非抢占调度算法

​ 挑选一个进程,然后让该进程运行直到被阻塞,或者直到该进程退出,才会调用另外一个进程,也就是说不理会时钟中断这个事情

抢占式调度算法

​ 挑选一个进程,然后让进程只运行某段时间,时段结束时,把其挂起,然后再挑选另外一个进程。

​ 需要在时间间隔的末端发生时钟中断,以便把CPU控制返回给调度程序进行调度。也就是时间片机制

​ 避免因为某个线程的原因阻塞整个进程

调度的原则

  • CPU利用率
    • 当发生了I/O请求,导致CPU空闲,就需要从就绪队列中选择一个进程来运行
  • 系统吞吐量
    • 调度程序要权衡长任务和短任务进程的运行完成数量
  • 周转时间
    • 调度程序应避免进程等待时间很长而运行时间很短的情况,从而造成周转时间过长。
  • 等待时间
    • 调度程序应尽可能减少就绪进程的等待时间
  • 响应时间
    • 对于交互式比较强的应用,响应时间尽可能的短

调度算法

​ 在单核CPU系统中常见的调度算法

先来先服务调度算法(FCFS)

​ 每次调度是从就绪队列中选择一最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机

  • 特点:算法比较简单,可以实现基本上的公平,但不利于短作业
  • 适用:FCFS 对长作业有利,适用于 CPU 繁忙型作业的系统,而不适用于 I/O 繁忙型作业的系统。
短作业优先调度算法(SJF)

​ 是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。

​ 该算法未照顾紧迫型作业。对长作业也不友好

高响应比优先调度算法

​ 为了很好的权衡短作业和长作业,而推出的算法。

​ 根据响应比优先级来确定先后顺序。

此时优先级:

  • 如果作业的等待时间相同,则要求服务的时间越短,其优先级越高,有利于短作业
  • 如果要求服务的时间相同时,作业优先权决定与等待时间,等待时间越长,其优先权越高
  • 对于长作业,作业的优先级会随着等待时间的增加而增加,当其等待时间足够长时,其优先级会很高。
  • 但是在进行调度之前,需要先做响应比的计算,会在一定程度上增加系统开销。
时间片轮转法(RR)

​ 最古老、最简单、最公平且使用最广的算法就是时间片轮转。

​ 每个进程都被分配一个时间段(时间片),即允许该进程在该时间段中运行。

  • 如果时间片用完,进程还在运行,那么就会把此进程从CPU中释放出来,并把CPU分配给另外一个进程
  • 如果该进程在时间片结束前阻塞或失结束,则CPU立即进行切换。

时间片的长度就尤为重要一般为20ms~50ms

  • 太短,导致频繁的进程上下文切换,降低CPU效率
  • 太长,引起对短作业进程的响应时间变长。
最高优先级调度算法(HPF)

​ 所谓的最高优先级调度算法,就是从就绪队列中选择最高优先级的进程进行运行。

分类:

  • 静态优先级:创建进程的时候,就已经确定了优先级,然后整个运行期间都不会变化
  • 动态优先级:根据进程的动态变化调整优先级,比如如果进程运行时间增加,则降低其优先级,如果进程等待时间(就绪队列的等待时间)增加,则升高其优先级,也就是随着时间的推移增加等待进程的优先级
处理方法
  • 非抢占式:当就绪队列中出现优先级高的进程,运行完当前进程,再选择优先级高的进程。
  • 抢占式:当就绪队列中出现优先级高的进程,当前进程挂起,调度优先级高的进程运行。
多级反馈队列调度算法(MFQ)

​ 多级反馈队列调度算法是时间片轮转算法和最高优先级算法的总和和发展。

  • 多级:表示有多个队列,每个队列优先级从高到低,同时优先级越高时间片越短
  • 反馈:表示如果有新的进程加入优先级高的队列时。立即停止当前正在运行的进程,转而去运行优先级高的队列。
工作方式
  • 设置了多个队列,赋予每个队列不同的优先级,每个队列优先级从高到低,同时优先级越高时间片越短
  • 新的进程会被放入到第一级队列的末尾,按先来先服务的原则排队等待被调度,如果在第一级队列规定的时间片没运行完成,则将其转入到第二级队列的末尾,以此类推,直至完成;
  • 当较高优先级的队列为空,才调度较低优先级的队列中的进程运行。如果进程运行时,有新进程进入较高优先级的队列,则停止当前运行的进程并将其移入到原队列末尾,接着让较高优先级的进程运行;

最后

  • 如果觉得看完有收获,希望能给我点个赞,这将会是我更新的最大动力,感谢各位的支持
  • 欢迎各位关注我的公众号【java冢狐】,专注于java和计算机基础知识,保证让你看完有所收获,不信你打我
  • 如果看完有不同的意见或者建议,欢迎多多评论一起交流。感谢各位的支持以及厚爱。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值