一 进程的概念
进程是可并发执行的程序在某个数据集合上的一次计算活动,也是操作系统进行资源分配和调度的基本单位。
二 进程与程序的联系与区别
① 程序是指令的有序集合,其本身没有任何运行的含义,是一个静态的概念。而进程是程序在处理机上的一次执行过程,它是一个动态的概念。
② 程序可以作为一种软件资料长期存在,而进程是有一定生命期的。程序是永久的,进程是暂时的。(注:程序可看作一个菜谱,而进程则是按照菜谱进行烹调的过程)
③ 进程和程序组成不同:进程是由程序、数据和进程控制块三部分组成的。
④ 进程与程序的对应关系:通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序。
三 进程的特征
进程的特征包括以下几个方面:
(1)动态性:进程是程序的执行,同时进程有生命周期。
(2)并发性:多个进程可同存于内存中,能在一段时间内同时执行。
(3)独立性:资源分配和调度的基本单位。
(4)制约性:并发进程间存在制约关系,造成程序执行速度不可预测性,必须对进程的并发执行次序、相对执行速度加以协调。
结构特征:进程由程序块 、数据块、进程控制块三部分组成。
进程的基本状态包括以下几个方面:
(1)运行态(running)
当进程得到处理机,其执行程序正在处理机上运行时的状态称为运行状态。
在单CPU系统中,任何时刻最多只有一个进程处于运行状态。在多CPU系统中,处于运行状态的进程数最多为处理机的数目。
(2)就绪状态(ready)
当一个进程已经准备就绪,一旦得到CPU,就可立即运行,这时进程所处的状态称为就绪状态。系统中有一个就绪进程队列,处于就绪状态进程按某种调度策略存在于该队列中。
(3)等待态(阻塞态)(Wait / Blocked )
若一个进程正等待着某一事件发生(如等待输入输出操作的完成)而暂时停止执行的状态称为等待状态。 处于等待状态的进程不具备运行的条件,即使给它CPU,也无法执行。系统中有几个等待进程队列(按等待的事件组成相应的等待队列)。
上述三种状态是进程最基本的状态,在实际的操作系统实现中,进程远不止这三种状态。
四 进程控制块(Process Control Block,PCB)
每个进程有且仅有一个进程控制块。PCB是操作系统用于记录和刻划进程状态及有关信息的数据结构,是操作系统掌握进程的唯一资料结构。系统利用PCB来控制和管理进程,所以PCB是系统感知进程存在的唯一标志。进程与PCB是一一对应的,在创建进程时,建立PCB,并伴随进程运行的全过程,直到进程撤消而撤消。PCB就象我们的户口。
进程切换的定义是一个进程让出处理器,由另一个进程占用处理器的过程称为进程切换。进程的切换使系统中的各进程均有机会占用CPU。进程切换的步骤包括:
(1)保存被中断进程的处理器现场信息
(2)修改被中断进程的进程控制块的有关信息,如进程状态等
(3)把被中断进程的进程控制块加入有关队列
(4)选择下一个占有处理器运行的进程
(5)修改被选中进程的进程控制块的有关信息
(6)根据被选中进程设置操作系统用到的地址转换和存储保护信息k
(7)根据被选中进程恢复处理器现场
进程是有生命周期的:产生、运行、暂停、终止。进程生命周期的动态变化过程由进程管理程序来控制。进程的控制和管理包括:
(1)进程创建
(2)进程撤消
(3)进程阻塞
(4)进程唤醒
(5)进程挂起
(6)进程激活
这些控制和管理功能由操作系统中的原语实现。原语是在核心态执行、完成系统特定功能的不可分割的过程。原语的特点是执行过程中不允许被中断,是一个不可分割的基本单位,原语的执行是顺序的而不可能是并发的。
进程创建:类似于人出生后要到派出所报户口。进程创建过程包括:
(1)在进程列表中增加一项,从PCB池中申请一个空闲PCB,为新进程分配惟一的进程标识符;
(2)为新进程的进程映像分配地址空间。进程管理程序确定加载到进程地址空间中的程序;
(3)为新进程分配除主存空间外的其他各种所需资源;
(4)初始化PCB,如进程标识符、处理器初始状态、进程优先级等;
(5)把新进程状态置为就绪态,并移入就绪进程队列;
(6)通知操作系统的某些模块,如记账程序、性能监控程序。
进程撤消:进程完成其任务或出现严重错误后,操作系统调用进程撤消原语撤消进程。相当于一个人死亡后,家人要去派出所消户口。进程撤销过程包括:
(1)根据撤销进程标识号,从相应队列中找到并移出它;
(2)将该进程拥有的资源归还给父进程或操作系统;
(3)若该进程拥有子进程,先撤销它的所有子进程,以防它们脱离控制;
(4)回收PCB,并归还到PCB池。
进程阻塞和唤醒:当一个处在运行状态的进程,因等待某个事件的发生(如等待打印机)而不能继续运行时,进程将调用阻塞原语来阻塞自己,进程的状态由运行态转换为等待态(阻塞态)。当等待事件完成时,会产生一个中断,激活操作系统,在系统控制下将被阻塞的进程唤醒,这个进程将由阻塞状态转换成就绪状态。
进程阻塞步骤包括:
(1)停止进程执行,保存现场信息到PCB
(2)修改进程PCB有关内容,如进程状态由运行态改为等待态等,并把修改状态后的进程移入相应事件的等待队列中;
(3)转入进程调度程序去调度其他进程运行。
进程唤醒步骤包括:
(1)从相应的等待队列中移出进程;
(2)修改进程PCB的有关信息,如进程状态改为就绪态,并移入就绪队列;
(3)若被唤醒进程比当前运行进程优先级高,重新设置调度标志。
五 线程及其实现
1 引入多线程的动机
引入进程的目的是为了使多个程序并发执行,以改善资源使用率、提高系统效率。再引入线程,则是为了减少程序并发执行时所付出的时空开销,使得并发粒度更细、并发性更好。
进程的两项功能
(1)进程是资源分配和保护基本单位;
(2)进程同时又是一个可独立调度和分派的基本单位。
进程作为一个资源拥有者,在创建、撤消、切换中,系统必须为之付出较大时空开销。所以系统中进程的数量不宜过多,进程切换的频率不宜过高,但这也就限制了并发程度的进一步提高。
为解决此问题,人们想到将进程的上述两个功能分开,即对作为调度和分派的基本单位,不同时作为独立分配资源的单位;对拥有资源的单位,不对之进行频繁切换,线程因而产生。
多线程环境中进程的定义
进程是操作系统中除处理器外进行的资源分配和保护的基本单位,它有一个独立的虚拟地址空间,用来容纳进程映像(如与进程关联的程序与数据),并以进程为单位对各种资源实施保护,如受保护地访问处理器、文件、外部设备及其他进程(进程间通信)。
2 多线程环境中的线程概念
线程是操作系统进程中能够并发执行的实体,是处理器调度和分派的基本单位。每个进程内可包含多个可并发执行的线程。线程自己基本不拥有系统资源,只拥有少量必不可少的资源:程序计数器、一组寄存器、栈。同属一个进程的线程共享进程所拥有的主存空间和资源。
3 引入线程的好处
创建一个新线程花费时间少(结束亦如此)两个线程的切换花费时间少因为同一进程内的线程共享内存和文件,因此它们之间相互通信无须调用内核
4 线程与进程的比较
线程具有进程的许多特征,故又称轻型进程,传统进程称重型进程。在引入线程的OS中,每一进程都拥有多个线程,至少一个。
5 线程的实现
多线程的实现分为三类:
- 用户级线程(User Level Thread,ULT):对于这种线程的创建、撤消、和切换,由用户程序来实现,内核并不知道用户级线程的存在。
其优点在于:线程切换不调用核心;调度是应用程序特定的:可以按需要选择好的算法;
ULT可运行在任何操作系统上(只需要线程库),可以在一个不支持线程的OS上实现。
其缺点在于:由于大多数系统调用是阻塞的,因此一个用户级线程的阻塞会引起整个进程的阻塞;核心只将处理器分配给进程,同一进程中的两个线程不能同时运行于两个处理器上。
- 内核级线程(Kernel Level Thread ,KLT):它们是依赖于内核的,即无论是用户进程中的线程,还是系统进程中的线程,它们的创建、撤消、切换都由内核实现。
其优点在于:对多处理器,核心可以同时调度同一进程的多个线程;阻塞是在线程一级完成。
其缺点在于:在同一进程内的线程切换调用内核,系统开销较大。
(3)混合式线程:同时支持ULT和KLT两种线程。
6 进程、线程与处理器的调度
作业是任务实体,进程是完成任务的执行实体;没有作业任务,进程无事可干,没有进程,作业任务没法完成。作业概念更多地用在批处理操作系统,而进程则可以用在各种多道程序设计系统。
处理器调度算法包括:
(1)先来先服务(First Come First Served,FCFS )
最简单的调度算法,即可用于作业调度,也可用于进程调度。
按作业(进程)来到的先后次序进行调度。
优点:易于实现
缺点:调度程序每次选择的作业是等待时间最久的,而不管作业的运行时间的长短,此算法效率低;
有利于长作业,不利于短作业
(2)最短作业(进程)优先算法(SJF:Shortest Job First/SPF:Shortest Process First)
可用于作业调度和进程调度。估计作业(进程)的CPU运行时间,选取估计时间最短的作业(进程)投入运行。
其优点在于:
(i)易于实现。
(ii)在一般情况下这种调度算法比先来先服务调度算法的调度性能比FCFS好。
其缺点在于:
(i)作业(进程)的执行时间是用户估计的,不一定准确,所以实现时不一定真正做到短作业优先调度。
(ii)对长作业不利
若系统不断接受新作业,就有可能使长作业长时间得不到调度。出现饥饿现象
(iii)缺少剥夺机制,对分时、实时系统仍不理想
(3)响应比最高者优先算法(HRRF:Highest Response Ratio First)
FCFS与SJF是片面的调度算法。FCFS只考虑作业等候时间而忽视了作业的计算时问,SJF只考虑用户估计的作业计算时间而忽视了作业等待时间。HRRF是介乎这两者之间的折衷算法,既考虑作业等待时间,又考虑作业的运行时间,既照顾短作业又不使长作业的等待时间过长,改进了调度性能。响应比最高者优先算法:每次调度时,计算所有作业的响应比,选择响应比最高的调度。短作业容易得到较高响应比,长作业等待时间足够长后,也将获得足够高的响应比,饥饿现象不会发生。
计算响应比导致一定的时间开销,此算法性能介于FCFS和SJF之间。
(4)优先级调度算法
为作业或进程确定优先级,选择优先级最高的作业或进程调度。
1.两种方式
非剥夺式:某一进程被调度运行后,除非由于它自身的原因不能运行,否则一直运行下去;
剥夺式:当有比正在运行的进程优先级更高的进程就绪时,系统可强行剥夺正在运行进程的CPU,提供给具有更高优先级的进程使用。
采用这种调度算法的关键是如何确定进程的优先级、一个进程的优先级确定之后是固定的,还是随着该进程运行的情况的变化而变化。
2.优先级类型
静态优先级:在进程创建时确定优先级,在进程运行时保持不变;
动态优先级:在进程创建时创立一个优先级,系统在运行的过程中,根据系统的设计目标,不断地调整进程的优先级,这种方法的优点是能比较客观地反映进程的实际情况和保证达到系统设计目标。如等待时间长优先级可改变 。
(5)时间片轮转调度算法(Round Robin,RR)
分时系统中常用时间片轮转法。
把CPU划分成若干时间片,并且按顺序分配给就绪队列中的每一个进程,进程轮流占有CPU,当时间片用完时,即使进程未执行完毕,系统也剥夺该进程的CPU,将该进程排在就绪队列末尾,等候下一轮调度。
1.时间片大小的确定
时间片大小对系统性能有很大影响。时间片太小,会导致频繁切换,增大系统开销;时间片太大,轮转一次时间加长,进程在一个时间片内完成,时间片轮转算法退化为FCFS算法,无法满足交互式用户需求。
确定时间片长度要从进程数目、切换开销、系统效率和响应时间等多方面加以考虑。
2.RR改进
RR由于采用固定时间片和仅有一个就绪队列,所以服务质量不够理想,进一步改进沿两个方向:
(i)将固定时间片改为可变时间片:引入可变时间片轮转调度算法
(ii)将单就绪队列改为多就绪队列:引入多级反馈队列调度算法
(6)多级反馈队列调度算法(MLFQ:Multi-level Feedback Queue)
设置多个就绪队列,并为各个队列赋予不同的优先级,第一个队列最高,第二个次之……;各个队列时间片大小也不同,在优先级越高的队列中,为每个进程分配的时间片越小。
处理器调度先从第一个就绪进程队列中选取进程,同一队列中的进程按FCFS算法进行排队。只有在未选到时,才从较低级的就绪进程队列中选取。
当新进程进入内存后,首先放在第一个队列末尾,到轮到该进程执行时,如在该时间片完成,便可撤离系统;若未完成,则将该进程转入第二个队列末尾…
该算法具有较好的性能,能满足各类应用的需要。
分时交互型短作业:通常在第一队列规定的时间片完成,可使终端型用户满意。
短批处理作业:通常在第一队列和第二队列各执行一个时间片就能完成,周转时间仍很短。
长批处理作业:它将一次在第1,2,3…n个队列中运行。