一共4种:就绪状态、执行状态、阻塞状态、挂起状态
就绪状态:当前进程已分配到除CPU以外的所有必要资源;
执行状态:当前进程已分配到包括CPU在内的所有必要资源;
阻塞状态:正在执行的进程请求I/O等系统服务,申请缓冲空间、启动某种操作、新数据尚未到达等;
挂起状态:即将该进程从内存中暂时调出到外存,原因如:终端用户的请求、父进程的请求、负荷调节的需要、操作系统的需要。
进程控制包括:进程的创建、进程的终止、进程的状态转换
1、进程的创建
引起创建进程的事件包括:用户登录、作业调度、提供服务、应用请求。
创建进程的过程:申请空白PCB—>为新进程分配资源—>初始化PCB—>将PCB插入就绪队列。
2、进程的终止
引起终止进程的事件包括:正常结束、异常结束、外界干预(如父进程终止)。
终止进程的过程:根据进程标识符读取PCB(若执行状态,置调度标志真)—>终止子孙进程—>释放全部资源—>将PCB从队列移除。
3、进程的状态转换
(1)进程的阻塞和唤醒
引起事件:请求系统服务(阻塞)、启动某种操作(唤醒)、新数据尚未到达(阻塞)、无新工作可做(阻塞)。
进程阻塞的过程:停止本进程—>改变PCB—>调度新进程;
进程唤醒的过程:PCB从阻塞队列移除—>改变PCB—>PCB插入到就绪队列;
(2)进程的挂起和激活
进程挂起的进程:改变PCB—>复制PCB(方便用户或父进程考查该进程)—>调度新进程;
进程激活的进程:将该进程从外存调入内存—>改变PCB—>调度该进程;
进程同步的主要任务,是是并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。
1、同步机制
间接相互制约关系:如:A进程使用一资源,B进程只能等待,即A进程通过共享资源简介制约B进程;
直接相互制约关系:如:B进程执行所需的数据由A进程得到,即A进程直接制约B进程;
同步机制应遵循的规则包括:空闲让进、忙则等待、有限等待、让权等待。
2、信号量机制
其中包括整形信号量、记录型信号量、AND信号量。
三种信号量的区别:
整形信号量N只是一个整型值,代表着某类资源的数目,当N<=0,即后申请使用该资源的进程会不断地查询是否N>0,一旦N>0,即取之来用,这是一种忙等现象;
记录型信号量S是一个结构体,S.value相当于整形信号量N,当S.value<=0,即后申请使用该资源的进程会进入阻塞状态,并将其挂在S.L中,等待唤醒,遵循“让权等待”策略;
AND信号量代表着多类资源的数目,其中有一类资源的数目小于零,即分配资源失败。
按调度层次,分为:
1. 高级调度(作业)
2. 中级调度(进程)
3. 低级调度(内存)(引入中级调度的目的:提高内存利用率和系统吞吐量)
(1)抢占式调度:
(2)非抢占式调度
按OS的类型,分为:批处理调度,分时调度,实时调度,多处理机调度。
名称 | IS抢占 | 平均周转时间 | 多适用范围 |
---|---|---|---|
先来先服务FCFS | 非抢占式 | 与作业提交和调度顺序有关 | |
短作业优先SJF | 非抢占式 | 与作业到达顺序无直接关联 | 批处理系统 |
最短剩余时间优先算法SRTF | 抢占式 | 与作业到达顺序无直接关联 | |
高响应比优先HRRF | 非抢占式 | 与作业到达顺序相关 | |
时间片轮转 | 抢占式 | 与作业到达顺序无直接关联 | 分时系统 |
多级反馈队列调度:时间片 | 抢占式 | 与作业到达顺序无直接关联 | 多种系统 |
最早截止时间优先EDF | 非抢占式 | 与作业到达顺序无直接关联 | 实时系统 |
最低松弛度优先即LLF | 非抢占式 | 与作业到达顺序无直接关联 | 实时系统 |
先来先服务(FCFS)调度算法是目前最简单的CPU调度算法。先来先服务调度算法根据就绪队列,按进入的先后次序来分配处理机,这是一种不可抢占、非剥夺的调度方式。一旦一个进程占有处理机,就一直运行下去,直到该进程完成其工作,或因等待某一事件而不能继续执行时,才释放处理机。采用这种进程调度方式,若一个运行时间长的作业先占有了处理机,则会使很多晚到的、运行时间短的作业等待时间过长,引起许多短作业用户的不满。
//周转时间=完成时间-到达时间
//带权周转时间=周转时间/服务时间
假设系统中没有其他作业,现采用FCFS 算法进行调度,那么三个作业的周转时间分别为:28、28+9 和28+9+3,因此,平均作业周转时间T=(28+37+40)/3 = 35。
若这三个作业调度顺序改为作业2、1、3,平均作业周转时间缩短为约29。如果三个作业调度顺序改为作业3、2、1,则平均作业周转时间缩短为约18。由此可以看出,FCFS 调度算法的平均作业周转时间与作业提交及调度的顺序有关。
短作业优先(SJF)调度算法是指短作业或短进程优先调度的算法。短进程优先调度算法,是选择就绪队列中估计运行时间最短的进程进入执行。
SJF算法能有效地缩短作业的平均周转时间,提高系统的吞吐量,但不利于长作业和紧迫作业的运行。由于估计的运行时间不一定准确,因而它不一定能真正做到短作业优先。
假设系统中没有其他作业,现对它们实施SJF 调度算法,这时的作业调度顺序为作业2、4、1、3,则:
平均作业周转时间T = (4+12+21+31)/4 = 17
平均带权作业周转时间W =(4/4+12/8+21/9+31/10)/4 = 1.98
如果对它们施行FCFS 调度算法,则:
平均作业周转时间T =(9+13+23+31)/4 = 19
平均带权作业周转时间W =(9/9+13/4+23/10+31/8)/4 = 2.51
由此可见,SJF 的平均作业周转时间比FCFS 要小,故它的调度性能比FCFS 好。但实现SJF 调度算法需要知道作业所需运行时间,否则调度就没有依据,作业运行时间只知道估计值,要精确知道一个作业的运行时间是办不到的。
当一个作业正在执行时,一个新作业进入就绪状态,如果新作业需要的CPU 时间比当前正在执行的作业剩余下来还需的CPU 时间短,抡占式短作业优先调度算法强行赶走当前正在执行的作业,这种方式叫最短剩余时间优先算法SRTF(Shortest Remaining Time First)算法。此算法不但适用于作业调度,同样也适用于进程调度。
应比最高者优先算法(Highest Response Ratio First)是介乎这两种算法之间的一种折中的策略,既考虑作业等待时间,又考虑作业的运行时间,这样既照顾了短作业又不使长作业的等待时间过长,改进了调度性能。缺点是每次计算各道作业的响应比会有一定的时间开销,需要估计期待的服务时间,性能要比SJF 略差。
在批处理系统中,短作业优先算法是一种比较好的算法,但不足之处是长作业的运行得不到保证。如果能为每个作业引入前面所述的动态优先级,并使作业的优先级随着等待时间的增加而以一定速率提高,则长作业在等待一定的时间后,必然有机会分配到处理机,该优先级的变化规律可描述为:
优先级 = (等待时间+要求服务时间)/要求服务时间
由于等待时间与服务时间之和,就是系统对该作业的相应时间,故该优先级又相当于响应比Rp。因此,又可表示为:
Rp = (等待时间+要求服务时间)/要求服务时间 = 响应时间/要求服务时间
假设系统中没有其他作业,现对它们实施SJF 调度算法,这时的作业调度顺序为作业1、3、4、2,平均作业周转时间T=(20+25+35+50)/4=32.5。平均带权作业周转时间W=(20/20+25/5+35/10+50/15)/4=3.2。
如果对它们施行FCFS 调度算法,这时的作业调度顺序为作业1、2、3、4,平均作业周转时间T=(20+35+40+50)/4=36.25。平均带权作业周转时间W=(20/20+35/15+40/5+50/10)/4=4.1。
如果对这个作业流执行HRRF 调度算法:
开始时只有作业1,作业1 被选中,执行时间20;
作业1 执行完毕后,响应比依次为1+15/15、1+10/5、1+5/10,作业3 被选中,执行时间5;
作业3 执行完毕后,响应比依次为1+20/15、1+10/10,作业2 被选中,执行时间15;
作业2 执行完毕后,作业4 被选中,执行时间10。
平均作业周转时间T=(20+25+40+50)/4=33.75。
平均带权作业周转时间W=(20/20+25/5+40/15+50/10)/4=3.4。
由此可见HRRF的性能界于SJF和FCFS之间。
在这种调度算法中,系统将所有就绪进程按到达时间的先后次序排成一个队列。进程调度程序总是选择队列中第一个进程执行,且仅能执行一个时间片。在使用完一个时间片后,即使进程并未完成其运行,也必须将处理机交给下一个进程。
时间片的长短对计算机系统的影响很大。如果时间片大到让一个进程足以完成其全部工作,这种算法就退化为先来先服务算法。若时间片很小,那么处理机在进程之间的转换工作过于频繁,处理机真正用于运行用户程序的时间将减少。时间片的长短,能使分时用户得到好的响应时间。
实施过程:(1)应设置多个就绪队列,并为各个队列赋予不同的优先级。
(2)当一个新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS原则等待调度执行;如果它在第二队列中运行一个时间片后仍未完成,再依次将它放入第三队列,……。
(3)仅当第一队列空闲时,调度程序才调度第二队列中的进程运行;
多级反馈队列调度算法的优点:
(1)终端型作业用户。 能在第一队列所规定的时间片内完成,可使终端型作业用户都感到满意。 (2)短批处理作业用户有利。
(3)长批处理作业用户。对于长作业,它将依次在第1,2,…,n个队列中运行,然后再按轮转方式运行,用户不必担心其作业长期得不到处理。
根据任务的截止时间来确定任务的优先级。截止时间愈早,其优先级愈高。该算法要求在系统中保持一个实时任务就绪队列,该队列按各任务截止时间的早晚排序。调度程序在选择任务时,总是选择就绪队列中的第一个任务,为之分配处理机,使之投入运行。
该算法既可以用于抢占式调度,也可用于非抢占式调度方式中。
1在执行时,23到了,但是3更早截止;
3执行时,4到了。4比2截止时间更早;
4执行;
2执行。
算法根据任务紧急(或松弛)的程度,来确定任务的优先级。任务的紧急程度愈高(开始截至时间或完成截至时间越早),为该任务所赋予的优先级就愈高, 以使之优先执行。
例如说明:一个任务在200ms时必须完成,而它本身所需的运行时间就有100ms,因此,调度程序必须在100 ms之前调度执行,该任务的紧急程度(松弛程度)为100 ms。
举例说明:假如在一个实时系统中,有两个周期性实时任务A和B,任务A要求每 20 ms执行一次,执行时间为 10 ms;任务B只要求每50 ms执行一次,执行时间为 25 ms。
解:任务A的松驰度为10ms,任务B的松驰度为25ms。松弛度=必须完成时间-本身运行时间-当前时间
死锁是指多个并发执行的进程因资源争夺而出现的一种彼此都不能继续向前推进的僵持局面。
①竞争资源——竞争非剥夺性资源(如,打印机)和竞争临时资源(如,某进程生产的数据、消息)
②进程推进的顺序非法
①避开“ 请求和保持”条件:一次性请求,一次性分配。在进程运行期间不再提出资源请求。这种方法也称“预先静态分配法”。
②避开 “不剥夺”条件:进程逐个提出资源请求,当前请求不能满足时,必须释放它所拥有的全部资源。
③避开“环路等待”条件:将所有资源按类型进行线性排队,并赋予不同序号,要求进程申请资源时按序号递增的次序提出。这种方法也称“有序资源分配法”。
(4)死锁的避免——银行家算法,死锁的预防——资源有序分配法。