作业从提交给系统、直到它完成任务后退出系统前,在整个活动过程中它会处于不同的状态。通常,作业状态分为四种:提交、后备、执行和完成,如图所示。
作业的基本状态
1.提交状态——用户向系统提交一个作业时,该作业所处的状况。如将一套作业卡片交给机房管理员,由管理员将它们放到读卡机予以读入;或者用户通过键盘向机器输入其作业。
2.后备状态——用户作业经输入设备(如读卡机)送入输入井(磁盘)中存放,等待进入内存时所处的状况。此时,该作业的数据已转换成机器可读的内部形式,并且作业请求资源等信息也交给了操作系统。
3.执行状态——作业分配到所需的资源,被调入内存,其进程经调度在处理机(CPU)上运行相应的程序时所处的状况。此时该作业处于活动状况。由于内存中有多个作业,所以在单CPU系统中,任何时刻真正在运行的作业至多只能有一个。
4.完成状态——即作业完成了计算任务,结果由打印机输出,最后由系统回收分配给它的全部资源,准备退出系统时的作业状况。
1.作业控制块(JCB)
在多道批处理系统中通常有上百个作业被收容在输入井(磁盘)中。为了管理和调度作业,系统为每个作业设置了一个作业控制块(JCB),它记录该作业的有关信息。不同系统的JCB的组成内容有所区别。图示出JCB的主要内容。
如同PCB是进程在系统中存在的标志一样,JCB是作业在系统中存在的标志。作业进入系统时由SPOOLing系统为每个作业建立一个JCB;当作业退出系统时,则它的JCB也一起被撤消。在磁盘输入井中的所有后备作业按作业类型(CPU型,I/O型等)组成不同的后备作业队列。由作业调度从中挑选作业,随后放入内存,予以运行。
2.作业调度的功能
作业调度的主要任务是完成作业从后备状态到执行状态和从执行状态到完成状态的转换。具体来说,通常作业调度程序要完成以下工作(这就是作业调度的功能):
(1)记录系统中各个作业的情况。要当好指挥,必须对所管对象心中有数。同样,作业调度程序必须掌握各个作业进入系统时的有关情况,并把每个作业在各个阶段的情况(包括分配的资源和作业状态等)都记录在它的JCB中。作业调度程序就是根据各个作业的JCB中的信息对作业进行调度和管理的。
(2)按照某种调度算法从后备作业队列中挑选作业,即决定接纳多少个作业进入内存和挑选哪些作业进入内存。这项工作非常重要,它取决于多道程序度,直接关系到系统的性能。往往选择对资源需求不同的作业进行合理搭配,使得系统中各部分资源都得到均衡利用。
(3)为选中的作业分配内存和外设等资源。
(4)为选中的作业建立相应的进程,并把该进程放入就绪队列中。
何时创建新进程一般由多道程序决定,因为创建的进程越多,每个进程占用CPU的百分比就越小。为了对当前的一组进程提供良好的服务,作业调度程序要限制多道程序度。
(5)作业结束后进行善后处理工作,如输出必要的信息,收回该作业所占用的全部资源,撤消与该作业相关的全部进程和该作业的JCB。
应该指出,内存和外设的分配与释放的工作,实际上分别由存储管理程序和设备管理程序完成,即由作业调度程序调用它们来实现的。
进程只有在得到CPU之后才能真正活动起来。一个就绪进程怎样获得CPU的控制权呢?这是由进程调度实现的。
进程调度也叫低级调度。进程调度程序也往往叫低级调度程序,它完成进程状态从就绪态到运行态的转化。实际上,进程调度程序完成一台物理的CPU转变成多台虚拟(或逻辑)的CPU的工作。
1.进程调度的主要功能
(1)保存现场。当前运行的进程调用进程调度程序时,即表示该进程要求放弃CPU(因时间片用完或等待I/O等原因)。这时,进程调度程序把它的现场信息,如程序计数器及通用寄存器的内容等保留在该进程PCB的现场信息区中。
(2)挑选进程。根据一定的调度算法(如优先级算法),从就绪队列中选出一个进程来,并把它的状态改为运行态,准备把CPU分配给它。
(3)恢复现场。为选中的进程恢复现场信息,并把CPU的控制权交给该进程,从而使它接着上次间断的地方继续运行。
2.进程调度的时机
(1)任务完成。正在运行的进程完成其任务后,主动释放对CPU的控制。
(2)等待资源。由于等待某些资源或事件,正在运行的进程不得不放弃CPU。
(3) 运行到时。在分时系统中,当前进程使用完规定的时间片,时钟中断使该进程让出CPU。
(4)发现标志。核心处理完中断或陷入事件后,发现系统中“重新调度”标志(如linux系统中进程task_struct的成员need_resched)被置上,表示有比当前用户进程更适宜运行的进程,则执行进程调度。
进程调度程序是操作系统的真正核心,它直接负责CPU的分配。系统中所有进程都是在CPU上运行的,进程调度程序就是它们的切换开关。
如果把硬件CPU看成一台裸机,那么加上这个调度程序之后,就变成多台逻辑上相同的CPU,只是速度慢一些。在有的机器上,甚至用微程序设计把这个程序装入只读存储器(ROM)中,从而提高CPU的调度效率。