清华大学操作系统向勇老师的讲义市公开课一等奖百校联赛获奖课件.pptx
第四章 进程管理4.1 进程(PROCESS)4.2 进程控制4.3 线程(THREAD)4.4 进程互斥和同时4.5 进程间通信(IPC,INTER-PROCESS COMMUNICATION)4.6 死锁问题(DEADLOCK)4.7 进程其它方面举例为了描述程序在并发执行时对系统资源共享,我们需要一个描述程序执行时动态特征概念,这就是进程。在本章中,我们将讨论进程概念、进程控制和进程间关系。第1页4.1 进程(PROCESS)4.1.1 程序次序执行和并发执行4.1.2 进程定义和描述4.1.3 进程状态转换4.1.4 操作系统代码执行返回第2页4.1.1 程序次序执行和并发执行程序执行有两种方式:次序执行和并发执行。次序执行是单道批处理系统执行方式,也用于简单单片机系统;现在操作系统多为并发执行,含有许多新特征。引入并发执行目标是为了提升资源利用率并适应多任务处理要求。第3页次序执行特征次序性:按照程序结构所指定次序(可能有分支或循环)封闭性:独占全部资源,计算机状态只因为该程序控制逻辑所决定可再现性:初始条件相同则结果相同。如:可经过空指令控制时间关系。并发执行特征间断(异步)性:走走停停,一个程序可能走到中途停下来,失去原有时序关系;失去封闭性:共享资源,受其它程序控制逻辑影响。如:一个程序写到存放器中数据可能被另一个程序修改,失去原有不变特征。失去可再现性:失去封闭性 失去可再现性;外界环境在程序两次执行期间发生改变,失去原有可重复特征。第4页并发执行条件:到达封闭性和可再现性程序 P(i)针对共享变量读集和写集 R(i)和W(i)条件:任意两个程序P(i)和P(j),有:R(i)W(j)=;W(i)R(j)=;W(i)W(j)=;并发执行失去封闭性原因是共享资源影响,去掉这种影响就行了。1966年,由Bernstein给出并发执行条件。(这里没有考虑执行速度影响。)前两条确保一个程序两次读之间数据不改变;最终一条确保写结果不丢掉。现在问题是这个条件不好检验。第5页4.1.2 进程定义和描述它对应虚拟处理机、虚拟存放器和虚拟外设等资源分配和回收;引入多进程,提升了对硬件资源利用率,但又带来额外空间和时间开销,增加了OS 复杂性;1.进程定义一个含有一定独立功效程序在一个数据集合上一次动态执行过程。第6页进程与程序关系类比这时小儿子哭着跑进来,说手被蜜蜂蛰了。教授只好把蛋糕先放在一边。他在食谱上做了个标识,把状态信息统计了起来。然后又去找了一本医疗手册,查到了相关内容,按照上面指令一步步地执行。当伤口处理完之后,又回到厨房继续做蛋糕。有一个计算机科学家,想亲手给女儿做一个生日蛋糕。所以他就找了一本相关做蛋糕食谱,买了一些原料,面粉、鸡蛋、糖、香料等,然后边看边学边做。食谱 程序;科学家 CPU;原料 数据;做蛋糕 =进程;CPU从一个进程(做蛋糕)切换到另一个进程(医疗救护)。第7页2.进程特征动态性:进程含有动态地址空间(数量和内容),地址空间上包含:代码(指令执行和CPU状态改变)数据(变量生成和赋值)系统控制信息(进程控制块生成和删除)独立性:各进程地址空间相互独立,除非采取进程间通信伎俩;并发性、异步性:虚拟结构化:代码段、数据段和关键段(在地址空间中);程序文件中通常也划分了代码段和数据段,而关键段通常就是OS关键(由各个进程共享,包含各进程PCB)第8页四个进程在并发地运行第9页3.进程与程序区分进程是动态,程序是静态:程序是有序代码集合;进程是程序执行。通常进程不可在计算机之间迁移;而程序通常对应着文件、静态和能够复制。进程是暂时,程序永久:进程是一个状态改变过程,程序可长久保留。进程与程序组成不一样:进程组成包含程序、数据和进程控制块(即进程状态信息)。进程与程序对应关系:经过屡次执行,一个程序可对应多个进程;经过调用关系,一个进程可包含多个程序。第10页4.处理机调度器(dispatcher)把处理机从一个进程切换到另一个进程;预防某进程独占处理机;处理机调度器是操作系统中一段代码,它完成以下功效:第11页5.进程控制块(PCB,process control block)每个进程在OS中记录表项(可能有总数目限制),OS据此对进程进行控制和管理(PCB中内容会动态改变),不一样OS则不一样处于关键段,通常不能由应用程序本身代码来直接访问,而要经过系统调用,或经过UNIX中进程文件系统(/proc)直接访问进程映象(image)。文件或目录名为进程标识(如:00316),权限为创建者可读写。进程控制块是由OS维护用来统计进程相关信息一块内存。第12页进程控制块内容进程描述信息:进程标识符(process ID),唯一,通常是一个整数;进程名,通常基于可执行文件名(不唯一);用户标识符(user ID);进程组关系(process group)进程控制信息:当前状态;优先级(priority);代码执行入口地址;程序外存地址;运行统计信息(执行时间、页面调度);进程间同时和通信;阻塞原因资源占用信息:虚拟地址空间现实状况、打开文件列表CPU现场保护结构:存放器值(通用、程序计数器PC、状态PSW,地址包含栈指针)第13页6.PCB组织方式链表:同一状态进程其PCB成一链表,多个状态对应多个不一样链表各状态进程形成不一样链表:就绪链表、阻塞链表索引表:同一状态进程归入一个index表(由index指向PCB),多个状态对应多个不一样index表各状态进行形成不一样索引表:就绪索引表、阻塞索引表第14页7.进程上下文用户级上下文:进程用户地址空间(包含用户栈各层次),包含用户正文段、用户数据段和用户栈;存放器级上下文:程序存放器、处理机状态存放器、栈指针、通用存放器值;系统级上下文:静态部分(PCB和资源表格)动态部分:关键栈(关键过程栈结构,不一样进程在调用相同关键过程时有不一样关键栈)进程上下文是对进程执行活动全过程静态描述。进程上下文由进程用户地址空间内容、硬件存放器内容及与该进程相关关键数据结构组成。第15页关键态和用户态用户态是指进程执行用户应用程序代码时状态。处于用户态进程,不可直接访问受保护OS代码;关键态是指进程经过系统调用来执行操作系统代码时状态。处于关键态进程执行代码是OS代码,能够访问整个进程全部地址空间。第16页4.1.3 进程状态转换4.1.3.1 两状态进程模型4.1.3.2 五状态进程模型4.1.3.3 挂起进程模型第17页4.1.3.1 两状态进程模型第18页1.状态运行状态(Running):占用处理机资源;暂停状态(Not-Running):等候进程调度分配处理机资源;第19页2.转换进程创建(Enter):系统创建进程,形成PCB,分配所需资源,排入暂停进程表(可为一个队列);调度运行(Dispatch):从暂停进程表中选择一个进程(要求已完成I/O操作),进入运行状态;暂停运行(Pause):用完时间片或开启I/O操作后,放弃处理机,进入暂停进程表;进程结束(Exit):进程运行中止;第20页4.1.3.2 五状态进程模型两状态模型无法区分暂停进程表中可运行和阻塞,五状态模型就是对暂停状态细化。五状态进程模型(状态变迁)第21页五状态进程模型(单队列结构)第22页五状态进程模型(多队列结构)第23页1.状态运行状态(Running):占用处理机资源;处于此状态进程数目小于等于CPU数目。在没有其它进程能够执行时(如全部进程都在阻塞状态),通常会自动执行系统空闲进程(相当于空操作)。就绪状态(Ready):进程已取得除处理机外所需资源,等候分配处理机资源;只要分配CPU就可执行。能够按多个优先级来划分队列,如:时间片用完低优,I/O完成中优,页面调入完成高优阻塞状态(Blocked):因为进程等候某种条件(如I/O操作或进程同时),在条件满足之前无法继续执行。该事件发生前即使把处理机分配给该进程,也无法运行。如:等候I/O操作完成。第24页创建状态(New):进程刚创建,但还不能运行(一个可能原因是OS对并发进程数限制);如:分配和建立PCB表项(可能有数目限制)、建立资源表格(如打开文件表)并分配资源,加载程序并建立地址空间表。结束状态(Exit):进程已结束运行,回收除PCB之外其它资源,并让其它进程从PCB中搜集相关信息(如记帐,将退出码exit code传递给父进程)。第25页2.转换创建新进程:创建一个新进程,以运行一个程序。可能原因为:用户登录、OS创建以提供某项服务、批处理作业。收容(Admit,也称为提交):收容一个新进程,进入就绪状态。因为性能、内存、进程总数等原因,系统会限制并发进程总数。调度运行(Dispatch):从就绪进程表中选择一个进程,进入运行状态;释放(Release):因为进程完成或失败而中止进程运行,进入结束状态;运行到结束:分为正常退出Exit和异常退出abort(执行超时或内存不够,非法指令或地址,I/O失败,被其它进程所终止)就绪或阻塞到结束:可能原因有:父进程可在任何时间中止子进程;第26页超时(Timeout):因为用完时间片或高优先进程就绪(被抢先)等造成进程暂停运行;事件等候(Event Wait):进程要求事件未出现而进入阻塞;可能原因包含:申请系统服务或资源、通信、I/O操作等;事件出现(Event Occurs):进程等候事件出现;如:操作完成、申请成功等;注:对于五状态进程模型,一个主要问题是当一个事件出现时怎样检验阻塞进程表中进程状态。当进程多时,对系统性能影响很大。一个可能作法是按等候事件类型,排成多个队列。第27页4.1.3.3 挂起进程模型这个问题出现是因为进程优先级引入,一些低优先级进程可能等候较长时间,从而被对换至外存。这么做目标是:提升处理机效率:就绪进程表为空时,没有可运行进程。经过提交新进程,可提升处理机效率;为运行进程提供足够内存:资源担心时,暂停一些进程,如:CPU繁忙(或实时任务执行),内存担心用于调试:在调试时,挂起被调试进程(从而对其地址空间进行读写)第28页单挂起进程模型第29页双挂起进程模型第30页1.状态就绪状态(Ready):进程在内存且可马上进入运行状态;阻塞状态(Blocked):进程在内存并等候某事件出现;阻塞挂起状态(Blocked,suspend):进程在外存并等候某事件出现;就绪挂起状态(Ready,suspend):进程在外存,但只要进入内存,即可运行;注:这里只列出了意义有改变或新状态。第31页2.转换挂起(Suspend):把一个进程从内存转到外存;可能有以下几个情况:阻塞到阻塞挂起:没有进程处于就绪状态或就绪进程要求更多内存资源时,会进行这种转换,以提交新进程或运行就绪进程;就绪到就绪挂起:当有高优先级阻塞(系统认为会很快就绪)进程和低优先级就绪进程时,系统会选择挂起低优先级就绪进程;运行到就绪挂起:对抢先式分时系统,当有高优先级阻塞挂起进程因事件出现而进入就绪挂起时,系统可能会把运行进程转到就绪挂起状态;第32页激活(Activate):把一个进程从外存转到内存;可能有以下几个情况:就绪挂起到就绪:没有就绪进程或挂起就绪进程优先级高于就绪进程时,会进行这种转换;阻塞挂起到阻塞:当一个进程释放足够内存时,系统会把一个高优先级阻塞挂起(系统认为会很快出现所等候事件)进程;第33页事件出现(Event Occurs):进程等候事件出现;如:操作完成、申请成功等;可能情况有:阻塞到就绪:针对内存进程事件出现;阻塞挂起到就绪挂起:针对外存进程事件出现;收容(Admit):收容一个新进程,进入就绪状态或就绪挂起状态。进入就绪挂起原因是系统希望保持一个大就绪进程表(挂起和非挂起);第34页4.1.4 操作系统代码执行OS和进程关系:OS不作为进程地址空间一部分:传统方法。OS作为进程地址空间一部分:如UNIXOS功效分别在关键和系统服务进程中,只有OS关键作为进程地址空间一部分:如Windows NT通常,OS关键不是一个进程,其执行不被调度。第35页4.2 进程控制4.2.1 进程控制功效4.2.2 进程创建和退出4.2.3 UNIX进程阻塞和唤醒4.2.4 NT线程挂起和激活4.2.5 UNIX进程管理举例4.2.6 Windows NT进程管理举例返回第36页4.2.1 进程控制功效完成进程状态转换。原语(primitive):由若干条指令组成“原子操作(atomic operation)”过程,作为一个整体而不可分割要么全都完成,要么全都不做。许多系统调用就是原语。注意:系统调用并不都是原语。进程A调用read(),因无数据而阻塞,在read()里未返回。然后进程B调用read(),此时read()被重入。系统调用不一定一次执行完并返回该进程,有可能在特定点暂停,而转入到其它进程。第37页4.2.2 进程创建和退出1.创建继承(inherit):子进程能够从父进程中继承用户标识符、环境变量、打开文件、文件系统当前目录、控制终端、已经连接共享存放区、信号处理例程入口表等不被继承:进程标识符,父进程标识符spawn创建并执行一个新进程;新进程与父进程关系可有各种:覆盖(_P_OVERLAY)、并发(_P_NOWAIT or _P_NOWAITO)、父进程阻塞(_P_WAIT)、后台(_P_DETACH)等。第38页2.退出也称为“终止”或主程序返回:调用exit()可终止进程。释放资源:释放内外存空间关闭全部打开文件释放共享内存段和各种锁定lock第39页4.2.3 UNIX进程阻塞和唤醒阻塞:暂停一段时间(sleep);暂停并等候信号(pause);等候子进程暂停或终止(wait);唤醒:发送信号到某个或一组进程(kill)第40页调用wait挂起本进程以等候子进程结束,子进程结束时返回。父进程创建多个子进程且已经有某子进程退出时,父进程中wait函数在第一个子进程结束时返回。其调用格式为pid_t wait(int*stat_loc);;返回值为子进程ID。waitpid()等候指定进程号子进程返回并修改状态;waitid()等候子进程修改状态;调用pause挂起本进程以等候信号,接收到信号后恢复执行。当接收到中止进程信号时,该调用不再返回。其调用格式为int pause(void);;第41页调用sleep将在指定时间seconds内挂起本进程。其调用格式为:unsigned sleep(unsigned seconds);;返回值为实际挂起时间。调用kill可发送信号sig到某个或一组进程pid。其调用格式为:int kill(pid_t pid,int sig);。信号定义在文件/usr/include/asm/signal.h中。命令kill可用于向进程发送信号。如:kill-9 100将发送SIGKILL到ID为100进程;该命令将中止该进程执行。第42页实例:UNIX_wait演示子进程与父进程关系和fork、exec、wait使用;程序main.c功效是进行10次循环,创建2个子进程。循环到第3次时,等候子进程结束。#include#include#include#include pid_t wait(int*stat_loc);void perror(const char*s);#include int errno;int global;第43页main()int local,i;pid_t child;if(child=fork()=-1)/创建失败 printf(Fork Error.n);if(child=0)/子进程 printf(Now it is in child process.n);if(execl(/home/xyong/work/ttt,ttt,NULL)=-1)/加载程序失败 perror(Error in child process);global=local+2;exit();第44页/父进程 printf(Now it is in parent process.n);for(i=0;i10;i+)sleep(2);printf(Parent:%dn,i);if(i=2)if(child=fork()=-1)/创建失败 printf(Fork Error.n);if(child=0)/子进程 printf(Now it is in child process.n);if(execl(/home/xyong/work/ttt,ttt,NULL)=-1)/加载程序失败 perror(Error in child process);global=local+2;exit();第45页if(i=3)pid_t temp;temp=wait(NULL);printf(Child process ID:%dn,temp);global=local+1;exit();第46页程序test.c#include#include pid_t getpid(void);pid_t getppid(void);int global;main()int local;int i;pid_t CurrentProcessID,ParentProcessID;CurrentProcessID=getpid();ParentProcessID=getppid();printf(Now it is in the program TEST.n);for(i=0;i10;i+)sleep(2);printf(Parent:%d,Current:%d,Nunber:%dn,ParentProcessID,CurrentProcessID,i);global=local+1;exit();功效是进行10次循环。第47页结果Parent:7072,Current:7074,Nunber:4Parent:7072,Current:7073,Nunber:8Parent:7072,Current:7074,Nunber:5Parent:7072,Current:7073,Nunber:9Child process ID:7073Parent:7072,Current:7074,Nunber:6Parent:4Parent:7072,Current:7074,Nunber:7Parent:5Parent:7072,Current:7074,Nunber:8Parent:6Parent:7072,Current:7074,Nunber:9Parent:7Parent:8Parent:9Now it is in parent process.Now it is in child process.Now it is in the program TEST.Parent:0Parent:7072,Current:7073,Nunber:0Parent:1Parent:7072,Current:7073,Nunber:1Parent:2Parent:7072,Current:7073,Nunber:2Now it is in child process.Now it is in the program TEST.Parent:7072,Current:7073,Nunber:3Parent:3Parent:7072,Current:7074,Nunber:0Parent:7072,Current:7073,Nunber:4Parent:7072,Current:7074,Nunber:1Parent:7072,Current:7073,Nunber:5Parent:7072,Current:7074,Nunber:2Parent:7072,Current:7073,Nunber:6Parent:7072,Current:7074,Nunber:3Parent:7072,Current:7073,Nunber:7第48页4.2.4 NT线程挂起和激活NT中处理机分配对象为线程,一个线程可被屡次挂起和屡次激活。在线程内有一个挂起计数(suspend count),挂起操作使该计数加1,激活操作便该计数减1;当挂起计数为0时,线程恢复执行。(1)挂起:Windows NT中SuspendThread可挂起指定线程;DWORD SuspendThread(HANDLE hThread /handle to the thread );(2)激活:Windows NT中ResumeThread可恢复指定线程执行;DWORD ResumeThread(HANDLE hThread /identifies thread to restart );第49页例子NT_thread.cpp#include#include#include#include void SubThread(void)int i;for(i=0;i5;i+)cout SubThread i endl;Sleep();第50页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&IDThread);/returns thread identifier /Check the return value for success.if(hThread=NULL)cout CreateThread error endl;第51页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;第52页if(i=3)if(ResumeThread(hThread)=0 xFFFFFFFF)cout Resume thread error.endl;elsecout Resume thread is ok.endl;Sleep(4000);第53页运行结果CreateThreadMainThread0SubThread0SubThread1MainThread1Suspend thread is ok.MainThread2MainThread3Resume thread is ok.SubThread2SubThread3MainThread4SubThread4第54页4.2.5 UNIX进程管理举例进程上下文:指进程用户地址空间内容、存放器内容及与进程相关关键数据结构;包含三部分上下文:用户级、存放器级、系统级用户级上下文:正文段即代码(text);数据段(data);栈段(user stack):用户态执行时过程调用;共享存放区(shared memory)把地址空间段称为区(region):进程区表和系统区表(前者索引指向后者)系统上下文:proc结构:总在内存,内容包含阻塞原因;user结构:能够调出到外存,进程处于执行状态时才用得着,各种资源表格;进程区表:从虚拟地址到物理地址映射;关键栈:关键态执行时过程调用栈结构;1.进程结构第55页2.进程状态转换注意:状态“被抢先”与“内存就绪”地位相同,要等到下一次进程调度时,才能回到“用户态执行”。第56页3.进程控制父子进程fork()返回值不一样,Parent PID值不一样 getppid()fork()创建子进程之后,执行返回父进程,或调度切换到子进程以及其它进程fork创建一个新进程(子进程),子进程是父进程准确复制。在子进程中返回为0;在父进程中,返回子进程标识。子进程是从fork调用返回时在用户态开始运行。父进程返回点与子进程开始点是相同。exec用一个新进程覆盖调用进程。它参数包含新进程对应文件和命令行参数。成功调用时,不再返回;不然,返回犯错原因。创建:fork(),exec()第57页UNIX进程创建第58页退出:exit()向父进程给出一个退出码(8位整数)。父进程终止时怎样影响子进程:子进程从父进程继承了进程组ID和终端组ID(控制终端),所以子进程对发给该进程组或终端组信号敏感。终端关闭时,以该终端为控制终端全部进程都收到SIGHUP信号。子进程终止时,向父进程发送SIGCHLD信号,父进程截获此信号并经过wait3()系统调用来释放子进程PCB。第59页阻塞:暂停一段时间sleep;暂停并等候信号pause;等候子进程暂停或终止wait:能够取得子进程退出码(16位整数:exit退出时exitCode*256,信号终止时coreFlag*128+signalNumber,信号停顿时signalNumber*256+0 x7f)唤醒:发送信号到某个或一组进程kill:使得接收方从阻塞系统调用中返回(如read返回并给出失败值-1),并随即调用对应信号处理例程调试:设置执行断点(breakpoint),读写进程映象中数据(从而修改进程上下文)。系统调用ptrace(),信号SIGTRAP(由调试方发送到被调试方)ptrace允许父进程控制子进程运行,可用于调试。子进程在碰到signal时暂停,父进程可访问core image。第60页4.2.6 Windows NT进程管理举例NT进程和线程作为对象(Object),以句柄(handle)来引用。对应地有控制对象服务(services)。进程对象属性;PID,Access Token,Base Priority,默认处理器集合等1.概述第61页NT进程关系对NT关键而言,进程之间没有任何关系(包含父子关系)。那么,怎样表示UNIX进程之间父子关系(以及其它关系)?由POSIX子系统来建立和维护NT Native API:内查对上API和Win32子系统APIhttp:/ Structures for each process/threadExecutive process block(EPROCESS)Executive thread block(ETHREAD)Win32 process blockProcess environment blockThread environment blockProcess environment blockThread environment blockProcess block(EPROCESS)Thread block(ETHREAD)Win32 process block Handle table.Process address spaceSystem address spaceRef:Windows Internals-P290第64页3.进程控制创建:CreateProcess()函数用于创建新进程及其根本程,以执行指定程序。新进程能够继承:打开文件句柄、各种对象(如进程、线程、信号量、管道等)句柄、环境变量、当前目录、原进程控制终端、原进程进程组(用于发送Ctrl+C或Ctrl+Break信号给多个进程)每个句柄在创建或打开时能指定是否可继承;新进程不能继承:优先权类、内存句柄、DLL模块句柄CREATE_NEW_CONSOLE表示新进程有一个新控制台CREATE_NEW_PROCESS_GROUP表示新进程是一个新进程组根。第65页退出:ExitProcess()或TerminateProcess(),进程包含线程全部终止;ExitProcess()终止一个进程和它全部线程;它终止操作是完整,包含关闭全部对象句柄、它全部线程等;TerminateProcess()终止指定进程和它全部线程;它终止操作是不完整(如:不向相关DLL通报关闭情况),通常只用于异常情况下对进程终止。第66页4.调试进程对象属性包含:调试时用于通知另一进程(调试器)IPC channel调试器在CreateProcess时指定DEBUG_PROCESS标志或利用DebugActiveProcess()函数,可在调用者(debugger)与被调用者(target)间建立调试关系,target会向debugger通报全部调试事件;被调试进程向调试器进程发送调试事件,包含:创建新进程、新线程、加载DLL、执行断点等。调试器经过WaitForDebugEvent()和ContinueDebugEvent()组成事件循环。WaitForDebugEvent()可在指定时间内等候可能调试事件;ContinueDebugEvent()可使被调试事件暂停进程继续运行。经过ReadProcessMemory()和WriteProcessMemory()来读写被调试进程存放空间。第67页4.3 线程(THREAD)4.3.1 线程引入4.3.2 进程和线程比较4.3.3 线程举例返回引入线程目标是简化同一进程内各线程间通信,以小开销来提升进程内并发程度。第68页4.3.1 线程引入进程:资源分配单位(存放器、文件)和CPU调度(分配)单位。又称为任务(task)线程:进程中描述指令并发执行过程动态对象,是CPU调度单位。只拥有必不可少资源,如:线程状态、存放器上下文和栈一样含有就绪、阻塞和执行三种基本状态一个进程中最少有一个线程,每个线程对应于一个当前指令指针;线程优点:减小并发执行时间和空间开销(线程创建、退出和调度),所以允许在系统中建立更多线程来提升并发程度。线程创建时间比进程短;线程终止时间比进程短;同进程内线程切换时间比进程短;因为同进程内线程间共享内存和文件资源,可直接进行不经过内核通信;第69页进程与线程关系第70页OS对线程实现方式内核维护进程和线程上下文信息;线程切换由内核完成;一个线程发起系统调用而阻塞,不会影响其它线程运行。时间片分配给线程,所以多线程进程取得更多CPU时间。依赖于OS关键,由内核内部需求进行创建和撤消,用来执行一个指定函数。Windows NT和OS/2支持内核线程;内核线程(kernel-level thread)第71页用户线程(user-level thread)用户线程维护由应用进程完成;内核不了解用户线程存在;用户线程切换不需要内核特权;用户线程调度算法可针对应用优化;不依赖于OS关键,应用进程利用线程库提供创建、同时、调度和管理线程函数来控制用户线程。如:数据库系统informix,图形处理Aldus PageMaker。调度由应用软件内部进行,通常采取非抢先式和更简单规则,也无需用户态/关键态切换,所以速度尤其快。一个线程发起系统调用而阻塞,则整个进程在等候。时间片分配给进程,多线程则每个线程就慢。第72页轻权进程(LightWeight Process)它是内核支持用户线程。一个进程可有一个或多个轻权进程,每个轻权进程由一个单独内核线程来支持。第73页4.3.2 进程和线程比较地址空间和其它资源(如打开文件):进程间相互独立,同一进程各线程间共享某进程内线程在其它进程不可见通信:进程间通信IPC,线程间能够直接读写进程数据段(如全局变量)来进行通信需要进程同时和互斥伎俩辅助,以确保数据一致性调度:线程上下文切换比进程上下文切换要快得多;第74页线程切换和进程切换第75页4.3.3 线程举例1.SUN Solaris 10Solaris支持内核线程(Kernel threads)、轻权进程(Lightweight Processes)和用户线程(User Level Threads)。一个进程可有大量用户线程;用户线程与轻权进程一一对应,不一样轻权进程分别对应不一样内核线程。第76页Solaris Process ModelSolaris Kernel is Multi-threaded Kernel level threads(kthreads)are the unit of concurrency within the kernelScheduling,synchronization are kernel-level(kthread)concepts Processes are a combination of state and one or more user threadsProcess threads are abstracted upon kernel threadsSingle threaded processes have just one thread第77页The Process ModelProcessesAll processes begin life as a program,a disk file(ELF object)All processes have“state”or context that defines their execution environment-hardware&software context Hardware contextThe processor state,which is CPU architecture dependent.In general,the state of the hardware registers(general registers,privileged registers)Maintained in the LWP Software context Address space,credentials,open files,resource limits,etc stuff shared by all the threads in a process第78页Conceptual View of a Process第79页Proc structuredefine the context and execution environmentuarea is embedded in the process structureit is not maintained as a separate structure.process kernel Stack in the LWP第80页Process Execution EnvironmentMapped memory pages for processs various address space segmentsIdentifiers第81页Process State DiagramFor the most part,for each process state,there is a corresponding kthread stateSomewhat misleading-kthreads change state,not processesLink:Solaris Kernel Thread State第82页Process and Kernel Thread StatesKthread creation is not flagged as a distinct state-they go right to TS_RUNKthread structures are flagged as TS_FREE when the proc or kthread/LWP is terminatedThis allows the kernel to maintain a cache of free kthread/LWP structures第83页Process,LWP,and Kthread