Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1305615
  • 博文数量: 254
  • 博客积分: 1586
  • 博客等级: 上尉
  • 技术积分: 2295
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-15 16:38
个人简介

linux学习中

文章分类

全部博文(254)

文章存档

2016年(6)

2015年(2)

2014年(74)

2013年(93)

2012年(12)

2011年(2)

2010年(51)

2009年(14)

分类:

2010-10-19 15:46:53

操作系统中的进程同步详析

进程同步包括进程的互斥和进程的同步两个方面,是操作系统管理共享资源的一种手段。从考试情况来看,许多考生对这部分知识掌握的不好,理解的不透。用PV 操作解决进程同步问题时首先应确定问题是属于进程互斥还是进程同步,或是互斥与同步的混合问题。然后根据共享资源的数量以及使用共享资源的规则正确的定义信号量及其初值。然后决定在不同信号量上应实施的P操作和V操作,用这些P操作和V操作保证并发进程正确地使用共享资源。下面我们就一些考题做一些分析,让考生在分析中理解进程同步,掌握进程同步。

用PV操作实现进程的互斥

用PV操作实现进程的互斥,只要用一个信号量与一组相关临界区联系起来,信号量的初值定义为“1”。每个进程要进入临界区之前调用P操作,测试自己是否可以立即进入临界区;执行完临界区的程序段后,调用V操作表示自己退出临界区。
例题:观察者和报告者是两个并发执行的进程,观察者不断观察并对通过的卡车计数,报告者定时的将观察者的计数值打印,两个进程并发执行的程序如下:
begin
count:integer;
count:=0;
cobegin
process observer
begin
L1: observe a car;/*观察到一辆卡车*/
count:=count+1;
goto L1
end;
process reporter
begin
L2:print count;
count:=0;
goto L2
end;
coend;
end;
请用PV操作进行管理使其不产生与时间有关的错误。

分析:观察者和报告者共享了变量count,观察者进程的临界区是“count:=count+1”,报告者进程的临界区是“print count; count:=0”。按给出的程序,对临界区的执行没有限制,当它们并发执行时对共享变量count会出现如下三种操作序列:
count:=count+1; print count;count:=0;
print count;count:=count+1;count:=0;
print count;count:=0;count:=count+1;
按第一、二种序列执行时,总能把观察者在一段时间里观察到的卡车数正确打印出来,然后再重新开始计数。而按第二种序列执行时,在打印了某段时间里观察到的卡车数后,观察者又观察到有一辆卡车通过作count+1,但由于接下去执行的是count:=0,以后观察者将从“0”开始计数,于是打印出来的count值的总和将比实际观察到的卡车数少。这种与时间有关的错误是因为它们同时在临界区执行,两个进程交替地访问了共享变量count而造成地。用PV操作管理时。只要保证互斥进入临界区即可。
解答:
begin
count:integer;
S:semaphore;
count:=0;s:=1;
cobegin
process observer
begin
L1: observe a car;/*观察到一辆卡车*/
P(s);
count:=count+1;
V(s);
goto L1
end;
process reporter
begin
L2:P(s);
print count;
count:=0;
V(s);
goto L2
end;
coend;
end;

用PV操作实现进程的同步

用PV操作实现进程的同步时应定义一组信号量,其中每个信号量与一个消息对应,根据各个消息量的物理含意确定初值。进程通过调用P操作来测定自己需要的消息是否到达,通过调用V操作把其它进程需要的消息发送出去。
例题:三个进程A、B、C ,共享两个缓冲器B1和B2。缓冲器B1中可存放n件产品,缓冲器B2中可存放m件产品。进程A每次生产一件产品并将其存入缓冲器B1中;进程B每次从缓冲器B1中取出一件产品后再把它传送到缓冲器B2中;进程C每次从缓冲器B2中取出一件产品去消费。为防止把产品存入已满的缓冲器、或从空的缓冲器取产品、或重复取产品,试用PV操作实现它们之间的相互制约。
分析:进程B是从B1中取出产品后传送到B2中。故进程B即是消费者又是生产者。进程A和进程B共享缓冲器B1,它们之间需要同步,应定义一对信号量S1和S2来实现进程A和B之间的消息传送。进程B和进程C共享缓冲器B2,也要定义一对信号量S3和S4来实现同步。进程B从缓冲器B1中取出一件产品后应立即调用V操作,通知进程A在缓冲器B1中增加了一个可存产品的单元,由于缓冲器B1和B2的容量不相等,所以进程B在把取出的产品存入缓冲器B2之前应调用P操作来测试缓冲器B2中是否有可存放产品的空单元。未了保证正确的存产品和取产品,可用指针r1、r2和t1、t2分别指出缓冲器中当前可存放产品和取产品的相对位置,每次存或取之后要修改指针值,使其指向下一个相对位置。
解答:
begin S1,S2,S3,S4:semaphore;
r1,r2,t1,t2:integer;
S1:=n;S2:=0;S3:=m;S4:=0;
r1:=r2:=t1:=t2:=0;
cobegin
process A
begin 
L1:produce a product;/*生产一件产品*/
P(S1);
B1[R1]:=poduct;
r1:=(r1+1) mod n;
V(S2);
Goto L1
end;
process B
begin
L2: P(S2);
x:=B1[t1];
t1:=(t1+1) mod n;
V(S1);
P(S3);
B2[r2]:=x;
r2:=(r2+1) mod m;
V(S4);
Goto L2
end;
process C
begin 
L3: P(S4);
y:=B2[t2];
t2:=(t2+1) mod m;
V(S3);
Consume;/*消费产品*/
goto L3
end;
coend;
end;

用PV操作实现进程同步与互斥的混合问题


有了上面的分析后,下面来考虑进程同步与互斥的混合问题。
例题:有四个进程R1,R2,W1,W2,它们共享可以存放一个数的缓冲器B。进程R1每次把从键盘上读出的一个数存到缓冲器B中,供进程W1打印输出;进程R2每次从磁盘上读一个数存放到缓冲器B中,供进程W2打印输出。为防止数据的丢失和重复打印,问怎样用PV操作来协调这四个进程的并发执行。
分析:进程R1和R2各自生产不同的产品要存入共享的缓冲器B中,由于B中每次只能存入一个数,因此,进程R1和R2在存数时必须互斥。进程R1和R2在把数存入B中后应分别发送消息通知进程W1和W2;进程W1和W2在取出数之后应发出缓冲器B中又允许存放一个新数的消息。故进程R1与W1、进程R2与W2之间要同步。下面来考虑定义信号量。首先应定义一个是否允许进程R1或R2存入缓冲器B的信号量S,初值为“1”;其次,进程R1和R2分别要向进程W1和W2发送消息,要有两个信号量S1和S2来表示相应的消息,初值为“0”。然后进程W1或W2在取出缓冲器B中的数之后只需发出“允许存放一个新数”的消息,通过调用V(S)即可,不必增加新的信号量。
解答:
begin S ,S1,S2: semaphore;
S:=1;S1:=S2:=0;
cobegin
process R1
begin
L1:从键盘读一个数x1;
P(S);
B:=x1;
V(S1);
goto L1
end;
process R2
begin
L2: 从键盘读一个数x2;
P(S);
B:=x2;
V(S);
goto L2
end
process w1
begin
L3:P(s1);
y:=B;
V(S);
打印y中的数;
goto L3
end;
process W2
begin 
L4: P(S2);
Z: =B;
V(S);
打印Z中的数;
goto L4
end;
coend;
end;

阅读(1406) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-10-19 19:12:20

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com