关于计算机操作系统中“进程”详析
陈贵彬
(澳门永利官网进入计算机科学系 四川成都610100)
摘 要:进程同步包括进程的互斥和进程的同步两个方面,是操作系统管理共享资源的一种手段。从学生掌握的情况来看,许多学生对这部分知识掌握的不好,理解的不透。本文就如何理解进程同步进行了详实的讲解,并通过运用具体“案例法”来剖析了如何运用PV操作解决进程同步问题。
关键字:进程同步 进程互斥
在多道程序系统中,由于资源共享与进程合作,使进程之间可能产生两种形式的制约关系:
1、间接制约主要源于资源共享,引起进城之间的互斥执行。当一个进程使用这个共享资源时,另一个进程只能等待。例如一个家里如果只有一个卫生间,卫生间这个共享资源使得每个人只能互斥使用它,这就是间接制约。
2、直接制约主要源于进程合作,引起进程的同步执行。在一些关键点是需要互相等待或互相交换信息,并发进程各自执行的结果互为对方的执行条件。例如司机与售票员的关系,当司机到站停车后,售票员才能开门,而只售票员关门后,司机才能开车,他们之间是同步的。
一、进程的互斥与进程的同步
进程同步包括两个方面:进程的互斥;进程的同步。
1、互斥:在操作系统中,当一个进程进入临界区时,另一个进程必须等待,当占用临界资源的进程退出临界区后,另一个进程才允许去访问此临界资源,我们称进程间这种关系为互斥。
2、同步:多个相互合作的进程,在一些关键点是可能需要互相等待或互相交换信息,我们称进程间这种合作关系为同步。
二、用PV操作解决进程同步问题
用PV操作解决进程同步问题分三步考虑:
第一步:确定问题是属于进程互斥还是进程同步,或是互斥与同步混合问题;
第二步:根据共享资源的数量以及使用共享资源的规定正确的定义信号量极其初值;
第三步:决定在不同信号量上应实施的P操作和V操作,用这些P操作和V操作保证并发进程正确地使用共享资源。
下面我们就一些例题做分析,在分析中理解进程同步,掌握进程同步。
1、用PV操作实现进程的互斥
例题:桌上有一个盘子,可以存放一个水果,父亲总是放苹果到盘子中,而母亲总是放香蕉到盘子中。
分析:在本题中,父亲和母亲共用一个盘子,盘中一次只能放一个水果。当盘子为空时,父亲和母亲均可以试着将一个水果放入盘中,但一次只能有一人成功放入水果。父亲和母亲都在共享盘这个资源。
在本题应设一个信号量dish表示盘子是否为空,初值为1.进程之间的同步描述如:
semaphore dish=1;
main( )
{
cobegin
father( )
mother( )
coend
}
father( )
{while}(true)
{p (dish);
将苹果放入盘中;
v (dish)}
}
mother( )
{while}(true)
{p (dish);
将香蕉放入盘中;
v (dish)}
}
小结:用PV操作实现进程的互斥,一般情况下只要用一个信号量与一组相关临界区联系起来,信号量的初值定义为1,每个进程要进入临界区之前调用P操作,测试自己是否可以立即进入临界区;执行完临界区的程序段后,调用V操作表示自己退出临界区。
2、用PV操作实现进程的同步
例题:设公交车上,司机和售票员的活动分别是:
司机:启动车辆;正常行车;到站停车。
售票员:关车门;售票;开车门。
分析:汽车行驶过程中,司机和售票员之间的同步关系是:售票员关车门后,向司机发开车信号,司机接到开车信号后启动车辆,在汽车正常行驶过程中售票员售票。到站时司机停车,售票员在车停后开门让乘客上下车。因此,司机启动车辆的动作与售票员关车门的动作取得同步。在本体重,应设置两个信号量:S1、S2。S1表示是否允许司机启动汽车,初值为0;S2表示是否允许售票员开门,初值为0.
Semaphore S1=0;
Semaphore S2=0;
Main( )
{cobegin;
driver( )
busman( );
coend }
driver( )
{while ( )
{P(S1)启动车辆;
正常行车;
到站停车;
V(S2)}
}
busman( )
{while( )
{关车门;
V(S1)
售票;
P(S2)
开车门;
上下乘客;}
}
小结:用PV操作实现进程的同步时,应定义一组信号量。其中每个信号量与一个消息对应,根据各个消息量的物理含义确定初值。进程通过调用P操作来测定自己需要的消息是否到达,通过调用V操作把其它进程需要的消息发送出去。
3、用PV操作实现进程的同步与互斥的混合问题
例题:有四个进程R1,R2,W1,W2,它们共享可以存放一个数的缓冲器B。进程R1每次把从键盘上读出的一个数存到缓冲器B中,供进程W1打印输出;进程R2每次从磁盘上读一个数存放到缓冲器B中,供进程W2打印输出。为防止数据的丢失和重复打印,问怎样用PV操作来协调这四个进程的并发执行。
分析:进程R1和R2各自生产不同的产品存入共享的缓冲器B中每次只能存入一个数,因此,进程R1和R2在存数时必须互斥。
进程R1和R2各自生产不同的产品要存入共享的缓冲器B中每次只能存入一个数,因此,进程R1和R2在存数时必须互斥。
进程R1和R2在把数存入B中后应分别发送消息通过进程W1和W2;进程W1和W2在取出数之后应发出缓冲器B中又允许存放一个新数的消息。故进程R1与W1、进程R2和W2之间要同步。
在本题中,应设置三个信号量:S、S1、S2。其中:S表示是否允许进程R1或R2存入缓冲器B,初值为“1”;S1和S2表示是否允许进程R1或R2分别要向进程W1和W2发送消息。初值为“0”。而进程W1和W2在取出缓冲器B中的数之后只需发出“允许存放一个新数”的消息,通过调用V(S)即可,不必增加新的信号量。
Semaphore s=1;
Semaphore s1=0;
Semaphore s2=0;
Main( )
{cobegin
R1( );
R2( );
W1( );
W2( );
Coend }
R1( )
{while( )
{从键盘读一个数X1;
p(s)
B:=X1;
V(s1); }
}
R2( )
{while( )
从磁盘读一个数X2;
p(s)
B:X2;
V(s); }
}
W1( )
{while( )
{p(s1)
y:=B;
v(s);
打印y中的数字;}
}
W2( )
{while( )
{p(s2)
z:=B;
V(S);
打印Z中的数;}
}
参考文献
[1]汤子瀛等著《计算机操作系统》
[2]计算机抱编辑部《计算机技术》
[3]李示锡、周兴社著《计算机操作系统原理》