前两篇博客都是在讲操作系统进程,包括进程状态、PCB、进程同步、通信、线程等——我的操作系统复习——进程(上) 和 我的操作系统复习——进程(下),本篇开始讲处理器调度,包括处理机调度算法、死锁等。
一、处理机调度的类型
处理机调度程序按照某种算法将处理机分配给某个进程,这就叫处理机调度。总体而言,按层次分,有三种类型:
(1)作业调度(又称高级调度、长程调度)。
作业调度的本质就是根据某种算法,把外存上的作业调入内存,并为之创建进程,分配处理机并执行。这里有两个概念:
1)作业(Job)
在操作系统概述中,我们了解过操作系统的发展历程,在单道批处理系统和多道批处理系统中粗略了解过作业的概念。作业是一个比程序更广泛的概念,可以包含多个程序和数据,还包含一份作业说明书,处理机根据作业说明书来对作业中的程序进行控制。一般而言,批处理系统中才会有高级调度。
2)作业步(Job Step)
作业步的本质就是程序。作业运行过程中的每一个步骤可以称为一个作业步。典型的作业可分为三个作业步:编译作业步->连续装配作业步->运行作业步。相当于我们的程序代码的整个执行步骤。
(2)进程调度(又称低级调度、短程调度)。
进程调度的本质就是根据某种算法,把处理机分配给进程。进程调度首先会保存处理机现场。将程序计数器等指定寄存器中的内容保存到PCB中。然后将按照某种算法从就绪队列中选取进程,把处理机分配给进程。最后,把指定进程的PCB中的处理机现场信息恢复到处理机中,处理机分配给进程执行。这里需要额外的了解一下进程调度中的三个基本机制和两种调度方式:
1)进程调度中的三个基本机制
- 排队器。将所有的就绪进程按照一定方式 (如优先级)排成一个队列,以便调度程序找到。
- 分派器。把从就绪队列中取出的进程,处理机上下文切换后,把处理机分配给该进程执行。
- 上下文切换机制。
(PS:这里有一个额外的知识:通常每一次上下文切换需要花费几毫秒的时间。有一种简单的方式,通过多组寄存器来减少上下文切换的时间。一组寄存器供处理机在系统态使用,一组供处理机在应用程序状态时使用。这样,上下文切换的时候只需要改变指针,指向当前的寄存器。)
(PSS:CPU的系统态就是CPU在执行操作系统,用户态则是CPU在执行普通应用程序。)
2)进程调度的两种调度方式
- 非抢占式(Nonpreemptive Mode)。说白了就是一旦把进程分配给某个进程,除非它自愿退出,它将永远运行下去。
- 抢占式(Preemptive Mode)。说白了就是可以根据某种条件,使正在运行的进程暂停,将处理机分配给另一个进程。相当于信号量机制中的条件变量。
(3)中级调度
中级调度的本质就是让暂时不能运行的进程挂起,释放内存资源,并把它们调到外存上去等待。什么是外存?外存就是硬盘、磁盘等存储设备。
二、调度算法
说到调度算法,那么有几个衡量进程运行效率的名词需要了解一下,在做题的时候需要用到:
- 服务时间:进程总共需要占用处理机的时间长度。
- 开始执行时间:进程开始执行的时间点。
- 完成时间:进程执行完毕的时间点。
- 周转时间:完成时间-到达时间。
- 带权周转时间:周转时间/服务时间。
- 到达时间:进程进入就绪队列的时间点
(1)先来先服务调度算法(FCFS)。
顾名思义。就是先来的先进入内存或占用处理机。对于作业调度,就是从后备作业队列中选择一个或多个最先进入队列的作业,将其调入内存。对于进程调度就是从就绪队列选择最新进入的进程,为之分配处理机。
(2)短作业(进程)优先调度算法(SJ(P)F)
顾名思义。就是在选择作业或进程的时候,先估算每个作业、进程的服务时间,选择其中最短的优先获得处理机。
(3)高优先权优先调度算法。
这种算法给进程加了一个属性,那就是优先权。这个算法的本质就是,高优先权的优先调用。优先权有两种类型,一种是静态的,即每个进程、作业的优先权在它创建的时候就已经确定,此后都不能改变。另一种是动态的,即进程、作业的优先权是可以改变的。最常见的做法就是进程、作业在等待中,优先权以一定速率随时间增长,这样等待时间越长,被调用的可能性就越大。
(4)基于时间片的轮转调度法。
这就是分时系统中采用的调度算法。原理就是把所有的就绪队列进程按先来先服务的原则排成队列。每次都把CPU分配给队首,让其执行一个时间片,执行完毕,调度器中断进程,并把该进程移至就绪队列的队尾,然后再取一个队首进程,继续执行下一个时间片。时间片是什么,就是一段很短的CPU时间,几毫秒到几百毫秒不等。
(5)多级反馈队列调度算法。
这是当下公认的比较好的,使用最广泛的调度算法。其原理也不难。例如,某计算机采用多级反馈队列调度算法,设置了5个就绪队列。第一个就绪队列优先级最高,时间片为2ms。第二个就绪队列优先级第二,时间片为4ms,其余队列也一样,优先级依次递减,时间片依次增加。如果某个进程进入就绪队列,首先把它放在第一个就绪队列的末尾,轮到它执行就执行2ms,时间片结束,若该进程还没有执行完毕,就把该进程移入第二个就绪队列的末尾。只有当第一个队列的进程都执行完时间片,才会执行第二个队列。如此依次执行,若该进程服务时间很长,将被移到最后一个就绪队列。在最后一个就绪队列,进程将按照时间片轮转调度法执行。处理机执行过程中,只有当优先级高的队列中的线程都执行完毕,才会执行优先级低的队列。如图所示(懒得自己画一遍了,直接从书上拿过来):
三、死锁
何谓死锁?即多个进程在运行过程中因争夺资源造成的一种僵局。
(1)、产生死锁的必要原因:
1)互斥条件。即一段时间内,某资源只能由一个进程占用。这段时间,其他的进程只能等待。
2)请求和保持条件。进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
3)不剥夺条件。进程已获得的资源,在未使用完之前,不能被剥夺
4)环路等待条件。
参考:《计算机操作系统(汤子瀛)》