1、线程调度
1.1 抢占式调度
抢占式调度是指每个线程都以抢占的方式获取CPU资源并快速执行,在执行完毕后立即释放CPU资源。在抢占式调度模式下,每个线程对CPU资源的申请地位是相等的,一个线程堵塞不会导致整个进程性能下降,具体流程如图:
1.2 协同式调度
协同式调度是指某个线程在执行完毕后主动通知操作系统将CPU资源切换到另一个线程上执行。
协同式调度的缺点是如果其中一个线程因为外部原因运行阻塞,会导致整个系统阻塞甚至崩溃。
具体流程如图:
1.3 Java线程调度的实现:抢占式
Java采用抢占式调度的方式实现内部的线程调度。Java会为每个线程按照优先级高低分配不同的CPU时间片,优先级高的线程优先执行。Java的线程调度在保证效率的前提下会尽量保证公平性。
1.4 线程让出CPU情况
- 当前线程主动放弃CPU,如线程调用了yield()放弃CPU的使用权。
- 当前运行的线程进入阻塞状态,如调用文件读取I/O操作、锁等待、Socket等待。
- 当前线程运行结束。
2、进程调度算法
进程调度算法包括优先调度算法、高优先权优先调度算法和基于时间片的调度算法。
2.1 优先调度算法
优先调度算法包含先来先服务调度算法和短作业优先调度算法。
1.先来先服务调度算法
先来先服务调度算法在获取到可用的CPU资源时会从就绪队列中选择一个最早进入队列的进程,为其分配CPU资源并运行。
2.短作业优先调度算法
短作业优先调度算法在获取到可用的CPU资源时会从就绪队列中选择一个预估运行时间最短的进程,为其分配CPU资源并运行。
2.2 高优先权优先调度算法
高优先权优先调度算法在定义任务的时候为每个任务都设置不同的优先权,在进行任务调度时优先权最高的任务首先被调度。
1.非抢占式优先调度算法
非抢占式优先调度算法在获取到可用的CPU资源时会从就绪队列中选出一个优先权最高的进程,为其分配CPU资源并运行。进程在运行过程中一直持有该CPU,直到进程执行完毕或发生异常而放弃该CPU。
2.抢占式优先调度算法
抢占式优先调度算法首先把CPU资源分配给优先权最高的任务并运行,但如果在运行过程中出现比当前任务优先权更高的任务,就会暂停运行该任务并回收CPU资源,新的优先权更高的的任务会获取CPU资源。
3.高响应比优先调度算法
高响应比优先调度算法使用了动态优先权的概念,即任务的优先权越短,其优先权越高,任务的等待时间越长,优先权越高。
优先权变化规律如下:
- 在作业的等待时间相同时,运行时间越短,优先权越高。
- 在作业的运行时间相同时,等待时间越长,优先权越高。
- 作业的优先权随作业的等待时间的增加而不断提高。
2.3 时间片的轮转调度算法
时间片的轮转调度算法将CPU资源分成不同的时间片,不同的时间片为不同的任务服务,包括时间片轮转法和多级反馈队列调度算法。
1.时间片轮转法
队列中的任务轮流获取一定的CPU时间片去运行。
2.多级反馈队列调度算法
多级反馈队列调度算法在时间片轮转算法的基础上设置多个就绪队列,并为每个就绪队列,并为每个就绪队列都设置不同的优先权。队列的优先权越高,队列中的任务被分配的时间片就越大。默认第一个队列优先权最高,其他次之。