收藏 分享(赏)

清华大学操作系统课件_向勇老师的讲义.ppt

上传人:精品资料 文档编号:10426074 上传时间:2019-11-10 格式:PPT 页数:97 大小:1.41MB
下载 相关 举报
清华大学操作系统课件_向勇老师的讲义.ppt_第1页
第1页 / 共97页
清华大学操作系统课件_向勇老师的讲义.ppt_第2页
第2页 / 共97页
清华大学操作系统课件_向勇老师的讲义.ppt_第3页
第3页 / 共97页
清华大学操作系统课件_向勇老师的讲义.ppt_第4页
第4页 / 共97页
清华大学操作系统课件_向勇老师的讲义.ppt_第5页
第5页 / 共97页
点击查看更多>>
资源描述

1、第四章 进程管理,4.1 进程(PROCESS) 4.2 进程控制 4.3 线程(THREAD) 4.4 进程互斥和同步 4.5 进程间通信(IPC, INTER-PROCESS COMMUNICATION) 4.6 死锁问题(DEADLOCK) 4.7 进程其他方面的举例,为了描述程序在并发执行时对系统资源的共享,我们需要一个描述程序执行时动态特征的概念,这就是进程。在本章中,我们将讨论进程概念、进程控制和进程间关系。,4.1 进程(PROCESS),4.1.1 程序的顺序执行和并发执行 4.1.2 进程的定义和描述 4.1.3 进程的状态转换 4.1.4 操作系统代码的执行,返回,4.1.

2、1 程序的顺序执行和并发执行,程序的执行有两种方式:顺序执行和并发执行。 顺序执行是单道批处理系统的执行方式,也用于简单的单片机系统; 现在的操作系统多为并发执行,具有许多新的特征。引入并发执行的目的是为了提高资源利用率并适应多任务处理的要求。,顺序执行的特征 顺序性:按照程序结构所指定的次序(可能有分支或循环) 封闭性:独占全部资源,计算机的状态只由于该程序的控制逻辑所决定 可再现性:初始条件相同则结果相同。如:可通过空指令控制时间关系。 并发执行的特征 间断(异步)性:“走走停停“,一个程序可能走到中途停下来,失去原有的时序关系; 失去封闭性:共享资源,受其他程序的控制逻辑的影响。如:一个

3、程序写到存储器中的数据可能被另一个程序修改,失去原有的不变特征。 失去可再现性:失去封闭性 失去可再现性;外界环境在程序的两次执行期间发生变化,失去原有的可重复特征。,并发执行的条件:达到封闭性和可再现性,程序 P(i) 针对共享变量的读集和写集 R(i)和W(i) 条件:任意两个程序P(i)和P(j),有: R(i)W(j)=; W(i)R(j)=; W(i)W(j)=;,并发执行失去封闭性的原因是共享资源的影响,去掉这种影响就行了。1966年,由Bernstein给出并发执行的条件。(这里没有考虑执行速度的影响。),前两条保证一个程序的两次读之间数据不变化;最后一条保证写的结果不丢掉。,现

4、在的问题是这个条件不好检查。,4.1.2 进程的定义和描述,它对应虚拟处理机、虚拟存储器和虚拟外设等资源的分配和回收; 引入多进程,提高了对硬件资源的利用率,但又带来额外的空间和时间开销,增加了OS 的复杂性;,1. 进程的定义,一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。,进程与程序的关系类比,这时小儿子哭着跑进来,说手被蜜蜂蛰了。教授只好把蛋糕先放在一边。他在食谱上做了个标记,把状态信息记录了起来。然后又去找了一本医疗手册,查到了相关的内容,按照上面的指令一步步地执行。当伤口处理完之后,又回到厨房继续做蛋糕。,有一个计算机科学家,想亲手给女儿做一个生日蛋糕。所以他就找了一

