4-21-22-java线程调度和算法

文章目录
  1. 1. 线程调度
    1. 1.1. 两种调度
      1. 1.1.1. 抢占式调度(系统控制)
      2. 1.1.2. 协同式调度(线程本身控制)
    2. 1.2. jvm使用抢占式调度
      1. 1.2.1. 出让cpu
    3. 1.3. 调度算法
      1. 1.3.1. 1.先来先服务调度算法
      2. 1.3.2. 2.短作业优先调度算法
      3. 1.3.3. 3. 高优先级调度算法
      4. 1.3.4. 4.基于时间片的轮转调度算法

线程调度

两种调度

抢占式调度(系统控制)

抢占式调度指的是每条线程执行的时间、线程的切换都由系统控制。在这种机制下,一个线程的堵塞不会导致整个进程堵塞。

协同式调度(线程本身控制)

协同式调度指某一线程执行完后主动通知系统切换到另一线程上执行,这种模式就像接力赛一样,一个人跑完自己的路程就把接力棒交接给下一个人,下个人继续往下跑。

线程的执行时间由线程本身控制,线程切换可以预知,不存在多线程同步问题,但它有一个致命弱点:如果一个线程编写有问题,运行到一半就一直堵塞,那么可能导致整个系统崩溃

jvm使用抢占式调度

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

出让cpu

  1. yield暂时主动放弃cpu操作
  2. 进入阻塞,例如i/o
  3. 线程运行结束

调度算法

1.先来先服务调度算法

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

2.短作业优先调度算法

该算法未照顾紧迫型作业。

3. 高优先级调度算法

  1. 非抢占式优先权算法

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

  2. 抢占式

    只要又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进程(原优先权最高的进程)的执行,重新将处理机分配给新到的优先权最高的进程。要求比较严格的实时系统中,以及对性能要求较高的批处理和分时系统中。

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

时间片的大小从几 ms 到几百 ms。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。这样就可以保证就绪队列中的所有进程在一给定的时间内均能获得一时间片的处理机执行时间。