搞定线程与进程的调度算法只需三分钟

java中的线程与进程调度

线程调度

抢占式调度

​ 每个线程执行的时间、线程的切换都由系统控制,系统控制是值在系统某种运行机制下,可能每条线程都分同样的执行时间片,也可能是某些线程执行的时间片比较长,升值某些线程得不到执行的时间片。在这种机制下,一个线程的阻塞不会导致整个进程阻塞

协同式调度

​ 某一线程执行完毕后主动通知系统切换到另一个线程上执行,这种模式就像是接力赛一样。

​ 线程的执行时间由线程本身控制,线程切换可以预知,不存在多线程同步问题

  • 缺点:如果一个线程编写有问题,运行到一般就一直阻塞,那么可能导致整个系统崩溃

抢占式调度(JVM的线程调度实现)

​ java使用的线程调度使用的是抢占式调度,java中线程会按优先级分配CPU时间片运行,且优先级越高,越优先执行,但优先级高并不代表能独自占用执行时间片,可能是优先级高得到越多的执行时间片,反之,优先级低的分到的执行时间少但不会分配不到执行时间

线程让出CPU的情况

  • 当前运行线程主动放弃CPU,JVM暂时放弃CPU操作(基于时间片轮转调度的JVM操作系统不会让线程永久放弃CPU,或者说放弃本次时间片的执行权,例如嗲用yield()方法)
  • 当前运行线程因为某些原因进入阻塞状态。例如阻塞在I/O
  • 当前运行线程结束,即运行完run()里面的任务

进程调度算法

优先调度算法

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

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

特点:算法比较简单,可以实现基本上的公平

短作业(进程)优先调度算法(SJF)

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

高优先权优先调度算法

​ 为了照顾紧迫型作业,引入了最高优先权优先(FPF)调度算法。系统将从后备队列中选择若干个优先权最高的作业装入内存。当用于进程调度时,该算法是把处理机分配给就绪队列中优先权最高的进程

非抢占式优先权算法

​ 系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直至完成。或因发生某时间使该进程放弃处理机时,这种调度算法主要用于批处理系统中。也可用于某些对实时性要求不严的实时系统中

抢占式优先权调度算法

​ 在这种方式下,系统通用是吧处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要出现优先权更高的进程,进程调度程序就立即停止当前进程的执行,重新将处理机进行分配。

高相应比优先调度算法

​ 在批处理系统中,短作业优先算法是一种比较好的算法,其主要的不足之处是长作业的运行得不到保证,如果我们能为每个作业引入前面所述的动态优先权,并使作业的优先级随着等待时间而增加。

此时优先权:

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

基于时间片的转轮调度算法

时间片轮转法

​ 在早起的时间片轮转法中,系统将所有的就绪线程按先来先服务的原则排成一个个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。

​ 当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便根据此信号来停止该进程的执行,并将它送到就绪队列的末尾,然后再把处理机分配给就绪队列中心的队首进程,同时让它执行一个时间片。

​ 这样就保证就绪队列中的所有进程在以给定的时间内均能获得一时间片的处理机执行时间

多级反馈队列调度算法

​ 应设置多个就绪队列,并为各队列赋予不同的优先级,第一队列的优先级最高,第二队列其次。该算法赋予各个大院里中进程执行时间片的大小也更不相同,在优先权越高的队列中,为每个进程所规定的执行时间片越小。

​ 当一个新进程进入内存后,首先将它放入第一队列的末尾,按照FCFS原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统,如果它在一个时间片结束时尚未完成,调度程序便将改进程转入第二队列的末尾,再按照FCFS原则等待调度执行

进程执行时,如它能在该时间片内完成,便可准备撤离系统,如果它在一个时间片结束时尚未完成,调度程序便将改进程转入第二队列的末尾,再按照FCFS原则等待调度执行

​ 仅当第一队列空闲时,调度程序才调度第二队列中的进程运行;仅当第 1~(i-1)队列均空时,才会调度第 i 队列中的进程运行。如果处理机正在第 i 队列中为某进程服务时,又有新进程进入优先权较高的队列(第 1~(i-1)中的任何一个队列),则此时新进程将抢占正在运行进程的处理机,即由调度程序把正在运行的进程放回到第 i 队列的末尾,把处理机分配给新到的高优先权进程

猜你喜欢

转载自blog.csdn.net/issunmingzhi/article/details/105573359