5、本有关做蛋糕的食谱,买了一些原料,面粉、鸡蛋、糖、香料等,然后边看边学边做。,食谱 程序;科学家 CPU; 原料 数据;做蛋糕 = 进程;,CPU从一个进程(做蛋糕)切换到另一个进程(医疗救护)。,2. 进程的特征,动态性:进程具有动态的地址空间(数量和内容),地址空间上包括: 代码(指令执行和CPU状态的改变) 数据(变量的生成和赋值) 系统控制信息(进程控制块的生成和删除) 独立性:各进程的地址空间相互独立,除非采用进程间通信手段; 并发性、异步性:“虚拟“ 结构化:代码段、数据段和核心段(在地址空间中);程序文件中通常也划分了代码段和数据段,而核心段通常就是OS核心(由各个进程共享,包括

6、各进程的PCB),四个进程在并发地运行,3. 进程与程序的区别,进程是动态的,程序是静态的:程序是有序代码的集合;进程是程序的执行。通常进程不可在计算机之间迁移;而程序通常对应着文件、静态和可以复制。 进程是暂时的,程序的永久的:进程是一个状态变化的过程,程序可长久保存。 进程与程序的组成不同:进程的组成包括程序、数据和进程控制块(即进程状态信息)。 进程与程序的对应关系:通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序。,4. 处理机调度器(dispatcher),把处理机从一个进程切换到另一个进程; 防止某进程独占处理机;,处理机调度器是操作系统中的一段代码,它完

7、成如下功能:,5. 进程控制块 (PCB, process control block),每个进程在OS中的登记表项(可能有总数目限制),OS据此对进程进行控制和管理(PCB中的内容会动态改变),不同OS则不同 处于核心段,通常不能由应用程序自身的代码来直接访问,而要通过系统调用,或通过UNIX中的进程文件系统(/proc)直接访问进程映象(image)。文件或目录名为进程标识(如:00316),权限为创建者可读写。,进程控制块是由OS维护的用来记录进程相关信息的一块内存。,进程控制块的内容,进程描述信息: 进程标识符(process ID),唯一,通常是一个整数; 进程名,通常基于可执行文件

8、名(不唯一); 用户标识符(user ID);进程组关系(process group) 进程控制信息: 当前状态; 优先级(priority); 代码执行入口地址; 程序的外存地址; 运行统计信息(执行时间、页面调度); 进程间同步和通信;阻塞原因 资源占用信息:虚拟地址空间的现状、打开文件列表 CPU现场保护结构:寄存器值(通用、程序计数器PC、状态PSW,地址包括栈指针),6. PCB的组织方式,链表:同一状态的进程其PCB成一链表,多个状态对应多个不同的链表 各状态的进程形成不同的链表:就绪链表、阻塞链表 索引表:同一状态的进程归入一个index表(由index指向PCB),多个状态对应

9、多个不同的index表 各状态的进行形成不同的索引表:就绪索引表、阻塞索引表,7. 进程上下文,用户级上下文:进程的用户地址空间(包括用户栈各层次),包括用户正文段、用户数据段和用户栈; 寄存器级上下文:程序寄存器、处理机状态寄存器、栈指针、通用寄存器的值; 系统级上下文: 静态部分(PCB和资源表格) 动态部分:核心栈(核心过程的栈结构,不同进程在调用相同核心过程时有不同核心栈),进程上下文是对进程执行活动全过程的静态描述。进程上下文由进程的用户地址空间内容、硬件寄存器内容及与该进程相关的核心数据结构组成。,核心态和用户态,用户态是指进程执行用户应用程序代码时的状态。处于用户态的进程,不可直

