一、进程调度概念
在合适的时候以一定策略选择一个就绪进程运行
- 调度时机
- 调度策略
- 调度目标
调度目标
- 响应速度尽可能快
- 进程处理的时间尽可能短
- 系统吞吐量尽可能大
- 资源利用率尽可能高
- 对所有进程要公平
- 避免饥饿
- 避免死锁
目标原则之间存在自相矛盾
两个量化的衡量目标
- 周转时间/平均周转时间
- 带权周转时间/平均带权周转时间
周转时间:进程提交给计算机到最终完成所花费的时间
平均周转时间:平均周转时间越小,意味着系统吞吐量大,资源利用率越高
带权周转时间:为进程的周转时间/进程的运行时间(含义:进程在系统相对停留时间)
二、典型的调度算法
1、先来先服务调度(FCFS)
类似于排队
算法
- 按照作业进入系统的时间先后来挑选作业。先进先运行。
特点:容易实现,效率不高
此算法不利于短作业。
2、短作业优先调度算法(SJF)
算法:参考运行时间,选取运行时间最短的作业投入运行
特点:容易实现,效率不高
此算法会使长作业产生饥饿状态
3、响应比高者优先调度算法
响应比定义
- 作业的响应时间与运行时间的比值
算法:计算每个作业的响应比,选择响应比最高的作业优先投入运行
特点:
- 响应比=1+等待时间/运行时间
- 等待时间相同,则运行时间越短的作业越容易被调度,有利于短作业
- 运行时间相同,则等待时间越长的作业月容易被调度,有利于长作业
4、优先数调度算法
算法:
- 根据进程优先数,把CPU分配给最高的进程
- 进程优先数=静态优先数+动态优先数
静态优先数的确定
- 基于进程所需的资源多少
- 基于程序运行时间长短
- 基于进程的类型
动态优先数的确定
- 当使用CPU超过一定时长时
- 当进行I/o操作后
- 当进程等待超过一定时长时
5、循环轮转调度法
概念:
把所有就绪进程按先进先出的原则排成队列。新来进程加到队尾。
进程以时间片q为单位轮流使用CPU。刚刚运行一个时间片的进程排到队列末尾,等候下一轮运行
队列逻辑是循环的
优点:
- 公平性
- 交互性
改进
- 时间片的大小可变
- 组织多个就绪队列
三、Linux进程调度
进程类型
普通进程
- 采用动态优先级来调度
- 调度程序周期性地修改优先级(避免饥饿)
实时进程
- 采用静态优先级来调度
- 由用户预先指定,以后不会改变
静态优先级和动态优先级
调度策略
实时进程
- 先进先出
- 时间片轮转
非实时进程(普通进程)
- 动态优先级
调度时机
- 中断处理过程
- 中断处理过程返回用户态
- 内核线程可直接调用进行进程切换
- 用户态进程只能通过陷入内核后在中断处理过程被调用
进程切换
概念
- 内核挂起当前CPU上的进程并恢复之前挂起的某个进程
- 任务切换、上下文切换
进程调度和切换的流程
- 进程调度算法
- 切换进程上下文