操作系统教程3.ppt
第三章 进程管理,3.0 概述(PROCESS)3.1 进程的描述3.2 进程控制3.3 线程(THREAD)3.4 进程互斥和同步3.5 进程间通信(IPC,INTER-PROCESS COMMUNICATION)3.6 死锁问题(DEADLOCK)3.7 进程其他方面的举例,为了描述程序在并发执行时对系统资源的共享,我们需要一个描述程序执行时动态特征的概念,这就是进程。本章将讨论进程概念、进程控制和进程间关系。,3.0 概述(PROCESS),3.0.1 程序的顺序执行和并发执行3.0.2 进程的定义3.0.3 进程的特征3.0.4 进程与程序的比较,返回,3.0.1 程序的顺序执行和并发执行,程序的执行有两种方式:顺序执行和并发执行。顺序执行是单道批处理系统的执行方式,也用于简单的单片机系统;现在的操作系统多为并发执行,具有许多新的特征。引入并发执行的目的是为了提高资源利用率。,程序:完成所要求的功能时,所应采取的顺序步骤,是执行指令的有序集合。程序的顺序执行:具有独立功能的程序独占CPU直至得到最终结果的过程顺序执行的特征顺序性:按照程序结构所指定的次序(可能有分支或循环)封闭性:独占全部资源,计算机的状态只由于该程序的控制逻辑所决定可再现性:初始条件相同则结果相同。如:可通过空指令控制时间关系。,1.程序的顺序执行,2.程序的并发执行,程序并发执行的目的:提高计算机的处理能力提高资源利用率分为两种形式:多道程序环境下的多道程序的并发执行在某道程序的几个程序段中,包含可同时执行或可颠倒顺序执行的代码。定义:程序的并发执行是指一组在逻辑上互相独立的程序或程序段在执行时间上客观上互相重叠,即一个程序或程序段的执行尚未结束,另一个程序(段)的执行已经开始的执行方式。,程序的并发执行-例,并发:在一段时间内的同时并行并行:在同一物理时刻的同时,用户程序监督程序磁盘设备磁带设备用户程序A用户程序B监督程序磁盘设备磁带设备,时间t,CPU,外设,CPU,外设,请求带输入,启动带,磁带输入,结束中断,中断处理,请求磁盘输入,启动盘,结束中断,中断处理,请求盘输入,启动盘,调度B,请求带输入,启动带,结束中断,中断处理调度A,结束中断,中断处理调度B,并发执行的特征,并发执行的特征间断(异步)性:走走停停,一个程序可能走到中途停下来,失去原有的时序关系;失去封闭性:共享资源,受其他程序的控制逻辑的影响。如:一个程序写到存储器中的数据可能被另一个程序修改,失去原有的不变特征。失去可再现性:失去封闭性 失去可再现性;外界环境在程序的两次执行期间发生变化,失去原有的可重复特征。,不加控制的并发执行所带来的影响,例:利用堆栈管理一块内存区中各数据块的使用情况。用getaddr(top)从栈顶取出相应的内存块的地址。用reladdr(blk)将数据块的地址(以bkl为地址)放入堆栈中。,proc getaddr(top)Begin local r;1.1 r stop;1.2 top top+1;1.3 return(r);end;Proc reladdr(blk)Begin 2.1 top top-1;2.2 stop blk;End;,分析getaddr(top)与reladdr(blk)的并发执行,2.1 top top-1,1.1 r stop,1.2 top top+1,1.3 return(r),2.2 stop blk,blk,例的说明,getaddr()和reladdr()的并发执行,产生了错误的结果,不同执行顺序得到不同的结果,程序的执行不再具有封闭性和结果的可再现性。原因:对公共变量(堆栈或堆栈指针)的共享引起的。为了获得结果的可再现性,程序的并发执行是需要条件的。,并发执行的条件:达到封闭性和可再现性,程序 P(i)针对的读变量集和写变量集 为R(i)和W(i)任意两个程序P(i)和P(j)可并发的条件:R(i)W(j)=,andW(i)R(j)=,andW(i)W(j)=,并发执行失去封闭性的原因是共享资源的影响,去掉这种影响就行了。1966年,由Bernstein给出并发执行的条件。(这里没有考虑执行速度的影响。),前两条保证一个程序的两次读之间数据不变化;最后一条保证写的结果不丢掉。,现在的问题是这个条件不好检查。,3.0.2 进程的定义,进程描述了程序的动态执行过程;它对应虚拟处理机、虚拟存储器和虚拟外设等资源的分配和回收;反映系统中程序执行的并发性、随机性和资源共享引入多进程,提高了对硬件资源的利用率,但又带来额外的空间和时间开销,增加了OS 的复杂性;,1.进程的定义,一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。简言之,进程是程序的一次执行活动。,3.0.2.进程的特征,动态性:进程对应程序的执行进程是动态产生,动态消亡的进程在其生命周期内,在三种基本状态之间转换独立性:各进程的地址空间相互独立,除非采用进程间通信手段;并发性:任何进程都可以同其他进程一起向前推进异步性:每个进程都以其相对独立的不可预知的速度向前推进结构化:进程=代码段+数据段+PCB,3.0.3.进程与程序的区别,进程是动态的,程序是静态的:程序是有序代码的集合;进程是程序的执行。通常进程不可在计算机之间迁移;而程序通常对应着文件、静态和可以复制。进程是暂时的,程序的永久的:进程是一个状态变化的过程,程序可长久保存。进程与程序的组成不同:进程的组成包括程序、数据和进程控制块(即进程状态信息)。进程与程序的对应关系:通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序。,3.0.3.进程与程序的区别,举例:正在运行的Web浏览器是一个进程,正在运行的Windows资源管理器是一个进程,正在运行的Visual C编程环境也是一个进程在计算机中处于运行状态的任何一个程序都是一个进程,一个进程拥有内存、CPU时间等一系列资源程序是指计算机指令的集合,而进程是指执行这个程序所需的各种资源的集合。,作业、作业步和进程的关系,用户,线程,进程,作业步,作业,作业步,进程,线程,由用户创建,由系统创建,由用户指定,.,.,.,3.1 进程的描述,3.1.1 进程的组成3.1.2 进程控制块PCB3.1.3 进程上下文3.1.4 进程的状态及其相互转换3.1.5 进程,3.1.1 进程的组成,进程=程序+数据+进程控制块PCB程序是进程的不可缺少的组成部分;如果一个程序段允许被共享,则它应该是可重入的,或纯代码段数据是进程处理的对象进程控制块是进程的控制结构,包含了进程的描述信息、控制信息和资源信息以及现场保护区,是进程的唯一标识,系统通过PCB管理和控制进程。,3.1.2 进程控制块PCB(PCB,process control block),进程控制块是由OS维护的用来记录进程相关信息和管理进程设置的一个专门的数据结构。包含了进程的描述信息、控制信息和资源信息以及现场保护区;PCB是进程动态特性的集中反映。系统通过PCB感知进程的存在,通过PCB中所包含的各项变量的变化,掌握进程的状态以达到控制进程活动的目的;PCB结构的全部或部分常驻内存;PCB随进程的创建而填写,随进程的撤消而释放;系统利用PCB来控制和管理进程,所以PCB是系统感知进程存在的唯一标志进程与PCB是一一对应的,进程控制块的内容,进程描述信息:进程标识符(process ID),唯一,通常是一个整数;进程名,通常基于可执行文件名用户标识符(user ID);进程组关系(process group)进程控制信息:当前状态;优先级(priority);代码执行入口地址;程序的外存地址;运行统计信息(执行时间、页面调度);进程间同步和通信;阻塞原因,资源占用信息:虚拟地址空间的现状、打开文件列表CPU现场保护结构:寄存器值(通用、程序计数器PC、状态PSW,地址包括栈指针),3.1.3 进程上下文,用户级上下文:进程的用户地址空间(包括用户栈各层次),包括用户正文段、用户数据段和用户栈;寄存器级上下文:程序寄存器、处理机状态寄存器、栈指针、通用寄存器的值;系统级上下文:静态部分(PCB和资源表格)动态部分:核心栈(核心过程的栈结构,不同进程在调用相同核心过程时有不同核心栈),进程上下文是对进程执行活动全过程的静态描述。进程上下文由进程的用户地址空间内容、硬件寄存器内容及与该进程相关的核心数据结构组成(正文段、数据集、堆栈)。,PCB,各种控制表指针,栈区,数据集,正文集,各种寄存器,进程上下文结构,3.1.3 进程上下文,PCB的组织方式,PCB表:系统把所有PCB组织在一起,并把它们放在内存的固定区域,就构成了PCB表PCB表的大小决定了系统中最多可同时存在的进程个数,称为系统的并发度,PCB的组织方式,链表:同一状态的进程其PCB成一链表,多个状态对应多个不同的链表各状态的进程形成不同的链表:就绪链表、阻塞链表索引表:同一状态的进程归入一个index表(由index指向PCB),多个状态对应多个不同的index表各状态的进行形成不同的索引表:就绪索引表、阻塞索引表,进程控制块的链式组织,3.1.4 进程的状态及其转换,3.1.4.1 核心态和用户态3.1.4.2 进程的三种基本状态3.1.4.3 五状态进程模型3.1.4.4 挂起进程模型,3.1.4.1 核心态和用户态,进程的执行状态可分为用户执行状态和系统执行状态用户执行状态,又称用户态,进程的用户程序段执行时,该程序处于用户态。用户态时不可直接访问受保护的OS代码;系统执行状态,又称系统态,核心态,进程的系统程序执行时,该进程处于系统态。核心态时可以执行OS代码,可以访问全部进程空间。划分用户态和系统态的原因:把用户程序和系统程序分开,以利程序的保护和共享但增加了系统复杂度和系统开销,3.1.4.2 进程的三种基本状态,不同系统设置的进程状态数目不同 1.进程的三种基本状态:就绪态、执行态、等待态就绪态(Ready):一个进程已经具备运行条件,但由于无CPU暂时不能运行的状态(当调度给其CPU时,立即可以运行。“万事俱备,只欠东风”。位于“就绪队列”中执行态(Running):进程占有了包括CPU在内的全部资源,并在CPU上运行等待态(Blocked):阻塞态、挂起态、封锁态、冻结态、睡眠态。指进程因等待某种事件的发生而暂时不能运行的状态(即使CPU空闲,该进程也不可运行)。处于等待态的进程位于等待队列中。,2.基本状态间的转换,运行Running,就绪Ready,等待Blocked,Dispatch,Timeout,Event,Wait,Event,Occurs,在进程运行过程中,由于进程自身进展情况及外界环境的变化,这三种基本状态可以依据一定的条件相互转换 就绪运行:调度程序选择一个新的进程运行 运行就绪:运行进程用完了时间片运行进程被中断,因为一高优先级进程处于就绪状态 运行等待:当一进程等待某一事件的发生时,如OS尚未完成服务对一资源的访问尚不能进行初始化I/O 且必须等待结果等待某一进程提供输入(IPC)等待就绪:当所等待的事件发生时,进程状态转换,其他状态创建状态:创建(新new)状态OS 已完成为创建一进程所必要的工作已构造了进程标识符已创建了管理进程所需的表格但还没有允许执行该进程(尚未同意)因为资源有限,OS所需的关于该进程的信息保存在主存中的进程表中,但进程自身还未进入主存,也没有为与这个程序相关的数据分配空间,程序保留在辅存中。在批处理系统中,提交新作业;为新登陆用户创建进程,为请求打印的进程创建打印进程,请求进程可以继续处理其他事情。终止状态(Exit):终止后进程移入该状态它不再有执行资格表格和其它信息暂时由辅助程序保留例子:为处理用户帐单而累计资源使用情况的财务程序挂起状态:把一个进程从内存转到外存,3.1.4.2 五状态进程模型,五状态模型就是对暂停状态的细化。,Admit,Running,New,Exit,Ready,Blocked,Dispatch,Timeout,Event,Wait,Event,Occurs,Release,Create,Admit,Ready Queue 就绪队列,Dispatch,Time-out 超时,Event Wait,Release,CPU,Blocked Queue 等待队列,Event,Occurs,五状态进程模型(单队列结构),提交,调度,Processor,释放,等待事件,事件发生,Admit,Ready Queue,Dispatch,Time-out,Release,Processor,Event 1 Wait,Event 1 Queue,Event 1,Occurs,Event 2 Wait,Event 2 Queue,Event 2,Occurs,五状态进程模型(多队列结构),3.1.4.3 挂起进程模型,这个问题的出现是由于进程优先级的引入,一些低优先级进程可能等待较长时间,从而被对换至外存。这样做的目的是:提高处理机效率:就绪进程表为空时,要提交新进程,以提高处理机效率;为运行进程提供足够内存:资源紧张时,暂停某些进程,如:CPU繁忙(或实时任务执行),内存紧张用于调试:在调试时,挂起被调试进程(从而对其地址空间进行读写),单挂起进程模型,Admit,Running,Ready,Suspend,Exit,Ready,Blocked,Dispatch,Timeout,Event,Wait,Event,Occurs,Release,Blocked,Suspend,Suspend,New,Event,Occurs,Activate,Suspend,Activate,Admit,Suspend,双挂起进程模型,1.状态,就绪状态(Ready):进程在内存且可立即进入运行状态;阻塞状态(Blocked):进程在内存,并等待某事件的出现;阻塞挂起状态(Blocked,suspend):进程在外存并等待某事件的出现;就绪挂起状态(Ready,suspend):进程在外存,但只要进入内存,即可运行;,注:这里只列出了意义有变化或新的状态。,2.相关的转换,挂起(Suspend):把一个进程从内存转到外存;可能有以下几种情况:阻塞到阻塞挂起:没有进程处于就绪状态或就绪进程要求更多内存资源时,会进行这种转换,以提交新进程或运行就绪进程;就绪到就绪挂起:当有高优先级阻塞(系统认为会很快就绪的)进程和低优先级就绪进程时,系统会选择挂起低优先级就绪进程;运行到就绪挂起:对抢先式分时系统,当有高优先级阻塞挂起进程因事件出现而进入就绪挂起时,系统可能会把运行进程转到就绪挂起状态;,2.相关的转换(续),激活(Activate):把一个进程从外存转到内存;可能有以下几种情况:就绪挂起到就绪:没有就绪进程或挂起就绪进程优先级高于就绪进程时,会进行这种转换;阻塞挂起到阻塞:当一个进程释放足够内存时,系统会把一个高优先级阻塞挂起(系统认为会很快出现所等待的事件)进程转为阻塞状态;事件出现(Event Occurs):进程等待的事件出现;如:操作完成、申请成功等;可能的情况有:阻塞到就绪:针对内存进程的事件出现;阻塞挂起到就绪挂起:针对外存进程的事件出现;收容(Admit):收容一个新进程,进入就绪状态或就绪挂起状态。进入就绪挂起的原因是系统希望保持一个大的就绪进程表(挂起和非挂起);,【练习思考题】,如果系统中有N个进程,运行的进程最多几个,最少几个;就绪进程最多几个最少几个;等待进程最多几个,最少几个?有没有这样的状态转换,为什么?等待运行;就绪等待一个状态转换的发生,是否一定导致另一个转换发生,列出所有的可能举3个日常生活中类似进程的例子,3.2 进程控制,3.2.1 进程控制的功能3.2.2 进程的主要原语3.2.3 UNIX进程管理3.2.4 NT线程的挂起和激活3.2.6 Windows NT进程管理举例,返回,3.2.1 进程控制的功能,完成创建和撤消进程,完成进程状态的转换。,原语(primitive):由若干条指令构成的“原子操作(atomic operation)”过程,作为一个整体而不可分割-要么全都完成,要么全都不做。许多系统调用就是原语。,注意:系统调用并不都是原语。进程A调用read(),因无数据而阻塞,在read()里未返回。然后进程B调用read(),此时read()被重入。系统调用不一定一次执行完并返回该进程,有可能在特定的点暂停,而转入到其他进程。,3.2.2 进程控制的主要原语,进程创建与撤消原语 进程阻塞与唤醒原语 进程挂起与激活原语,1.进程创建与撤消原语,为进程创建一个PCB赋予一个统一进程标识符为进程映象分配空间初始化进程控制块设置相应的链接把新进程加到就绪队列的链表中插入家族队列,主要任务:,需要的参数:被创建进程的外部标识符n处理机的初始状态S0(包括CPU的工作方式、进程起始地址及屏蔽码等);进程优先级P0;初始内存数M0;其它所需资源清单R0。i.sdata是一个与进程状态有关的指针。,1)进程创建原语:,进程树,进程树是有向树父子关系表示创建与被创建的关系父子关系不表示执行的先后关系,继承(inherit)的信息:子进程可以从父进程中继承用户标识符、环境变量、打开文件、文件系统的当前目录、控制终端、已经连接的共享存储区、信号处理例程入口表等不被继承信息:进程标识符,父进程标识符spawn创建并执行一个新进程;新进程与父进程的关系可有多种:覆盖(_P_OVERLAY)、并发(_P_NOWAIT or _P_NOWAITO)、父进程阻塞(_P_WAIT)、后台(_P_DETACH)等。,产生新进程,不产生新进程,复制现有进,程的,上下文,fork,(新进程的系统上,下文会有不同),加载程序,spawn,(创建新进程并加载新程序),exec,(加载新程序并,覆盖自身),子进程的创建有3种形式,创建原语的描述,Procedure Create(n,S0,P0,M0,R0)Begin i:=GetInternalName(n);i.id:=n;i.priority:=P0;/*初始化PCB*/i.CPU_State:=S0;i.Mainstore:=M0;i.resources:=R0;i.status:=Ready;j:=EP;i.parent:=j;/*插入家族队列*/i.progeny:=;j.progeny:=i;i.sdata:=RQ;insert(RQ,i);/*插入就绪队列*/End;,查找PCB集合,返回PCB的内部标识符 i,2)进程撤消原语Destroy,导致进程被撤消的原因一个进程在完成任务而正常终止由于错误导致非正常终止祖先进程要求撤消某个子进程功能:释放内外存空间关闭所有打开文件释放共享内存段和各种锁定lock撤消其子孙进程(以免其成为不可控的)释放其PCB,撤消原语的描述,Procedure Destroy(n)Begin Sched:=false;i:=GetInternalName(n);Kill(i);if Sched then Scheduler else continue;End;,Procedure Kill(i)Begin if i.status=“Running”then stop(i);Sched:=True;remove(i.sdata,i);for all Si.progeny do Kill(S);for all rMain store i.resources do Release(r);Release(PCB(i)End;(Kill是可递归的),调用者提供的进程的外部标识,如果进程正在运行,则立即停止其运行,并设置调度标志为真,2.进程阻塞与唤醒原语,原因:当进程期待的某事件尚未出现时,该进程调用阻塞原语把自己阻塞起来。过程:保护中断现场置进程的状态为“等待态”将其插入该事件的等待队列WQ(r)转进程调度注意:由自己阻塞自己,但该进程的唤醒则是在该进程所期待的事件发生后,由“发现者”进程调用唤醒原语实现,1)进程阻塞原语Block,阻塞原语描述,Procedure block(r)Begin i:=EP;stop(i);i.status:=“blocked”;i.sdata:=WQ(r);insert(WQ(r),i);scheduler;End;,r 为指向等待原因的对应等待队列的指针从执行进程的指针获得进程的内部标识符i停止进程i进程调度程序,2)唤醒原语Wakeup,原因:进程等待的事件发生,等待队列中的进程全部唤醒唤醒进程的两种方法:由系统进程唤醒。系统进程统一控制事件的发生,并将“事件发生”这一消息通知等待进程。等待的是公共资源。由事件发生进程唤醒。事件发生进程与被唤醒的进程是合作关系,等待私有资源,2)唤醒原语Wakeup(续),处理过程从相应的等待队列中摘下被唤醒的进程状态置为“就绪态ready”;插入就绪队列唤醒进程返回或转进程调度,Procedure wakeup(n)Begin i:=GetInternalName(n);remove(WQ(r),i);i.status:=“Ready”;i.sdata:=RQ;insert(RQ,i);continue;End;,3.进程的挂起与激活原语汤2,需求:当需要把某进程置于就绪挂起状态(Readys)或阻塞挂起状态(Blockeds)时,调用挂起原语,即将进程从活动就绪状态或阻塞状态变为相对静止的就绪挂起状态或阻塞挂起状态进程的挂起方式:(1)发命令的进程自身挂起;(2)挂起具有指定标识符的进程;(3)将某进程及其全部或部分“子孙”进程挂起。,1)挂起原语(Suspend Primitive),1)挂起原语(Suspend Primitive)(续),procedure Suspend(n,a)/*挂起指定标识符n的进程的进程原语*/*参数a是用于保存该进程PCB副本的内存区*/Begin i:=GetInternalName(n);S:=i.status;if S=“Running”then stop(i);a:=copy PCB(i);if S=“blockeda”then i.status:=“blockeds”else i.status:=“readys”if S=“Running”then Scheduler else continue;End;,相关,2)激活原语(Active Primitive),功能:使处于静止状态的进程变为活动状态,即把“静止就绪”变为“活动就绪”,把“静止阻塞”变为“活动阻塞”。激活方式激活一个指定标识符的进程激活某进程及其所有“子孙”进程等当激活的进程处于“活动就绪”状态时,将引起进程的重新调度,激活指定标识符进程的激活原语描述,procedure active(n)begin i:=GetInternalName(n);i.status:=if i.status=“readys”then“readya”else“blockeda”;if i.status=“readya”then scheduler;else continueEnd;,3.2.3 UNIX的进程管理,1.UNIX的进程PCB结构2.UNIX的进程状态及其转换UNIX的进程控制创建与撤消进程阻塞与唤醒,进程上下文:指进程的用户地址空间内容、寄存器内容及与进程相关的核心数据结构;包括三部分上下文:用户级、寄存器级、系统级用户级上下文:正文段即代码(text);数据段(data);栈段(user stack):用户态执行时的过程调用;共享存储区(shared memory)把地址空间的段称为区(region):进程区表和系统区表(前者索引指向后者)系统上下文:proc结构:总在内存,内容包括阻塞原因;user结构:可以调出到外存,进程处于执行状态时才用得着,各种资源表格;进程区表:从虚拟地址到物理地址的映射;核心栈:核心态执行时的过程调用的栈结构;,3.2.3.1 UNIX的进程PCB结构,3.2.3.2.UNIX的进程状态及其转换(课本),Not Enough,Memory,Kernal,Running,Ready to Run,Swapped,Zombie,Ready to Run,in Memory,Asleep in,Memory,Reschedule,Process,Sleep,Wakeup,Exit,Sleep,Swapped,Swap Out,Created,Wakeup,Swap In,Enough,Memory,Fork,Swap Out,User,Running,Preempted,Return,System Call,Interrupt,Interrupt,Interrupt Return,Preempt,Return,to User,Unix采用两个状态表示进程在用户模式下还是在内核模式下执行。,注意:状态“被抢先(被剥夺)”与“内存就绪”的地位相同,要等到下一次进程调度时,才能回到“用户态执行”。为了强调正在核心态运行的进程不能被剥夺,仅当它即将返回用户态时,才能被剥夺,3.2.3.3.UNIX的进程控制,UNIX的进程控制的系统调用:fork():创建一个新进程exec():执行一个可执行程序exit():退出sleep():暂停一段时间pause():暂停并等待信号wait():等待子进程暂停或终止kill():发送信号到某个或一组进程ptrace():设置执行断点(breakpoint),允许父进程控制子进程的运行,1.fork()创建一个新进程,fork()调用格式:pid=fork()父子进程的fork()返回值不同:在子进程中返回时,pid为0;在父进程中返回时,pid为所创建的子进程的标识。fork()创建子进程之后,执行返回父进程,或调度切换到子进程以及其他进程。fork创建一个新进程(子进程),除了子进程标识符和其proc结构中的某些特性参数不同之外,子进程是父进程的精确复制。子进程是从fork调用返回时在用户态开始运行的。父进程的返回点与子进程的开始点是相同的。功能与处理流程:,fork()功能,为子进程在proc结构表中分配一个空项;为进程赋予一个唯一的进程标识符pid;赋值一个父进程上下文的逻辑副本。这里的逻辑副本是指不把父进程中那些可被共享的部分复制到新的内存区中,而只改变共享区的引用数。只复制父进程的非共享区部分;增加与父进程相关联的有关文件系统的进程引用计数;对于父进程,返回子进程的进程标识符;对子进程,返回0。,fork()的处理流程,有足够的内存区和交换区?,有足够的空闲proc结构块?,分配一个空闲的proc结构项,确定一个唯一的进程标识符,设置子进程的状态为创建态,将父进程proc结构项中的数据复制到子进程的proc结构中,父进程的打开文件表引用数增1,在父进程的fork专用保存区中保存进程上下文,以使子进程被调度时从这里执行,在内存中对父进程的上下文进行逻辑复制,内存中有足够的存储区用于复制?,将子进程上下文换出,否,将子进程入就绪队列,发生调度,且调度到子进程?,返回子进程pid,返回0,创建失败,否,否,否,2.exec()执行一个文件的调用,子进程如何执行一个新的程序文本?通过exec族调用,加载新的程序文本exec用一个新进程覆盖调用进程。它的参数包括新进程对应的文件和命令行参数。成功调用时,不再返回;否则,返回出错原因。六种exec调用格式:各种调用的区别在于参数的处理方法不同,常用的格式有:execvp(filename,argp):execlp(filename,arg0,arg1,.,(char*)0):,例:UNIX进程创建,int global;,main(),int local;,if(child=fork()=-1),创建失败,if(child=0),子进程,global=local+2;,exit();,父进程,global=local+1;,exit();,if(execlp(B,)=-1),加载程序失败,main(),exit();,Program A,Program B,3.3 线程(THREAD),3.3.1 线程的引入3.3.2 进程和线程的比较3.3.3 线程举例,返回,引入线程的目的是简化线程间的通信,以小的开销来提高进程内的并发程度。,3.3.1 线程的引入,进程:资源分配单位(存储器、文件)和CPU调度(分派)单位。又称为任务(task)“多线程是指OS支持在一个进程中执行多个线程的能力线程:作为CPU调度单位,而进程只作为其他资源分配单位。只拥有必不可少的资源,如:线程状态、寄存器上下文和栈同样具有就绪、阻塞和执行三种基本状态线程的优点:减小并发执行的时间和空间开销(线程的创建、退出和调度),因此容许在系统中建立更多的线程来提高并发程度。线程的创建时间比进程短;(线程也要分时共享CPU)线程的终止时间比进程短;同进程内的线程切换时间比进程短(上下文有许多是相同的);由于同进程内线程间共享进程的代码,数据,内存和文件资源,可直接进行不通过内核的通信;而进程间的通信需要通过内核进行,以提供保护和通信所需机制所有线程必须同时处于挂起状态;进程的终止会导致所有线程的终止。,进程与线程的关系,线程引入,进程模型在处理“基于同数据区的同时多请求”时的效率局限性,例:售票系统:数据库服务器软件需同时处理来自多个用户进程的读盘请求,这些请求都是针对同一个盘,可以有如下几种方式:进程:一个进程来顺序处理;多个相互独立的进程:每个进程负责处理一个请求用一个进程来并发处理所有请求(读盘时要阻塞,处理下一个请求),,线程引入,通过线程可方便有效地实现并行性当一个应用是由若干各相对独立的任务构成时特别有用。进程可创建多个线程来执行统一程序的不同部分;创建线程快,开销少所有线程可共享进程的主存,不需要特殊的通信机制,如一个线程将输出写入主存,另一线程可以读出作为输入;程之间切换的开销要比线程之间切换的开销小。多线程机制,对多个客户同时提出服务请求时的回答十分有利。,OS对线程的实现方式,内核维护进程和线程的上下文信息;线程切换由内核完成;一个线程发起系统调用而阻塞,不会影响其他线程的运行。时间片分配给线程,所以多线程的进程获得更多CPU时间。,依赖于OS核心,由内核的内部需求进行创建和撤销,用来执行一个指定的函数。Windows NT和OS/2支持内核线程;,内核线程(kernel-level thread),用户线程(user-level thread),用户线程的维护由应用进程完成;内核不了解用户线程的存在;用户线程切换不需要内核特权;用户线程调度算法可针对应用优化;,不依赖于OS核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。调度由应用软件内部进行,通常采用非抢先式和更简单的规则,也无需用户态/核心态切换,所以速度特别快。一个线程发起系统调用而阻塞,则整个进程在等待。时间片分配给进程,多线程则每个线程就慢。,轻权进程(LightWeight Process),它是内核支持的用户线程。一个进程可有一个或多个轻权进程,每个轻权进程由一个单独的内核线程来支持。由于同时提供内核线程控制机制和用户线程库,因此可很好地把内核线程和用户线程的优点结合起来。,3.3.2 进程和线程的比较,地址空间和其他资源(如打开文件):进程间相互独立,同一进程的各线程间共享某进程内的线程在其他进程不可见通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信需要进程同步和互斥手段的辅助,以保证数据的一致性调度:线程上下文切换比进程上下文切换要快得多;,每个线程的内容 每个进程的内容 程序计数器 地址空间 堆栈 全局变量 寄存器组 打开文件 子线程 子进程 状态 定时器信号信号量 记帐信息线程和进程的内容比较,线程切换和进程切换,3.3.3 线程举例,Windows NT 的线程状态Windows NT 的线程API举例,就绪状态(Ready):进程已获得除处理机外的所需资源,等待执行。备用状态(Standby):备用线程已经被选择下一次在一个特定的处理器上,直到那个处理器可用。系统中每个处理器上只能有一个处于备用状态的线程。运行状态(Running):完成描述表切换,线程进入运行状态,直到内核抢先、时间片用完、线程终止或进行等待状态。等待状态(Waiting):线程等待对象句柄,以同步它的执行。等待结束时,根据优先级进入运行、就绪状态。转换状态(Transition):线程在准备执行而其内核堆栈处于外存时,线程进入转换状态;当其内核堆栈调回内存,线程进入就绪状态。终止状态(Terminated):线程执行完就进入终止状态;如执行体有一指向线程对象的指针,可将线程对象重新初始化,并再次使用。初始化状态(Initialized):线程创建过程中的线程状态;,Windows 2000 线程状态,例子NT_thread.cpp,#include#include#include#include void SubThread(void)int i;for(i=0;i5;i+)cout SubThread i endl;Sleep(2000);,void main(void)cout CreateThread endl;/Create a thread;DWORD IDThread;HANDLE hThread;hThread=CreateThread(NULL,/no security attributes 0,/use default stack size(LPTHREAD_START_ROUTINE)SubThread,/thread function NULL,/no thread function argument 0,/use default creation flags,int i;for(i=0;i5;i+)cout MainThread i endl;if(i=1)if(SuspendThread(hThread)=0 xFFFFFFFF)cout Suspend thread error.endl;elsecout Suspend thread is ok.endl;if(i=3)if(ResumeThread(hThread)=0 xFFFFFFFF)cout Resume thread error.endl;elsecout Resume thread is ok.endl;Sleep(4000);,CreateThreadMainThread0SubThread0SubThread1MainThread1Suspend thread is ok.MainThread2MainThread3Resume thread is ok.SubThread2SubThread3MainThread4SubThread4,运行结果,3.4 进程互斥和同步,3.4.0 进程间的关系3.4.1 互斥算法3.4.2 信号量(semaphore)3.4.3 经典进程同步问题3.4.4 管程(monitor)3.4.5 Windows NT的进程互斥和同步,返回,Why?How?Examples,3.4.0 进程间的关系,1.回顾操作系统的特性:并发资源共享异步性(不确定性 或 随机性)虚拟性进程并发执行举例进程的交互临界资源和临界区,3.4.0.2 进程并发执行举例,例1:利用堆栈管理一块内存区中各数据块的使用情况。用getaddr(top)从栈顶取出相应的内存块的地址。用reladdr(blk)将数据块(以bkl为地址)放入堆栈中。,proc getaddr()Begin local r;1.1 r stop;1.2 top top+1;1.3 return(r);end;,Proc reladdr(blk)Begin 2.1 top top-1;2.2 stop blk;En