10、接访问受保护的OS代码; 核心态是指进程通过系统调用来执行操作系统代码时的状态。处于核心态的进程执行的代码是OS代码,可以访问整个进程的全部地址空间。,4.1.3 进程的状态转换,4.1.3.1 两状态进程模型 4.1.3.2 五状态进程模型 4.1.3.3 挂起进程模型,4.1.3.1 两状态进程模型,1. 状态,运行状态(Running):占用处理机资源; 暂停状态(Not-Running):等待进程调度分配处理机资源;,2. 转换,进程创建(Enter):系统创建进程,形成PCB,分配所需资源,排入暂停进程表(可为一个队列); 调度运行(Dispatch):从暂停进程表中选择一个进程(要

11、求已完成I/O操作),进入运行状态; 暂停运行(Pause):用完时间片或启动I/O操作后,放弃处理机,进入暂停进程表; 进程结束(Exit):进程运行中止;,4.1.3.2 五状态进程模型,两状态模型无法区分暂停进程表中的可运行和阻塞,五状态模型就是对暂停状态的细化。,五状态进程模型(状态变迁),五状态进程模型(单队列结构),五状态进程模型(多队列结构),1. 状态,运行状态(Running):占用处理机资源;处于此状态的进程的数目小于等于CPU的数目。 在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程(相当于空操作)。 就绪状态(Ready):进程已获得除处

12、理机外的所需资源,等待分配处理机资源;只要分配CPU就可执行。 可以按多个优先级来划分队列,如:时间片用完低优,I/O完成中优,页面调入完成高优 阻塞状态(Blocked):由于进程等待某种条件(如I/O操作或进程同步),在条件满足之前无法继续执行。该事件发生前即使把处理机分配给该进程,也无法运行。如:等待I/O操作的完成。,创建状态(New):进程刚创建,但还不能运行(一种可能的原因是OS对并发进程数的限制);如:分配和建立PCB表项(可能有数目限制)、建立资源表格(如打开文件表)并分配资源,加载程序并建立地址空间表。 结束状态(Exit):进程已结束运行,回收除PCB之外的其他资源,并让其

13、他进程从PCB中收集有关信息(如记帐,将退出码exit code传递给父进程)。,2. 转换,创建新进程:创建一个新进程,以运行一个程序。可能的原因为:用户登录、OS创建以提供某项服务、批处理作业。 收容(Admit, 也称为提交):收容一个新进程,进入就绪状态。由于性能、内存、进程总数等原因,系统会限制并发进程总数。 调度运行(Dispatch):从就绪进程表中选择一个进程,进入运行状态; 释放(Release):由于进程完成或失败而中止进程运行,进入结束状态; 运行到结束:分为正常退出Exit和异常退出abort(执行超时或内存不够,非法指令或地址,I/O失败,被其他进程所终止) 就绪或阻

14、塞到结束:可能的原因有:父进程可在任何时间中止子进程;,超时(Timeout):由于用完时间片或高优先进程就绪(被抢先)等导致进程暂停运行; 事件等待(Event Wait):进程要求的事件未出现而进入阻塞;可能的原因包括:申请系统服务或资源、通信、I/O操作等; 事件出现(Event Occurs):进程等待的事件出现;如:操作完成、申请成功等;,注:对于五状态进程模型,一个重要的问题是当一个事件出现时如何检查阻塞进程表中的进程状态。当进程多时,对系统性能影响很大。一种可能的作法是按等待事件类型,排成多个队列。,4.1.3.3 挂起进程模型,这个问题的出现是由于进程优先级的引入,一些低优先级

15、进程可能等待较长时间,从而被对换至外存。这样做的目的是: 提高处理机效率:就绪进程表为空时,没有可运行的进程。通过提交新进程,可提高处理机效率; 为运行进程提供足够内存:资源紧张时,暂停某些进程,如:CPU繁忙(或实时任务执行),内存紧张 用于调试:在调试时,挂起被调试进程(从而对其地址空间进行读写),单挂起进程模型,双挂起进程模型,1. 状态,就绪状态(Ready):进程在内存且可立即进入运行状态; 阻塞状态(Blocked):进程在内存并等待某事件的出现; 阻塞挂起状态(Blocked, suspend):进程在外存并等待某事件的出现; 就绪挂起状态(Ready, suspend):进程在

