CPU调度
CPU调度是指多任务操作系统的基础,目的是使得CPU尽可能用于执行指令,从而提高CPU效率。
CPU调度可分为三种,长程调度、中程调度、短程调度。
有些进程状态的改变需要CPU的干预,因为进程间存在竞争,需要操作系统选择一个进程来进行这种转换。
长程调度
“道”(有的也叫“度”):允许在内存运行的最多进程数。
并不是每个用户创建的进程都能马上被装入内存去运行。每个用户创建进程的初始状态是“新建”,处于新建状态的进程一般首先被放到外存的进程池中,操作系统的调度程序才从新建状态选择一个进入内存并转换为就绪状态。这种从“新建”转换到“就绪”状态的操作就是长程调度,又称为作业调度或高级调度。
短程调度
又称为CPU调度、进程调度或低级调度。在就绪队列中可能存在不止一个进程,当CPU空闲时,操作系统需要从就绪队列中挑选一个进程让它运行。
长程调度 VS 短程调度
相比物 | 切换频率角度 | 切换开销角度 | 操作系统中 |
---|---|---|---|
短程调度 | 频率高、速度快 | 开销小(毫秒级,切换快) | 必需 |
长程调度 | 频率低、速度慢 | 开销大(秒/分级,切换慢) | 可选 |
中程调度(交换)
即一个进程在内存和外存间的换进换出,最大的目的是节省内存。
从本质上讲,中程调度不属于进程管理的内容,而应该属于内存管理。
当一个进程在内存中长期不运行时,会造成内存浪费。把这些进程从内存换到外存,从而腾出内存空间供运行进程使用。反之,当一个外存的进程接下来需要运行时,操作系统则执行换入操作,把这个进程从外存换入内存。
为了方便进行CPU调度,操作系统需要对不同状态的进程进行组织和管理。为此,为某些特定的状态设立了一个或多个进程队列,用于管理这些进程。
进程调度队列
就绪队列:在主内存中处于就绪状态并等待执行的所有进程集合;
设备队列:等待某一I/O设备的进程队列
进程的执行过程实际上就是进程在各种队列之间的迁移。
就绪队列和各种I/O设备队列如下图:
CPU调度过程
- 调度程序(Scheduler)
根据某种策略选择一个就绪进程。一个CPU同时只能运行一个进程。 - 分派程序(Dispatcher)
负责把CPU的控制权转交CPU调度程序;切换上下文;切换到用户态;跳转到用户程序的适当位置并重新运行之。
具体过程如下:
① 利用定时器把CPU的控制权转交给CPU调度程序,让调度程序选择一个需要运行的进程;
② 进行进程的上下文切换,把该进程从就绪状态转换到运行状态;
③ 系统切换到用户态,跳转到用户程序的适当位置并重新运行之。
分派延迟——分派程序终止一个进程的运行并启动另一个进程运行所花的时间。
调度方式
(1)非抢占调度
- 一旦把CPU分配给某进程后,系统不可以抢占已分配的CPU并分配给其他进程;
- 只有进程自愿释放CPU,才可把CPU分配给其他进程;
- 优点:易实现,调度开销小,适合批处理系统;
- 缺点:响应时间长,不适合交互式系统。
(2)抢占调度
- 调度程序可根据某种原则暂停某个正在执行的进程,将已分配给它的CPU重新分配给另一进程。
- 可防止单一进程长时间独占CPU;
- 系统开销大;
两种调度方式的区别在于运行进程是否是自愿放弃CPU。
CPU调度时机
CPU调度可能发生在当一个进程:
- 从运行转到等待(非抢占式)
- 从运行转到就绪(抢占式)
- 从等待转到就绪(抢占式)
- 终止运行