进程通讯Word文档格式.docx
《进程通讯Word文档格式.docx》由会员分享,可在线阅读,更多相关《进程通讯Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
x=1;
y=0;
ifx1y=y+1;
z=y;
ProcessP2()
intt,u;
x=0;
t=0;
ifx1t=t+2;
u=t;
3.设Pa,Pb,Pc为一组合作进程,其进程流程图如下所示。
试用信号灯的P、V操作实现这三个进程的同步。
例1:
某游艺场设置了一个自动计数系统,用计数器count表示在场的人数。
若有一个人进入游艺场,进程Pin对count加1,当退出一个人时,进程Pout对count减1。
由于进出游艺场的人是随机的,所以进程Pin和Pout的执行是并发的。
试用P,V操作来实现游艺场在场人数的正确管理。
intcount=0;
//计数器初始化
intS=1;
//对计数器count的修改权限
Pin();
//进入游艺场进程
Pout();
//退出游艺场进程
ProcessPin()
intR1=0;
P(S);
R1=count;
R1=R1+1;
Count=R1;
V(S);
ProcessPout()
intR2=0;
R2=count;
R2=R2-1;
Count=R2;
例2:
在一个只允许单向行使的十字路口,分别有若干由东到西、由南到北的车辆在等待通过。
为了安全,每次只允许一辆车通过,当有车辆通过时其他车辆必须等候。
请用信号量的P,V操作设计一个十字路口安全行使的自动管理系统。
//可否通过十字路口
Pew();
//由东到西的车辆通行进程
Psn();
//由南到北的车辆通行进程
ProcessPew()
由东到西通过十字路口;
ProcessPsn()
{
由南到北通过十字路口;
例3:
设有一个机票订购系统有n个售票处,每个售票处通过网络终端访问系统的公共数据区,假定公共数据区中的一些单元Aj(j=1,2,…..)分别存放各次航班的余票数。
售票时,若某次航班还有余票,则售给乘客;
否则,拒绝售票。
请用P,V操作实现各售票进程的并发执行。
//可否修改公共数据区
Pi(i=1,2,….,n);
//各售票处的售票处理进程
ProcessPi(i=1,….,n)
intRi=0;
//各进程执行时所用的工作单元
Ri=Aj;
if(Ri1)
{
Ri=Ri-1;
Aj=Ri;
输出一张票;
}
else
V(S);
输出“票已售完”信息
例4:
有三个进程PA,PB,PC,合作解决文件打印问题:
PA将文件记录从磁盘读入内存的缓冲区1,每执行一次读一个记录;
PB将缓冲区1的记录复制到缓冲区2,每执行一次复制一个记录;
PC打印缓冲区2中的记录,每执行一次打印一个记录。
每个缓冲区只能存放一个记录。
请用P,V操作实现文件的正确打印。
intempty1=1;
//缓冲区1的空闲空间数
intempty2=1;
//缓冲区2的空闲空间数
intfull1=0;
//缓冲区1的满空间数
intfull2=0;
//缓冲区2的满空间数
PA();
PB();
PC();
ProcessPA()
While(打印工作还没有结束)
P(empty1);
将一个记录存入缓冲区1;
V(full1);
ProcessPB()
P(full1);
从缓冲区1取出一个记录;
V(empty1);
P(empty2);
将记录存入缓冲区2;
V(full2);
ProcessPC()
P(full2);
从缓冲区2取出一个记录;
V(empty2);
将记录打印输出;
例5:
桌上有一个空盘子,只允许放一只水果。
爸爸向盘中放苹果,妈妈向盘中放橘子,规定儿子只能吃橘子,女儿只能吃苹果。
试用P,V操作实现他们能同步的程序。
intSp=1;
//盘中的空闲空间数
intSo=0;
//盘中的橘子数
intSa=0;
//盘中的苹果数
Pf();
Pm();
Ps();
Pd();
ProcessPf()
P(Sp);
将苹果放入盘中;
V(Sa);
ProcessPm()
将橘子放入盘中;
V(So);
ProcessPs()
P(So);
吃盘中的橘子;
V(Sp);
ProcessPd()
P(Sa);
吃盘中的苹果;
例6:
有一个阅览室,共有200个座位,读者进入时必须先在一张登记表上登记,该表为每一座位列一表目,包括座号和读者姓名等,读者离开时要消掉登记的信息,试问:
(1)为描述读者的动作,应编写几个程序,设置几个进程?
(2)试用PV操作描述读者进程之间的同步关系。
(1).应编写登记程序、消掉登记程序,
设置登记进程和消掉进程。
(2).设三个信号量
Mutex互斥信号量初值1
Empty空座的个数同步信号量初值200
Full满座的个数同步信号量初值0
intMutex=1;
//可否修改座位数的权限
intEmpty=200;
//空座的个数
intFull=0;
//满座的个数
Pin();
//登记进程
Pout();
//消掉进程
P(Empty)
P(Mutex)
在登记表上登记
V(mutex)
V(full)
P(full)
P(mutex)
在登记表上消掉登记
V(mutex)
V(empty)
例7:
医生为病人看病,需要化验,于是医生开出化验单,病人到化验室化验,化验结果送回医生处供医生诊断。
医生看病为一个进程,化验室化验为一个进程,二者并发执行且需要交换信息。
请回答下列问题:
(1)用PV操作管理这些并发进程时,应怎样定义信号量,写出信号量的初值及含义。
(2)根据所定义的信号量,把应执行的PV操作过程写出来,以保证进程能够正确地并发执行。
.
(1)因为医生看病诊断进程和化验室化验进程之间为同步关系。
所以定义两个信号量S1和S2,S1表示有无化验单,S2表示有无化验结果。
初始值均为0。
(2)应执行的PV操作过程如下:
main()
{intS1=0;
//表示有无化验单
intS2=0;
//表示有无化验结果
Labora();
//化验进程
Diagnosis();
//诊断进程
}
Labora()
{while(化验工作未结束)
{P(S1);
//询问有无化验单,若无则等待
化验工作
//送出化验结果
Diagnosis()
{while(看病工作未结束)
{看病
//送出化验单
//等化验结果
Diagnosis//诊断
例8:
在一个盒子里,混装了数量相等的围棋白子和黑子,现在要用自动分拣系统把白子和黑子分开。
该系统设有两个进程P1和P2,其中P1拣白子,P2拣黑子。
规定每个进程每次只拣一子,当一进程正在拣子时,不允许另一个进程去拣,当一进程拣了一子时,必须让另一进程去拣,试写出两个并发进程能正确执行的算法。
main()
{intS1=1;
//进程P1的私有信号量,初始值为1
//进程P1的私有信号量,初始值为0
intn=1000;
//围棋所有黑子和白子总数
while(n!
=0)
{P1();
//拣白子进程
P2();
//拣黑子进程
P1()
{p(S1);
拣白子;
n=n-1
})
P2()
{p(S2);
拣黑子;
n=n-1;
9、桌上有一只盘子,最多可容纳两个水果。
每次只能放入一个或取出一个水果。
爸爸专向盘中放苹果,妈妈专向盘中放橘子,两个女儿专等吃盘中的苹果,两个儿子专等吃盘中的橘子。
试用P、V操作写出他们能同步与互斥的程序。
(南京大学)
IntS=1;
//是否可以更改盘子内的空间数
Intempty=2;
//盘子内的初始空间数
IntSa=0;
//盘中是否有苹果
IntSo=0;
//盘中是否有橘子
Pf();
Pm();
Pd_i();
Ps_j();
Pf()
P(empty);
P(S);
向盘中放苹果;
Pm()
向盘中放橘子;
Pd_i()
取盘中的苹果;
V(empty);
Ps_j()
取盘中的橘子;
10、某寺庙,有小和尚、老和尚若干。
有一水缸,由小和尚提水入缸,老和尚从缸中取水饮用。
水缸可容纳10桶水,水取自同一水井中,水井径窄,每次只能容一个水桶取水。
水桶总数为3个,每次入、取缸水仅为1桶,且不可同时进行。
试给出取水、入水的算法描述。
(北京邮电大学)
Main()
Intmutex1=1;
//是否可以使用水井
Intmutex2=1;
//是否可以使用水缸
Intmutex3=1;
//是否可以修改水桶个数
Intempty=10;
//水缸初始空间数
Intfull=0;
//水缸满否
Intcount=3;
//水桶初始个数
Pin_i();
//入水进程
Pout_j();
//取水进程
Pin_i()
//水缸满否?
满则阻塞入水进程
P(count);
//申请打水的桶
P(mutex3);
拿水桶;
V(mutex3);
P(mutex1);
//互斥使用水井
从井中取水
V(mutex1);
P(mutex2);
//互斥使用水缸
向缸中入水
V(mutex2);
V(full);
//水缸多了一桶水
V(count);
//归还水桶
Pout_j()
P(full);
水缸是否有水?
无则阻塞取水进程
//申请取水的桶
P(mutex2);
从缸中取水
V(mutex2);
//水缸少了一桶水
V(count);
11、有一个理发师,有n张可供顾客等待理发的椅子,如果没有顾客,则理发师睡觉;
如果有一顾客进入理发店发现理发师在睡觉,则把他叫醒进行理发,如果理发师正在理发时又有顾客来到,若有空椅子,就在空椅子上等待,若没有空椅子就离开理发店。
写一个算法描述理发师和顾客之间的关系。
要求不能带有竞争条件。
(西安电子科技大学)
Intmutex=1;
//可否修改顾客数
Intwakeup=0;
//理发师等唤醒的信号
Intwait=0;
//顾客是否可以等待
Intrc=0;
//初始顾客数
P1();
//顾客进程
P2();
//理发师进程
P1()
P(mutex);
rc=rc+1;
if(rc==1)//如果是第一个顾客就唤醒理发师
V(wakeup);
else
if(rc<
=n)//当顾客人数少于n时,在椅子上等待
P(wait);
else
{
rc=rc-1;
该顾客离开理发店
V(mutex);
P2()
P(wakeup);
//理发师睡觉,等待被唤醒
While(rc!
=0)
理发
rc=rc-1;
if(rc!
V(wait);
//让等待中的一个顾客理发
12、如何让五个哲学家吃通心面问题满足同步机制。
改变5个哲学家申请叉子的顺序。
规定奇数号的哲学家先拿起他左边的叉子,然后再去拿右边的叉子;
偶数号的哲学家则正好相反。
即:
拿到一个叉子的哲学家才有权拿另一个叉子,而没有拿到叉子的哲学家则退出竞争。
Pi(i=0,1,2,3,4)()
Thinkforawhile
if(odd(i))//若为奇数号
P(fork(i+1)MOD5);
P(fork(i));
P(fork(i+1)MOD5);
Eatforawhile
V(fork(i));
V(fork(i+1)MOD5);
1、若系统有某类资源m*n+1个,允许作业执行过程中动态申请该类资源,但在该系统上运行的每一个作业对该类资源的占有量在任一时刻都不会超过m+1个。
当作业申请资源时,只要资源尚未分配完,则总能满足它的要求。
但用限制系统中可同时执行的作业个数来防止死锁。
你认为作业调度允许同时执行的最大作业数应为多少?
证明之。
2、若系统有同类资源m个,被n个进程共享,试问:
当m>
n和m<
n,每个进程最多可申请多少个这类资源而使系统一定不会发生死锁?