16、外存,但只要进入内存,即可运行;,注:这里只列出了意义有变化或新的状态。,2. 转换,挂起(Suspend):把一个进程从内存转到外存;可能有以下几种情况: 阻塞到阻塞挂起:没有进程处于就绪状态或就绪进程要求更多内存资源时,会进行这种转换,以提交新进程或运行就绪进程; 就绪到就绪挂起:当有高优先级阻塞(系统认为会很快就绪的)进程和低优先级就绪进程时,系统会选择挂起低优先级就绪进程; 运行到就绪挂起:对抢先式分时系统,当有高优先级阻塞挂起进程因事件出现而进入就绪挂起时,系统可能会把运行进程转到就绪挂起状态;,激活(Activate):把一个进程从外存转到内存;可能有以下几种情况: 就绪挂起到就绪

17、:没有就绪进程或挂起就绪进程优先级高于就绪进程时,会进行这种转换; 阻塞挂起到阻塞:当一个进程释放足够内存时,系统会把一个高优先级阻塞挂起(系统认为会很快出现所等待的事件)进程;,事件出现(Event Occurs):进程等待的事件出现;如:操作完成、申请成功等;可能的情况有: 阻塞到就绪:针对内存进程的事件出现; 阻塞挂起到就绪挂起:针对外存进程的事件出现; 收容(Admit):收容一个新进程,进入就绪状态或就绪挂起状态。进入就绪挂起的原因是系统希望保持一个大的就绪进程表(挂起和非挂起);,4.1.4 操作系统代码的执行,OS和进程的关系: OS不作为进程地址空间的一部分:传统方法。 OS作

18、为进程地址空间的一部分:如UNIX OS功能分别在核心和系统服务进程中,只有OS核心作为进程地址空间的一部分:如Windows NT,通常,OS核心不是一个进程,其执行不被调度。,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进程管理举例,返回,4.2.1 进程控制的功能,完成进程状态的转换。,原语(primitive):由若干条指令构成的“原子操作(atomic operation)”过程,作为一个整体而不可分割要么全都完成,

19、要么全都不做。许多系统调用就是原语。,注意:系统调用并不都是原语。进程A调用read(),因无数据而阻塞,在read()里未返回。然后进程B调用read(),此时read()被重入。系统调用不一定一次执行完并返回该进程,有可能在特定的点暂停,而转入到其他进程。,4.2.2 进程的创建和退出,1. 创建,继承(inherit):子进程可以从父进程中继承用户标识符、环境变量、打开文件、文件系统的当前目录、控制终端、已经连接的共享存储区、信号处理例程入口表等 不被继承:进程标识符,父进程标识符 spawn创建并执行一个新进程;新进程与父进程的关系可有多种:覆盖(_P_OVERLAY)、并发(_P_N

20、OWAIT or _P_NOWAITO)、父进程阻塞(_P_WAIT)、后台(_P_DETACH)等。,2. 退出,也称为“终止”或主程序返回:调用exit()可终止进程。 释放资源: 释放内外存空间 关闭所有打开文件 释放共享内存段和各种锁定lock,4.2.3 UNIX进程的阻塞和唤醒,阻塞: 暂停一段时间(sleep); 暂停并等待信号(pause); 等待子进程暂停或终止(wait); 唤醒:发送信号到某个或一组进程(kill),调用wait挂起本进程以等待子进程的结束,子进程结束时返回。父进程创建多个子进程且已有某子进程退出时,父进程中wait函数在第一个子进程结束时返回。 其调用格

21、式为“pid_t wait(int *stat_loc);“;返回值为子进程ID。 waitpid()等待指定进程号的子进程的返回并修改状态; waitid()等待子进程修改状态; 调用pause挂起本进程以等待信号,接收到信号后恢复执行。当接收到中止进程信号时,该调用不再返回。 其调用格式为“int pause(void);“;,调用sleep将在指定的时间seconds内挂起本进程。其调用格式为:“unsigned sleep(unsigned seconds);“;返回值为实际的挂起时间。 调用kill可发送信号sig到某个或一组进程pid。其调用格式为:“int kill(pid_t

22、pid, int sig);“。 信号的定义在文件“/usr/include/asm/signal.h“中。命令“kill“可用于向进程发送信号。如:“kill -9 100“将发送SIGKILL到ID为100的进程;该命令将中止该进程的执行。,实例:UNIX_wait,演示子进程与父进程的关系和fork、exec、wait的使用;,程序main.c,功能是进行10次循环,创建2个子进程。循环到第3次时,等待子进程结束。,#include #include #include #include pid_t wait(int *stat_loc); void perror(const char *

