pv操作2.doc
《pv操作2.doc》由会员分享,可在线阅读,更多相关《pv操作2.doc(7页珍藏版)》请在冰点文库上搜索。
线程是进程的一个组成部分,一个进程可以有多个线程,而且至少有一个可执行线程。
进程的多个线程都在进程的地址空间内活动。
资源是分给进程的,而不是分给线程的,线程需要资源时,系统从进程的资源配额中扣除并分配给它。
处理机调度的基本单位是线程,线程之间竞争处理机,真正在处理机上运行的是线程。
线程在执行过程中,需要同步。
例题1 解:
设信号量初值S=1
汽车进程Pi(i=1,2,3,…)
到达桥头
P(s)
桥行驶
到达桥另一端
V(s)
例题二若有一售票厅只能容纳300人,当少于300人时,可以进入。
否则,需在外等候,
若将每一个购票者作为一个进程,请用P、V操作编程。
解:
信号量初值S=300
购票者进程Pi(i=1,2,3,…)
P(s)
进入售票厅
购票
退出售票厅
V(s)
例题三有一只铁笼子,每次只能放入一只动物,猎手向笼中放入老虎,农民向笼中放入猪,动物园等待取笼中的老虎,饭店等待取笼中的猪,试用P、V操作写出能同步执行的程序。
解:
两个生产者和两个消费者共享了一个仅能存放一件产品的缓冲器,生产者各自生产不同的产品,消费者各自取自己需要的产品,P、V操作编程为:
猎手进程 农民进程 动物园进程 饭店进程
P(s) P(s) P(s1) P(s2)
放入虎 放入猪 买老虎 买猪
V(s1) V(s2) V(s) V(s)
其中S初值=1,S1=S2=0
例题四桌上有一只盘子,每次只能放入一个水果。
爸爸专向盘中放苹果,妈妈专向盘中放桔子,女儿专等吃盘中的苹果,儿子专等吃盘中的桔子。
用P、V操作写出它们能正确同步的程序。
解:
信号量初值S1=0,S2=0,S=1
爸爸进程 妈妈进程 女儿进程 儿子进程
repeat repeat repeat repeat
P(s) P(s) P(s1) P(s2)
放苹果 放桔子 取苹果 取桔子
V(s1) V(s2) V(s) V(s)
untilfalse untilfalse untilfalse untilfalse
例题五设有两个优先级相同的进程P1和P2如下,S1和S2初值均为0,求:
P1,P2并发执行结束后,x,y,z分别是多少?
进程P1 进程P2
y:
=1; x:
=1;
y:
=y+2; x:
=x+1;
V(s1); P(s1);
z:
=y+1; x:
=x+y;
P(s2); V(s2)
y:
=z+y; z:
=x+z;
解:
因为P1、P2是并发进程,所以P1和P2调度顺序不确定。
假设P1先执行,当P1执行到P(s2)时,s2=-1,P1阻塞,此时y=3,z=4;当调度程序调度到P2时,由于进程P1巳执行到了V(s1),P2在执行P(s1)时,不阻塞而继续执行,当执行到V(s2)时,将P1唤醒,然后执行到最后一个语句,此时x=5,z=9;当P1再次被唤醒、调度时,
继续执行P1的最后一处语句,此时y=12.
所以最后结果是:
x=5,y=12,z=9.
如果P2先执行,结果同上。
习题1:
有三个并发进程使用同一个缓冲区,进程P1负责读数据到缓冲区,P2负责加工缓冲区中的数据,进程P3负责将缓冲区中加工后的数据输出.在进程P3没有输完之前,进程P1不能读入新的数据到缓冲区中.请用P、V操作编程.
解:
信号量初值:
S1=0,S2=0,S3=0
进程P1 进程P2 进程P3
读数据到 P(S1) P(S2)
缓冲区 加工 输出
V(S1) V(S2) V(S3)
P(S3)
习题2:
设有六个进程P1、P2、P3、P4、P5、P6,它们并发执行。
由P1开始执行,
P6执行后结束。
当进程P1执行后,进程P2、P3才能执行;当进程P2执行后,进程P4才能执行;当进程P3执行后,进程P5才能执行;当进程P4、P5都执行后,进程P6才能执行;请用P、V操作编程.
解:
这是一个同步问题,信号量初值:
S2=0,S3=0,S4=0,S5=0,S6=0
进程P1 进程P2 进程P3
执行P1 P(S2) P(S3)
V(S2) 执行P2 执行P3
V(S3) V(S4) V(S5)
进程P4 进程P5 进程P6
P(S4) P(S5) P(S6)
执行P4 执行P5 P(S6)
V(S6) V(S6) 执行P6
例一.在某展示厅设置一个自动计数系统,以计数器count表示在场的人数,count是动态变化的,若有一个人进入展示厅进程pin对计数器count加1,当有一个人退出展示厅时,进程pout实现计数器减1由于进、出所以展示厅的人是随机的,用P-V操作实现。
(并发进程之间的互斥问题)
解:
定义信号量:
S:
表示是否有进程进入临界区,初值为1.(表示没有进程进入临界区)
begin
count:
Integer;
S:
semaphore;
count:
=0;
S:
=1;
cobegin
processPin
R1:
Integer;
begin
P(S);
R1:
=count;
R1:
=R1+1;
count:
=R1;
V(S);
end;
ProcessPout
R2:
Integer;
begin
P(S);
R2:
=count;
R2:
=R2-1;
count:
=R2;
V(S);
end;
count;
end;
例二.与生产者和消费过者相似的问题,把“A进程将记录送入缓冲器”看生产者生产了一件物品且把物品存入缓冲器“把“B进程从缓冲器中取出记录并加工”看作是消费者从缓冲器取出物品去消费,缓冲器中只能放一个记录(一件物品),用P-V操作实现。
(并发进程之间的同步问题)
解:
定义两个信号量为:
sp和sg。
sp:
表示生产者是否右以把物品存入缓冲器。
由于缓冲器只能存放一个物品,因此sp的初值为1,即sp:
=1。
sg:
表示缓冲是否存有物品,它的初值应该为0,即sg:
=0,表示缓冲器中还没有物品存在。
生产者和消费者两个进程并发执行时,可按以下的方式实现同步:
sp:
=1;sg:
=0;
cobegin
processproducer(生产者进程)
begin
L1:
produceaproduct;
P(sp);
Buffer:
=product;
V(sg);
gotoL1
end
processconsumer(消费者进程)
begin
L2:
P(sg);
Takeaproduct;
V(sp);
consume;
gotoL1
end;
coend;
例三.如果一个生产者和一个消费共享缓冲器容量为可以存放n件物品时,生产者总可继续存入物品;同时当缓冲器的物品不为“0”时,消费者总可从缓冲器中取走物品,用P-V操作实现。
(并发进程之间的同步问题)
解:
sp:
表示生产者是否可以把物品存入,初值为n;(因为,缓冲器的容量为n件物品)
sg:
表示缓冲器中是否存有物品,初值为0.
B:
away[0:
n-1]ofinteger;
k,t:
integer;
k:
=0;t:
=0;sp:
=n;sg:
=0;
cobegin
processproducer
begin
L1:
produceaproduct;
B[k]:
=product;
k:
=(k+1)modn;
V(sg);
gotoL1
coend;
processconsumer
begin
L2:
P(sg);
TackaproductfromB[t];
t:
=(t+1)modn;
V(sp);
consume;
goto:
=L2
end
coend
例五.桌上有一只盘子,每一次放入一个水果,爸爸向盘中放苹果,妈妈向盘中放桔子,一个女儿专吃盘中的苹果,一个儿了专等吃盘是的桔子。
试用P-V操作定出他们能同步的流程图。
(并发进程之间同步与互斥的混合问题)
解:
定义信号量:
dish:
表明盘子中是否为空,初值为1;
Apple:
表明盘子中是否有苹果,初值为0;
Orange:
表明盘子中是否有桔子,初值为0;
main()
{cobegin
father();
mother();
son();
daughter();
coend
}
father()
{P(dish);
…
放苹果
…
V(apple);
}
mother()
{P(dish);
…
放桔子
…
V(orange);
}
son()
{P(orange);
…
取桔子
…
V(dish);
}
daughter()
{P(apple);
…
取苹果
…
V(dish);
}
例六.设公共汽车上,司机和售票员的活动分别为:
司机的活动是启动车辆、正常开驶、到站停车;售票员的活动是关门、售票、开门。
①试指出在汽车出站、行驶、到站过程中,述两种活动有什么同步关系?
②用P-V操作实现它们之间的同步关系。
(并发进程之间的同步问题)
解:
①司机启动车辆与售票员关车门为同步关系;
司机到站停车与售票员开车门为同步关系。
②定义两个信号量:
S1:
表示门是否关了,初始值为0;S2:
表示汽车是否到站,初始值为0
main()
{cobegin
Process司();
Process售();
coend
}
Process司()
{P(S1);
启动;
行驶;
到站停车;
V(S2);
}
Process售()
{关车门;
V(S1);
售票;
P(S2);
开车门;
}
例七.多个进程共享一个文件,其中写文件的称为写者,读文件的称为读者,写者与写者、写者与读者之间要互斥地访问文件,读者之间可同时读,试用P-V操作实现它们之间的关系。
(进程之间的互斥问题)
解:
定义变量:
count:
表现当前读者个数,初值为0;
mutex:
用来对共享变量count进行互斥访问,初值为1;
write:
用来使写者与写者,写者与读者之间互斥访问文件,初值为1.
semaphonemutex:
=1;
semaphonewrite:
=1;
intcount:
=0;
main()
{cobegin
Reader();
Writer();
coend
}
Reader()
{while(true)
{P(mutex);
if(count==0)
p(write)
count++;
V(mutex);
读文件;
P(mutex);
count--;
if(count==0)V(write)
V(mutex);
}
}
writer()
{while(true)
{P(write);
写文件;
V(write);
}}