(一 )前趋图和程序的执行
前趋图
前驱图中是不允许有循环的,否则必然会产生无法实现的前驱关系。
(二)进程的描述
1.进程的定义与特征
进程的定义
为什么要引入进程:为了程序可以并发执行 且 对并发执行的程序加以描述和控制。
进程:①进程是程序的一次执行 ②进程是一个程序及其数据在处理机上的执行过程,它是系统进行资源分配和调度的一个独立单位 ③进程是具有独立功能的程序在一个数据集上执行的过程,它是系统进行资源分配和调度的一个独立单位。
进程的特征
(1)动态性:进程的实质是程序的执行过程。
(2)并发性:多个进程共存在内存中,且能在一段时间内同时执行。引入进程是为了进程能和其他进程并发执行。
(3)独立性:进程是一个能独立运行、独立获取资源、独立接受调度的基本单位。
(4)异步性是指进程是按照异步的方式运行的,即各自按独立的、不可预知的速度向前进。
进程的基本状态与转换
每一个进程至少应处于以下3种基本状态之一。
(1)就绪态(ready):进程已处于准备好执行的状态,进程已分配到除了CPU以外的所有必要资源后,只要再获得CPU,便可立即执行。就绪队列:若系统中有许多处于就绪状态的进程,则通常会将它们按一定的策略(如优先级策略)排成一个队列。
(2)执行态(running):进程获得CPU后其程序“正在执行”这一状态。单处理机系统:只有一个进程处于执行态,多:可能会多个进程处于执行态。
(3)阻塞态(block):正在执行的进程由于发生某事件(如I/O请求、申请缓冲区失败等)而暂时无法继续执行。阻塞队列:系统会将处于阻塞状态的进程排成一个队列。
进程3种基本状态间的转换
进程在运行过程中,会经常发生状态的转换。例如,处于就绪状态的进程,在调度程序为——分配处理机之后便可执行,相应地,其状态就会由就绪转变为执行;正在执行的进程(当前进程),如果因分配给它的时间片已完而被剥夺处理机暂停执行时,其状态便会由执行转变为就绪;如果因发生某事件而致使当前进程的执行受阻(例如进程访问某临界资源而该资源又正在被其他进程访问),使之无法继续执行,则该进程状态将由执行转变为阻塞。图2-6给出了进程的3种基本状态以及各状态之间的转换关系。
创建状态和终止状态
创建状态:进程是由创建或新建产生的。创建一个进程是一个很复杂的过程,一般要通过多个步骤才能完成:首先,由进程申请一个空白PCB,并向PCB中填写用于控制和管理进程的信息;然后,为该进程分配运行时所必需的资源;最后,把该进程的状态转换为就绪状态并将其插入就绪队列之中。但如果进程所必需的资源尚不能得到满足,如系统尚无足够的内存来存储进程,此时创建工作尚未完成,进程不能被调度运行,于是我们把此时进程所处的状态称为创建状态(或新建状态)。
引入创建状态,是为了保证进程的调度必须在创建工作完成后进行,以确保对PCB操作的完整性。同时,创建状态的引人也增加了管理的灵活性,OS可以根据系统性能或内存容量的限制,推迟新进程的提交(使进程处于创建状态)。对于处于创建状态的进程,当其获得了所必需的资源,并完成了对PCB的初始化工作后,便可由创建状态转入就绪状态。
终止状态:进程的终止:先等待OS进行善后处理,后将进程的PCB清零,并将PCB空间返还OS。当一个进程到达了自然结束点,或是出现无法克服的错误,或是被OS所终止,或是被其他有终止权的进程所终止时,他会进入终止状态。 终止状态的进程不能被执行且在OS中依然保留一个记录,其中会保存状态码和一些计时统计数据以供其它进程收集。一旦其他进程完成对其信息的提取,系统就会删除该进程,即将其PCB清零,并将空白PCB返还OS。
挂起操作和进程状态的转换
一个当该操作作用于某个进程时,该进程将被挂起,这意味着此时该进程处于静止状态。如果进程正在执行,则其此时会暂停执行;如果进程原本处于就绪状态,则其此时暂不接受调度。与挂起操作对应的操作是激活操作。
1.挂起操作的引入(面向进程的重要操作——挂起。)
引人挂起操作主要是为了满足下列需要。
(1)终端用户的需要。终端用户自己的程序在运行期间发现有可疑问题,希望暂停程序运行,以便用户研究其执行情况或对其进行修改。
(2)父进程的需要。有时父进程希望挂起自己的某个子进程,以便考查和修改该子进程,或者协调各子进程间的活动。
(3)负荷调节的需要。当实时系统中的工作负荷较重,可能会影响到对实时任务的控制时,系统可把一些不重要的进程挂起,以保证自身能正常运行
(4)OS的需要。OS有时希望挂起某些进程,以便检查在进程运行过程中资源的使用情况或进行记账。所记录的信息包括CPU时间、实际使用时间、作业或进程数量等。
2.引入挂起操作后进程3个基本状态间的转换
引人挂起原语Suspend和激活原语Active(二者须成对使用)后,在二者的共同作用下,进
程可能会发生以下几种状态转换
(1)活动就绪→静止就绪。进程处于未被挂起的就绪状态,称为活动就绪状态,表示为Readya,此时进程可以接受调度。当用挂起原语Suspend将该进程挂起后,该进程的状态便转换成了静止就绪状态,表示为Readys。处于Readys状态的进程不会再被调度执行。
(2)活动阻塞→静止阻塞。进程处于未被挂起的阻塞状态,称为活动阻塞状态,表示为Blockeda 。 当用挂起原语Suspend将该进程挂起后,进程的状态便转换成了静止阻塞状态,表示为Blockeds。处于该状态的进程在其所期待的事件发生后,它将从静止阻塞状态变为静止就绪状态。
(3)静止就墙活动就绪,处于Rcadys状态的进程,若用激活原语Active将其激活,则该进程的状态将会转换为Readya状态。
(4)静止阻塞→活动阻塞。处于Blockeds状态的进程,若用激活原语Active将其激活,则该进程的状态将会转换为Blockeda状态。
(1)NULL→创建:一个新进程产生时,该进程处于创建状态。
(2)创建一活动就绪:在当前系统的性能和内存容量均允许的情况下,当完成进程创建的
必要操作后,相应地系统会将进程状态转换为活动就绪状态。
(3)创建一静止就绪:在当前的系统资源状况和性能要求不允许的情况下,系统不会分配给新建进程所需资源(主要是内存),相应地系统会将进程状态转换为静止就绪状态。进程被安置在外存,不参与调度,此时进程创建工作尚未完成。
(4)执行→终止:当一个进程已完成任务,或是出现了无法克服的错误,或是被OS或其他进程所终止时,将进程状态转换为终止状态。
进程管理中的效据结构
为了便于使用和管理计算机中的各类资源(包括硬件和信息),0S将它们抽象为相应的各种数据结构,并提供了一组对资源进行操作的命令;用户可利用这些数据结构及操作命令来执行相关的操作,而无须关心其实现的具体细节。另一方面,0S作为计算机资源的管理者,为了协调诸多用户对系统中共享资源的使用,它还必须记录和查询各种资源的使用情况及各类进程的运行情况等信息;0S对于这些信息的组织和维护,也是通过建立和维护各种数据结构的方式来实现的。
1.OS中用于管理资源和控制进程的数据结构
在计算机系统中,对于每个资源和每个进程都设置了一个数据结构,用于表征其实体,我们称之为资源信息表和进程信息表,其中包含了资源和进程的标志、描述、状态等信息以及批指针。通过这些指针,可以将同类资源和进程的信息表,或者同一进程所占用的资源信息表分类链接成不同的队列,以便OS进行查找。0S管理的这些控制表一般可分为以下4类:内存表、设备表、文件表和用手进程管理的进程表,通常进程表又被称为PCB。
2.PCB的作用
为了便于系统描述和管理进程,0S为每个进程专门定义了一个数据结构——PCB。PCB作为进程的一部分,记录了0S所需的、用于描述进程当前情况以及管理进程运行状态的全部信息,是OS中最重要的记录型数据结构。
PCB的作用是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,即一个能与其他进程并发执行的进程。
(1)作为独立运行基本单位的标志。当一个程序(含数据)配置了PCB后,就表示它已是一个能在多道程序环境下独立运行的、合法的基本单位了,即具有了取得OS服务的权利,如打开文件系统中的文件,请求使用系统中的I/O设备,以及与其他相关进程进行通信等。因此,当系统创建一个新进程的同时,就会为它建立一个PCB。进程结束时系统又会回收其PCB,进程也随之消亡。系统是通过PCB来感知进程的存在的。事实上,PCB已成为进程存在于系统中的唯一标志。
(2)实现间断性运行方式。在多道程序环境下,程序是采用“停停走走”这种间断性的方式运行的。当进程因阻塞而暂停运行时,它必须保留自己运行时的CPU现场信息,因为其再次被调度运行时,还需要恢复CPU现场信息。在有了PCB后,系统就可以将CPU现场信息保存在被中断进程的PCB中,供该进程再次被调度运行而须恢复CPU现场信息时使用。由此可再次明确,在多道程序环境下,作为传统意义上的静态程序,其因并不具有保护或保存自己运行现场的手段,故无法保证运行结果的可再现性,从而失去了运行的意义。
(3)提供进程管理所需要的信息。当调度程序调度到某进程时,只能根据该进程PCB中记录的程序和数据在内存或外存起始地址(又称为“始址”或“基址”)中找到相应的程序和数据;在进程运行过程中,当进程需要访问文件系统中的文件或V/0设备时,也都需要借助PCB中的信息。另外,还可根据PCB中的资源清单了解到该进程所需的全部资源等信息。由此可见,在进程的整个生命期中,OS总是根据POB来实施对进程的控制和管理的。
(4)提供进程调度所需要的信息。只有处于就绪状态的进程才能被调度运行,而在PCB中就提供了进程所处状态等信息。如果进程处于就绪状态,系统便会把它插人进程就绪队列中,等待调度程序的调度;另外,在进行进程调度时,往往还需要了解进程的其他信息,如在优先级调度算法中,就需要知道进程的优先级。
(5)实现与其他进程的同步和通信。进程同步机制是用来实现各进程的协调运行的,在采用心好累机制时,他要求每一个进程中都要设置相应的用于同步的信号量。在PCB内还具有用于实现进程通信的区域或通信队列指针
3.PCB中的信息
在PCB中,主要包括下述4方面的信息。
(1)进程标识符。
进程标识符用于唯一地标志一个进程。一个进程通常有两种标识符。
①外部标识符:为了方便用户(进程)对进程的访问,须为每个进程设置一个外部标识符。它是由创建者提供的,通常由字母和数字组成。为了描述进程的家族关系,还应设置父进程标识符和子进程标识符。此外,还可设置用户标识符,以指示拥有该进程的用户。
②内部标识符:为了方便系统对进程的使用,在OS中又为进程设置了内部标识符,即赋予
每个进程唯一的一个数字标识符,它通常是一个进程的序号。
(2)处理机状态。
处理机状态信息,也称为处理机的上下文,主要是由处理机的各种寄存器中的内容组成的。这些寄存器包括:①通用寄存器,又称为用户可视寄存器,它们可被用户程序访问,用于暂存信息,在大多数处理机中,有8~32个通用寄存器,在RISC中可超过100个;②指令计数器,其中存放了要访问的下一条指令的地址;③程序状态字寄存器,其中含有状态信息,如条件码、执行方式、中断屏蔽标志等;④片户栈指针寄存器,指每个用户进程都有一个或若干个与之相关的系统栈,用于存放进程和系统的调用参数及调用地址。栈指针指向该栈的栈顶。处理机处于执行状态时,正在处理的许多信息都是放在奇存器中的。当进程被切换时,处理机状态信息都必须保存在相应的PCB中、以便在该进程被重新调度时,能再从断点处继续执行。(3)进程调度信息。
0S在进行进程调度时,必须了解进程的状态以及有关进程调度的信息,这些信息包括:①进程状态,指明进程的当前状态,作为进程调度和对换时的依据:②进程优先级,描述进程使用处理机的优先级别(用一个整数表示),优先级高的进程应优先获得处理机;③进程调度所需要的其他信息,如进程已等待CPU的时间总和、进程已执行时间总和等,它们与所采用的进程调度算法有关;④事件,指进程由执行状态转换为阻塞状态所等待发生的事件,即阻塞原因。
(4)进程控制信息。
进程控制信息是指用于进程控制所必需的信息,包括:①程序和数据的地址,即进程中程序和数据的内存或外存起始地址,便于再调度到该进程执行时,能从PCB中快速找到其程序和数据;②进程同步和通信机制,这是实现进程同步和进程通信时所必需的机制,如消息队列指针、信号量等,它们可能会全部或部分放在PCB中:③资源清单,在该清单中列出了进程在运行期间所需的全部资源(除CPU外);④链接指针,它给出了本进程所在队列中的下一个进程的PCB的始址。
4.PCB的组织方式
为了对PCB加以有效的管理,常用的组织方式有:
(1)线性方式
将系统中所有的PCB都组织在一张线性表中,将该表的起始地址存放在内存的一个专用区域中。该方式实现简单且开销小,但每次查找时都需要扫描整张表,因此适合进程数目不多的系统。PCB线性表示意。
(2)链接方式
通过PCB中的链接字,将具有相同状态的进程的PCB分别链接成一个队列。这样即可形成就绪队列、若干个阻塞队列和空闲队列等。对就绪队列而言,其往往会按进程的优先级将PCB从高到低进行排列,即将优先级高的进程的PCB排在队列的前面。同样,也可根据阻塞原因的不同,把处于阻塞状态的进程的PCB排成多个阻塞队列,如等待1O操作完成的队列和等待分配内存的队列等。 PCB链接队列示意。
(3)索引方式
系统根据所有进程状态的不同,建立几张索引表,如就绪索引表、阻塞索引表等,并把各索引表在内存中的起始地址记录在内存的一些专用单元中。在每个索引表的表目中,记录具有相应状态的某个PCB在PCB表中的地址。
PCB索引方式示意。
(三)进程控制
进程控制是进程管理中最基本的功能,其负责创建新进程、终止已完成的进程,将因发生异常情况而无法继续运行的进程置于阻塞状态、转换运行中进程的状态等,进程控制一般由OS内核中的原语来实现的。
进程的创建
1.进程的层次结构
在OS中,允许一个进程创建另一个进程,通常把创建进程的进程称为父进程, 把被创建的进程称为子进程。如在UXIN系统中,进程语其子孙进制共同组成一个进程家族(进程组)。
在Windows系统中不存在任何的进程的层次结构的概念,所有的进程都具有相同的地位。在一个进程创建另外一个进程后,创建进程获得一个句柄,其作用相当于一个令牌,用来控制被创建的进程,此句柄可以进行传递,获得了句柄的进程拥有控制和被创建进程的权力,因此进程之间不再是层次关系,而是获得句柄与否、控制与被控制的简单关系。
2.进程图
进程图:用于描述进程间关系的一棵有向树,如图所示,节点表示进程,若进程B创建进程D,则称B是D的父进程,D是B的子进程。用一条由进程B指向进程D的有向边来描述它们之间的父子关系。创建父进程的进程称为祖先进程,这便形成了一棵进程树,树的根节点作为进程家族的祖先。
3.引起进程创建的事件
为了使程序之间并发执行,应为它们分别创建进程,导致一个进程去创建另一个进程的事件有:
①用户登录:在分时系统中,用户在终端键入登录命令后,若登录成功,系统将会为该用户创建一个进程,并将它插入就绪队列中。 ② 作业调度:在多道批处理系统中,当作业调度程序按一定的算法调度到某个作业时,将其装入内存并创建进程,插入就绪队列中。 ③ 提供服务:运行中的用户程序提出某种请求后,系统将专门创建一个进程来为用户提供其所需的服务。 ④应用请求:需要由用户进程自己创建新的进程,以使新进程以同创建进程并发执行的方式完成特定任务。
4.进程的创建
在系统中每当出现创建新进程的请求时,OS便会调用进程创建原语,并按下述步骤创建一
个新进程。
(1)申请空白PCB。为新进程申请一个唯一的数字标识符,并从PCB集合中索取一个空白PCB。
(2)为新进程分配其运行所需的资源,包括各种物理和逻辑资源,如内存、文件、I/O设备和CPU时间等。这些资源从OS或其父进程获得。新进程对这些资源的需求详情,一般也要提前告知OS或其父进程。例如,为新进程的程序和数据以及用户栈分配必要的内存空间时,0S必须知道新进程所需内存的大小:①对于批处理作业,其大小可在用户提出创建进程要求时提供;②对于为应用进程创建子进程,也应在该进程提出创建进程的请求中给出所需内存的大小;③对于交互型作业,用户可以不给出内存要求而由系统分配一定的内存空间,如果新进程要共享内存中的某个地址空间(即已装入内存的共享段),则必须建立相应的链接。
(3)初始化PCB。PCB的初始化工作包括:①初始化标志信息,将系统分配的标识符和父进程标识符填人新PCB中:②初始化处理机状态信息,使程序计数器指向程序的入口地址,使栈指针指向栈顶;③初始化处理机控制信息,将进程的状态设置为就绪状态或静止就绪状态,此外,通常还须将其设置为最低优先级,除非用户以显式方式提出高优先级要求。
(4)如果进程就绪队列能够接纳新进程,就将新进程插入就绪队列.
当进程创建新进程时,有两种执行的可能:
① 父进程与子进程并发执行;
② 父进程等待,直到其某个或全部子进程执行完毕。
新进程的地址空间也有两种可能:
① 子进程是父进程的复制品(即子进程具有与父进程相同的程序和数据);
② 子进程加载另一个新程序。
上述不同功能的实现,能以UNIX系统中创建新进程的系统调用fork()为例。使用fork()后创建的新进程是通过复制原进程的地址空间而形成的,这种机制支持父进程与子进程方便地进行通信。这两个进程(父进程和子进程)都会继续执行位于系统调用fork()之后的指令。但不同的是,对于子进程,系统调用fork()的返回值为0;而对于父进程,返回值为子进程的进程标识符(非0)
通常,在系统调用fork()后,进程会使用另一个系统调用,即exec(),用新程序来取代进程的内存空间。系统调用exec()会将二进制文件装入内存(取代了原来包含系统调用exec()程序的内存映射),并开始执行。采用这种方式,两个进程能够相互通信,并能按各自的方法执行。父进程能创建更多的子进程,或者如果在子进程运行时父进程没有事情可做,那么它可以使用系统调用wait()把自己移出就绪队列以等待子进程的终止。
进程的终止
1.引起进程终止的事件
(1)正常结束:表示进程的任务已经完成,准备退出运行。
(2)异常结束:是指进程子啊运行是,发生了某些异常事件,使程序无法继续运行。常见的异常事件有:①越界错 ②保护错 ③指令错 ④特权指令错 ⑤运行超时 ⑥等待超时 ⑦算术运算错 ⑧I/O错。
(3)外界干预:是指进程应外界的请求而终止运行,干预有:①操作员或者OS干预 ②父进程的请求 ③父进程的终止
2.进程的终止过程
当系统中发生了要求终止进程的某事件后,OS便会调用进程终止原语,按下述步骤终止指定的进程:①根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,并从该进程的PCB中读出该进程的状态;②若被终止进程正处于执行状态,则立即终止该进程的执行,并置调度标志为真,以指示该进程被终止后应重新进行调度;③若该进程还有子孙进程,则还应终止其所有子孙进程,以防止它们成为不可控的进程;④将被终止的进程所拥有的全部资源,或归还给其父进程,或归还给系统;⑤将被终止进程的PCB从所在队列(或链表)中移出,等待其他程序来搜集信息。
进程的挂起与激活
1.进程的挂起
当系统中出现引发进程挂起的事件时,OS就会利用挂起原语suspend将指定进程或处于阻塞状态的进程挂起。suspend的执行过程是:首先,检查被挂起进程的状态,若为活动就绪状态,则将其改为静止就绪状态;其次,针对处于活动阻塞状态的进程,将其状态改为静止阻塞状态;再次,为了方便用户或父进程考查该进程的运行情况,把该进程的PCB复制到某指定的内存区域;最后,若被挂起的进程正在执行,则转向调度程序重新调度。
2.进程的激活
当系统中出现激活进程的事件时,OS就会利用激活原语active将指定进程激活。active的执行过程是:首先将进程从外存调入内存,然后检查该进程的现行状态,若是静止就绪,则将其改为活动就绪;若是静止阻塞,则将其改为活动阻塞。假如采用的是抢占调度策略,则每当有静止就绪进程被激活而插入就绪队列时,便应检查是否要进行重新调度,即由调度程序将被激活进程与当前进程两者的优先级进行比较,如果被激活进程的优先级较低,就不必重新调度;否则,立即终止当前进程的运行,并把处理机分配给刚被激活的进程。
(四)进程通信
(五)线程的概念
(六)线程的实现