23、s); #include int errno; int global;,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();,/ 父进程p

24、rintf(“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“);g

25、lobal=local + 2;exit();,if (i=3)pid_t temp;temp=wait(NULL);printf(“Child process ID: %dn“, temp);global=local + 1;exit(); ,程序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();ParentPr

26、ocessID=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次循环。,结果,Parent: 7072, Current: 7074, Nunber:4 Parent: 7072, Current: 7073, Nunber:8 Parent: 7072,

27、Current: 7074, Nunber:5 Parent: 7072, Current: 7073, Nunber:9 Child process ID: 7073 Parent: 7072, Current: 7074, Nunber:6 Parent:4 Parent: 7072, Current: 7074, Nunber:7 Parent:5 Parent: 7072, Current: 7074, Nunber:8 Parent:6 Parent: 7072, Current: 7074, Nunber:9 Parent:7 Parent:8 Parent:9,Now it is

28、 in parent process. Now it is in child process. Now it is in the program TEST. Parent:0 Parent: 7072, Current: 7073, Nunber:0 Parent:1 Parent: 7072, Current: 7073, Nunber:1 Parent:2 Parent: 7072, Current: 7073, Nunber:2 Now it is in child process. Now it is in the program TEST. Parent: 7072, Current

29、: 7073, Nunber:3 Parent:3 Parent: 7072, Current: 7074, Nunber:0 Parent: 7072, Current: 7073, Nunber:4 Parent: 7072, Current: 7074, Nunber:1 Parent: 7072, Current: 7073, Nunber:5 Parent: 7072, Current: 7074, Nunber:2 Parent: 7072, Current: 7073, Nunber:6 Parent: 7072, Current: 7074, Nunber:3 Parent:

30、7072, Current: 7073, Nunber:7,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 Resum

31、eThread( HANDLE hThread / identifies thread to restart );,例子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 = CreateThre

32、ad(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)=0xFFFFFFFF)cout “Suspend thread er

33、ror.“ endl;elsecout “Suspend thread is ok.“ endl;,if (i=3)if (ResumeThread(hThread)=0xFFFFFFFF)cout “Resume thread error.“ endl;elsecout “Resume thread is ok.“ endl;Sleep(4000); ,运行结果,CreateThread MainThread0 SubThread0 SubThread1 MainThread1 Suspend thread is ok. MainThread2 MainThread3 Resume thre

34、ad is ok. SubThread2 SubThread3 MainThread4 SubThread4,4.2.5 UNIX进程管理举例,进程上下文:指进程的用户地址空间内容、寄存器内容及与进程相关的核心数据结构;包括三部分“上下文“:用户级、寄存器级、系统级 用户级上下文:正文段即代码(text);数据段(data);栈段(user stack):用户态执行时的过程调用;共享存储区(shared memory) 把地址空间的段称为“区(region)“:进程区表和系统区表(前者索引指向后者) 系统上下文: proc结构:总在内存,内容包括阻塞原因; user结构:可以调出到外存,进程处

35、于执行状态时才用得着,各种资源表格; 进程区表:从虚拟地址到物理地址的映射; 核心栈:核心态执行时的过程调用的栈结构;,1. 进程结构,2. 进程状态转换,注意:状态“被抢先”与“内存就绪”的地位相同,要等到下一次进程调度时,才能回到“用户态执行”。,3. 进程控制,父子进程的fork()返回值不同,Parent PID的值不同 getppid() fork()创建子进程之后,执行返回父进程,或调度切换到子进程以及其他进程 fork创建一个新进程(子进程),子进程是父进程的精确复制。在子进程中返回为0;在父进程中,返回子进程的标识。子进程是从fork调用返回时在用户态开始运行的。父进程的返回点

