1、第二章第二章 进程的描述与控制进程的描述与控制 2.1 2.1 前趋图和程序执行(理解)前趋图和程序执行(理解)2.2 2.2 进程的描述(重点)进程的描述(重点) 2.3 2.3 进程控制(重点)进程控制(重点)2.4 2.4 进程同步(重点、难点)进程同步(重点、难点)2.5 2.5 经典进程的同步问题经典进程的同步问题 (重点、难点)(重点、难点)2.6 2.6 进程通信进程通信 (编程掌握)(编程掌握)2.7 2.7 线程(编程掌握)线程(编程掌握)应用的提出:同时进行多个任务的需求举例编辑文档运行程序网上浏览CD音乐欣赏问题:单处理机如何同时执行多个任务?进程的引入进程的引入右图给出
2、了右图给出了7个结点的前驱图。个结点的前驱图。在该图中,存在下面一些前驱在该图中,存在下面一些前驱关系:关系: P1 P2,P1 P3,P4 P6 ,P6 P7 ,或表,或表示为:示为:P P1,P2,P3,P4,P5,P6,P7 P(P1,P2),,P1,P3), ,( P5,P7),(P6,P7)1234756具有具有7个结点的个结点的前驱图前驱图1 前趋图前趋图 提示提示:前趋图中前趋图中 不存在循环不存在循环图中的每个结点图中的每个结点可用于描述一个可用于描述一个程序段或进程程序段或进程不存在前驱关系的程序之间才能并发执行不存在前驱关系的程序之间才能并发执行2.1前趋图和程序执行前趋图
3、和程序执行2 程序的顺序执行及其特征程序的顺序执行及其特征 a. 程序的顺序执行程序的顺序执行 程序是指令(或语句)的集合,指令之间是顺序关系程序是指令(或语句)的集合,指令之间是顺序关系,是一个静态的概念是一个静态的概念,仅当前一操作仅当前一操作(程序段程序段)执行完后,才能执执行完后,才能执行后继操作。行后继操作。 假定用假定用 I、 C和和 P分别表示输入、计算和输出操作(也分别表示输入、计算和输出操作(也可以为语句),可以有下图的顺序关系。可以为语句),可以有下图的顺序关系。 I1C1P1I2C2P2S1S3S2a=10;b=a+8;Print(b);S1:S2:S3:再如例再如例1:
4、t输入:输入:计算:计算:输出:输出:I1C1P1I2C2P2I3C3P3 t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 t10三个程序顺序执行三个程序顺序执行t程序1:I1C1P1程序2:程序3:I2C2P2I3C3P39个个t b.程序顺序执行具有如下程序顺序执行具有如下 3 个特点个特点: n 顺序性;顺序性;处理机的操作严格按照程序所规定的顺序执行。处理机的操作严格按照程序所规定的顺序执行。 n 封闭性;程序独占全机资源封闭性;程序独占全机资源,程序执行结果程序执行结果不受外界因素不受外界因素的影响的影响。 n 可再现性;可再现性;只要输入的初始条件相同,则无论何时重复执
5、只要输入的初始条件相同,则无论何时重复执行该程序都会得到相同的结果。行该程序都会得到相同的结果。 程序顺序执行的特性为程序员检测程序顺序执行的特性为程序员检测和校正程序错误带来很大的方便!和校正程序错误带来很大的方便!3 程序的并发执行及其特征程序的并发执行及其特征 a. 程序的并发执行程序的并发执行 对于对于例例1中的任意程序,存在着中的任意程序,存在着 IiCiPi 这样这样的前驱关系,因而对的前驱关系,因而对一个用户程序一个用户程序的输入、计算和的输入、计算和打印这三个操作,必须顺序执行。打印这三个操作,必须顺序执行。 但在但在多道环境下多道环境下,并不存在,或,并不存在,或并不要求并不
6、要求PiIi+1 关系,即关系,即Ii 、 Cj 和和 Pk(ijk)之间并不存在前驱关)之间并不存在前驱关系系,因而在对一批程序处理时,可使它们,因而在对一批程序处理时,可使它们并发执行并发执行。这就产生了并发操作这就产生了并发操作。 输入:计算:输出: t0 t1 t2 t3 t4 t5 t6tttI1三个程序并发执行的前驱图三个程序并发执行的前驱图I2I3C1C2C3P1P2P3时间:5个t并发并发并发并发并发并发前驱关系执行顺序n 程序内保持程序内保持 IiCiPi 程序程序逻辑顺序性。逻辑顺序性。 n 存在存在IiIi+1;CiCi+1; PiPi+1; 表明表明系统资源竞争系统资源
7、竞争带来带来顺序性前顺序性前驱关系驱关系。 n 不同程序之间不同程序之间 Ii+2、Ci+1 和和Pi ,没有前驱关系,没有前驱关系,说明可以说明可以并发执行并发执行,这是这是系统的并发性系统的并发性,提高提高 (9-5)/9x100% = 44%。 I1I2I3C1C2C3P1P2P3问:问:CPU某一时刻只能执行输入、某一时刻只能执行输入、计算、打印三个程序中的一个,计算、打印三个程序中的一个,如何理解并发?如何理解并发?例例2:两个程序:两个程序A和和B共享一个变量共享一个变量 N (当前值为当前值为 n)。 程序程序A: N = N+1;程序程序B:print(N );N = 0;在处
8、理机上执行关于在处理机上执行关于N的的3条指令,由于条指令,由于并发性,有理由假定并发性,有理由假定3个可能的执行序列个可能的执行序列: N=N+1; print(N); N=0;(完全顺序AB) print(N); N=0; N=N+1;(完全顺序BA) print(N); N=N+1; N=0; (B, A交替运行)n1,n1,0,最终,最终N的结果为的结果为 0 n, 0 ,1, 最终最终N的结果为的结果为 1 n, 1 , 0 , 最终最终N的结果为的结果为 0 计算结果与并发计算结果与并发程序的程序的执行速度执行速度有关有关b. 程序并发执行时的特征程序并发执行时的特征 2) 失去封
9、闭性失去封闭性:多个程序多个程序共享系统中的各种资源共享系统中的各种资源,因而这,因而这些资源的状态将由多个程序来改变,致使程序的运行些资源的状态将由多个程序来改变,致使程序的运行失去了封闭性失去了封闭性。1)间断性间断性:任意程序不可能一直占有任意程序不可能一直占有CPU3) 不可再现性不可再现性:程序在并发执行时,程序在并发执行时,由于失去了封闭性,由于失去了封闭性,也导致失去了可再现性。也导致失去了可再现性。(1)(1)程序是一个静态概念,而进程是一个动态概念程序是一个静态概念,而进程是一个动态概念 程序是指令的有序集合,它作为一个静态的实体而存在,程序是指令的有序集合,它作为一个静态的
10、实体而存在,可以作为程序文件被长久保存。可以作为程序文件被长久保存。 程序一旦执行进程就会被创建,该进程因调度而执行,程序一旦执行进程就会被创建,该进程因调度而执行,因得不到资源而暂停执行,因执行结束而撤销,因而具有生因得不到资源而暂停执行,因执行结束而撤销,因而具有生命期,是一个动态的实体,是暂时的。命期,是一个动态的实体,是暂时的。4 4 进程与程序的关系进程与程序的关系(2)(2) 进程具有并行特性,而程序没有进程具有并行特性,而程序没有。 程序:进程的程序:进程的1 1:n n联系联系 通过多次执行,一个程序可以对应多个进程;通过多次执行,一个程序可以对应多个进程; 例如例如:打开多个
11、打开多个WORD文件。文件。 进程:程序的进程:程序的1 1:n n联系联系 通过调用关系,一个进程可以包括多个程序。通过调用关系,一个进程可以包括多个程序。 例:在例:在WORD中插入中插入BMP图象、图象、EXCEL表格等。表格等。(3)(3) 进程与程序之间存在多对多的联系进程与程序之间存在多对多的联系。5 实例介绍:实例介绍:Linux系统创建进程系统创建进程 (1) 进程创建进程创建fork 在在Linux系统中,用户或系统可以使用系统调用系统中,用户或系统可以使用系统调用fork来来创建一个新的进程。创建一个新的进程。 fork的函数原形为:的函数原形为: 格式格式: int fo
12、rk( )返回值返回值: =0 创建成功,从子进程返回;创建成功,从子进程返回; 0 创建成功,从父进程返回,其值为子进程的创建成功,从父进程返回,其值为子进程的PID号;号; =-1 创建失败。创建失败。 由于由于forkfork()调用执行后,从父进程和子进程返回的()调用执行后,从父进程和子进程返回的值不同,因而用户能够在程序中使用分支结构将父子进程需值不同,因而用户能够在程序中使用分支结构将父子进程需要执行的不同程序分开。要执行的不同程序分开。应用程序的框架结构如下:应用程序的框架结构如下:main( ) int p; /存放子进程存放子进程pid号号while( ( p=fork(
13、) ) =-1) ; /创建子进程直到成功为止创建子进程直到成功为止if (p = 0)/返回值返回值=0表示子进程返回表示子进程返回 /*此处插入此处插入子进程程序段子进程程序段*/ else /返回值返回值0表示父进程返回表示父进程返回 /*此处插入此处插入父进程程序段父进程程序段*/ .Beforefork()After.forkfork执行前执行前一个控制流进入内核一个控制流进入内核forkfork模块模块。Beforefork()After。Beforefork()Afterforkforkfork执行后执行后调用后,从调用后,从forkfork返回两个控制流返回两个控制流父进程父进
14、程子进程子进程 #include main() int p1,p2 while (p1=fork()=-1) ; if (p1=0) printf(“b”); else printf(“a”);输出结果是什输出结果是什么?么? 例例 父进程创建子进程父进程创建子进程P1P1、P2P2,父子进程分别输出字符,父子进程分别输出字符a a、b b和和c c。#includemain() int p1,p2; while ( (p1 = fork() ) = -1); /创建子进程创建子进程1,直至创建,直至创建成功成功 if(p1=0) /子进程子进程P1返回输出返回输出bputchar(b) ;
15、else /父进程返回父进程返回 while( (p2 = fork() = -1) ;/创建子进程创建子进程2if(p2=0)/子进程子进程P2返回输出返回输出cputchar(c);else putchar(a); /父进程返回输出父进程返回输出a 该程序多次运行后,输出的结果可能会是:该程序多次运行后,输出的结果可能会是:abcabc、acbacb、bcabca、cbacba、bacbac或或cabcab等随机结果中的任意一种。等随机结果中的任意一种。每次运行后都会产生父子每次运行后都会产生父子3个进程,所以有个进程,所以有3个字符输出。个字符输出。其中其中系统屏幕输出进程的输出系统屏幕输出进程的输出humingqingBitLinux chap3$显示会显示会跟随在父进程输出跟随在父进程输出a之后。之后。