一、进程调度
按照某种算法,在就绪队列中选择一个进程为其分配处理机。
1.1 进程调度时机
需要进行进程调度与切换的情况
当前运行的进程主动释放处理机:
- 进程正常终止
- 运行过程中发生异常而终止
- 进程主动请求阻塞(如等待I/O)
当前运行的进程被动释放处理机:
- 分配给进程的时间片用完
- 有更紧急的事情需要处理(中断)
- 有更高优先级的进程进入就绪队列
不能进行进程切换的场景
- 处理中断的过程
- 进程在操作系统内核临界区
- 在原子操作过程中
1.2 进程调度的方式
1)非抢占式:
只允许进程主动地释放处理机,即使有更高优先级的任务到达,也会继续运行当前进程。除非该进程终止或者主动要求进入阻塞态。
这种方式只在早起操作系统中使用。
2)抢占式:
当更紧急的任务到达时,暂停当前进程,将处理机分配给更紧急的任务进程。
这种方式适用于现在的分时、实时操作系统。
1.3 进程调度算法
早期操作系统调度算法(交互性不好)
- 先来先服务(FCFS)
- 短作业优先(SJF Shortest Job First)
- 高响应比(HRRN)
1.3.1 先来先服务
优点:简单、公平、不会产生饥饿现象
缺点:对于长作业有利,对于排在长作业之后的短作业需要等待的时间很长。
1.3.2 短作业优先
优先调度运行时间短的进程
优点:平均等待时间和平均周转时间少
缺点:对长作业不利,会产生饥饿现象。
1.3.3 高响应比
FCFS在选择长作业运行时,没有考虑运行的时长,对短作业不有好。
SJF在选择短作业运行时,没有考虑各个作业的等待时间,对长作业不有好,甚至有饥饿问题。
响应比 = (运行时间 + 等待时间)/ 运行时间;
通过高响应比优先算法,既考虑了运行时间又考虑了等待时间。
优点:折中上述两种算法的缺点,不会饥饿
适用于交互性操作系统的进程调度算法:
- 时间片轮转
- 优先级调度
- 多级反馈队列
1.3.4 时间片轮转
按照进程到达就绪队列的顺序,轮流让这个进程执行一个时间片的时间,若一个进程没有执行完成,会被强行的剥夺处理机,重新放到就绪队列的尾部。
优点:公平、响应快、适用于分时操作系统,不会产生饥饿
缺点:高频率的切换进程,存在一定的开销;没有考虑任务的紧急程度。
1.3.5 优先级调度
如何合理的设置优先级?
- 系统进程高于用户进程
- 前台进程高于后台进程
- I/O型进程高于CPU繁忙型进程(因为调度I/O设备后,可以继续进行其他操作,提高了CPU的使用率)
优点:区分任务紧急程度、适用于实时操作系统、可灵活地调整对各种作业的偏好
缺点:可能会导致低优先级的进程饥饿
1.3.6 多级反馈队列
对其他所有的算法的折中。