36、与子进程的开始点是相同的。 exec用一个新进程覆盖调用进程。它的参数包括新进程对应的文件和命令行参数。成功调用时,不再返回;否则,返回出错原因。,创建:fork(), exec(),UNIX进程创建,退出:exit()向父进程给出一个退出码(8位的整数)。父进程终止时如何影响子进程: 子进程从父进程继承了进程组ID和终端组ID(控制终端),因此子进程对发给该进程组或终端组的信号敏感。终端关闭时,以该终端为控制终端的所有进程都收到SIGHUP信号。 子进程终止时,向父进程发送SIGCHLD信号,父进程截获此信号并通过wait3()系统调用来释放子进程PCB。,阻塞:暂停一段时间sleep;暂停

37、并等待信号pause;等待子进程暂停或终止wait:可以取得子进程的退出码(16位整数:exit退出时exitCode*256,信号终止时coreFlag*128 + signalNumber,信号停止时signalNumber*256 + 0x7f) 唤醒:发送信号到某个或一组进程kill:使得接收方从阻塞的系统调用中返回(如read返回并给出失败值 -1),并随即调用相应的信号处理例程 调试:设置执行断点(breakpoint),读写进程映象中的数据(从而修改进程的上下文)。系统调用ptrace(),信号SIGTRAP(由调试方发送到被调试方)ptrace允许父进程控制子进程的运行,可用于

38、调试。子进程在遇到signal时暂停,父进程可访问core image。,4.2.6 Windows NT进程管理举例,NT的进程和线程作为对象(Object),以句柄(handle)来引用。相应地有控制对象的服务(services)。 进程对象的属性;PID, Access Token, Base Priority, 默认处理器集合等,1. 概述,NT的进程关系,对NT核心而言,进程之间没有任何关系(包括父子关系)。那么,如何表达UNIX进程之间的父子关系(以及其他关系)?由POSIX子系统来建立和维护,NT Native API:内核对上的API和Win32子系统的API http:/ N

39、T进程结构,Data Structures for each process/thread,Executive process block (EPROCESS) Executive thread block (ETHREAD) Win32 process block Process environment block Thread environment block,Ref: Windows Internals - P290,3. 进程控制,创建:CreateProcess()函数用于创建新进程及其主线程,以执行指定的程序。 新进程可以继承:打开文件的句柄、各种对象(如进程、线程、信号量、管道

40、等)的句柄、环境变量、当前目录、原进程的控制终端、原进程的进程组(用于发送Ctrl+C或Ctrl+Break信号给多个进程)每个句柄在创建或打开时能指定是否可继承; 新进程不能继承:优先权类、内存句柄、DLL模块句柄 CREATE_NEW_CONSOLE表示新进程有一个新的控制台 CREATE_NEW_PROCESS_GROUP表示新进程是一个新的进程组的根。,退出:ExitProcess()或TerminateProcess(), 进程包含的线程全部终止; ExitProcess()终止一个进程和它的所有线程;它的终止操作是完整的,包括关闭所有对象句柄、它的所有线程等; TerminateP

41、rocess()终止指定的进程和它的所有线程;它的终止操作是不完整的(如:不向相关DLL通报关闭情况),通常只用于异常情况下对进程的终止。,4. 调试,进程对象的属性包括:调试时用于通知另一进程(调试器)的IPC channel 调试器在CreateProcess时指定DEBUG_PROCESS标志或利用DebugActiveProcess()函数,可在调用者(debugger)与被调用者(target)间建立调试关系,target会向debugger通报所有调试事件; 被调试进程向调试器进程发送调试事件,包括:创建新进程、新线程、加载DLL、执行断点等。调试器通过WaitForDebugEv

