进程是计算机进行资源分配和独立运行的基本单位。
3.1 进程的引入
引入进程是为了使多道程序并发执行。
1.程序的顺序执行
一个程序通常由若干个程序段所组成,它们必须按照某种先后次序来执行,仅当前一个操作执行完后才能执行后继操作,这类计算过程就是程序的顺序执行过程。
例如:先输入→再计算→最后输出,即:I→C →P。
程序顺序执行时的特征
顺序性:处理机的操作严格按照程序所规定的顺序执行,即每一个操作必须在下一个操作开始之前结束。
封闭性:程序一旦开始运行,其执行结果不受外界因素影响。
可再现性:只要程序执行时的初始条件和执行环境相同,当程序重复执行时,都将获得相同的结果。
2.程序的并发执行
程序的并发执行是指若干个程序(或程序段)同时在系统中运行,这些程序(或程序段)的执行在时间上是重叠的,一个程序(或程序段)的执行尚未结束,另一个程序(或程序段)的执行已经开始。
前驱图
前驱图是一个有向无循环图,图中的每个结点可以表示一条语句、一个程序段或进程,结点间的有向边表示语句或程序段的执行次序。
程序并发执行例
进程1、2、3并发执行。对每个进程而言,其输入、计算和输出这三个操作必须顺序执行。它们之间存在如下先后关系:
I1先于C1和I2 , C1先于P1和C2 , P1先于P2
I2和C1 , I3、 C2和P1可以并发。
与时间有关的错误例
程序并发执行时可能出现与时间有关的错误。
例
进程1:r1=x; 进程2:r2=x;
r1++; r2++;
x=r1; x=r2;
设在两进程运行之前,x的值为0。则两进程运行结束后,x值可为:
Bernstein条件
读集:语句执行期间要引用的变量集合,记为R(Si)={a1,…,am}
写集:语句执行期间要改变的变量集合,记为W(Si)={b1,…,bn}
Bernstein条件能保证两条相继的语句并发执行而不会产生与时间有关的错误:
R(Si)∩ W(Sj)={ }
R(Sj)∩ W(Si)={ }
W(Si)∩ W(Sj)={ }
例
考虑下面是条语句:
S1:a=x+y S2:b=z+1
S3:c=a-b S4:d=c+1
R(S1)={x,y} R(S2)={z} R(S3)={a,b}
W(S1)={a} W(S2)={b} W(S3)={c}
因R(S1)∩ W(S2)∪R(S2)∩ W(S1)∪W(S1)∩W(S2)={ },故S1和S2可以并发执行 。
因R(S2)∩ W(S3)∪R(S3)∩ W(S2)∪W(S3)∩W(S2)={b},故S2和S3不能并发执行 。
并发语句的描述方式
cobegin
S1;S2;…Sn;
coend
对应的前驱图如右,其中S0和Sn+1分别是cobegin和coend语句前后的两条语句。
程序并发执行时的特征
间断性:并发程序具有“执行---暂停----执行”这种间断性的活动规律。
失去封闭性:多个程序共享系统中的资源,这些资源的状态将由多个程序来改变,致使程序之间相互影响。
不可再现性:在初始条件相同的情况下,程序的执行结果依赖于执行的次序。
并发程序的其他特征
资源分配动态性:多道程序在运行过程中可根据需要随时提出分配资源的请求。
程序并发执行的相互制约:并发程序执行时相互影响,相互制约。其相互制约关系分为:
直接制约:合作进程之间的相互制约。
间接制约:因资源共享产生的相互制约。
相互通信的可能:多个进程之间可能需要相互传递信息。
同步与互斥的必要:并发进程之间需要调整相对执行速度,许多资源需要互斥使用。