42、ent()和ContinueDebugEvent()构成事件循环。WaitForDebugEvent()可在指定的时间内等待可能的调试事件;ContinueDebugEvent()可使被调试事件暂停的进程继续运行。 通过ReadProcessMemory()和WriteProcessMemory()来读写被调试进程的存储空间。,4.3 线程(THREAD),4.3.1 线程的引入 4.3.2 进程和线程的比较 4.3.3 线程举例,返回,引入线程的目的是简化同一进程内各线程间的通信,以小的开销来提高进程内的并发程度。,4.3.1 线程的引入,进程:资源分配单位(存储器、文件)和CPU调度(分派

43、)单位。又称为“任务(task)“ 线程:进程中描述指令并发执行过程的动态对象,是CPU调度单位。 只拥有必不可少的资源,如:线程状态、寄存器上下文和栈 同样具有就绪、阻塞和执行三种基本状态 一个进程中至少有一个线程,每个线程对应于一个当前指令指针; 线程的优点:减小并发执行的时间和空间开销(线程的创建、退出和调度),因此容许在系统中建立更多的线程来提高并发程度。 线程的创建时间比进程短; 线程的终止时间比进程短; 同进程内的线程切换时间比进程短; 由于同进程内线程间共享内存和文件资源,可直接进行不通过内核的通信;,进程与线程的关系,OS对线程的实现方式,内核维护进程和线程的上下文信息; 线程

44、切换由内核完成; 一个线程发起系统调用而阻塞,不会影响其他线程的运行。 时间片分配给线程,所以多线程的进程获得更多CPU时间。,依赖于OS核心,由内核的内部需求进行创建和撤销,用来执行一个指定的函数。Windows NT和OS/2支持内核线程;,内核线程(kernel-level thread),用户线程(user-level thread),用户线程的维护由应用进程完成; 内核不了解用户线程的存在; 用户线程切换不需要内核特权; 用户线程调度算法可针对应用优化;,不依赖于OS核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。如:数据库系统informix,图形处理A

45、ldus PageMaker。调度由应用软件内部进行,通常采用非抢先式和更简单的规则,也无需用户态/核心态切换,所以速度特别快。一个线程发起系统调用而阻塞,则整个进程在等待。时间片分配给进程,多线程则每个线程就慢。,轻权进程(LightWeight Process),它是内核支持的用户线程。一个进程可有一个或多个轻权进程,每个轻权进程由一个单独的内核线程来支持。,4.3.2 进程和线程的比较,地址空间和其他资源(如打开文件):进程间相互独立,同一进程的各线程间共享 某进程内的线程在其他进程不可见 通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信 需要进程同步和互斥手

46、段的辅助,以保证数据的一致性 调度:线程上下文切换比进程上下文切换要快得多;,线程切换和进程切换,4.3.3 线程举例,1. SUN Solaris 10,Solaris支持内核线程(Kernel threads)、轻权进程(Lightweight Processes)和用户线程(User Level Threads)。一个进程可有大量用户线程;用户线程与轻权进程一一对应,不同的轻权进程分别对应不同的内核线程。,Solaris Process Model,Solaris Kernel is Multi-threadedKernel level threads (kthreads) are th

47、e unit of concurrency within the kernel Scheduling, synchronization are kernel-level (kthread) conceptsProcesses are a combination of state and one or more user threads Process threads are abstracted upon kernel threads Single threaded processes have just one thread,The Process Model,Processes All p

48、rocesses begin life as a program, a disk file (ELF object) All processes have “state” or context that defines their execution environment - hardware & software contextHardware context The processor state, which is CPU architecture dependent. In general, the state of the hardware registers (general r

49、egisters, privileged registers) Maintained in the LWPSoftware contextAddress space, credentials, open files, resource limits, etc stuff shared by all the threads in a process,Conceptual View of a Process,Proc structure define the context and execution environment uarea is embedded in the process structureit is not maintained as a separate structure. process kernel Stack in the LWP,Process Execution Environment,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报