以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 计算机考研交流 』   (http://bbs.xml.org.cn/list.asp?boardid=67)
----  面包师问题和巴拿马问题(PV)  (http://bbs.xml.org.cn/dispbbs.asp?boardid=67&rootid=&id=57360)


--  作者:shun
--  发布时间:12/30/2007 10:40:00 AM

--  面包师问题和巴拿马问题(PV)
以下的代码都是Runningwulf提供的答案

面包师问题
Semaphore ClientQueue=0; //记录顾客等待队列
Semaphore Customer = 0; //记录提供给柜员可以办理业务的客户数量
Semaphore Clientmutex=1; //顾客的互斥信息量
Int ClerkState[n];
For(int i=0; i<n; i++)
   ClerkState[i]=1;

Void Client (){
  P(ClientQueue);
  P(Clientmutex);
  V(Customer);
                 [color=#FF0000]For(int i=0; i<0; i++){  //扫描到第一个空闲的柜员后推出,既到该柜员处办理
   If(ClerkState[i]==1){
    ClerkState[i]=0;
    Break;
   }
  } [/color]  //如果扫描过程中没有空闲的呢?是否要改为while
  V(Clientmutex);
  到第i个柜员处办理业务;
}


巴拿马问题

巴拿马运河问题
Semaphore A=1;
Semaphore P=1;
Semaphore mutex1=1;
Semaphore mutex2=1;
Int PshipSum = 0; AshipSum=0;
Int PshipCur = 0; AshipCur=0;

Pacific(){
 P(P);
 P(mutex1);
 PshipSum++; PshipCur++;
 If(PshipCur==1)
  P(A);//好象还是会死锁
                 If(PshipSum==T)
                                 P(P);
                 V(P);
 V(mutex1);
 过河;
 P(mutex1);
 PshipCur--;
 If(PshipCur==0){
  V(A);
  PshipSum=0;
  If(PshipSum==T);
                                    V(P);
               }
               V(mutex1);
           }

Pacific(){
 P(A);
 P(mutex2);
 AshipSum++; AshipCur++;
 If(AshipCur==1)
  P(P);
                If(AshipSum==T)
                               P(A);
                V(A);
 V(mutex2);
 过河;
 P(mutex2);
 AshipCur--;
 If(AshipCur==0){
  V(P);
  AshipSum=0;
  If(AshipSum==T);
                                      V(A);
                }
                V(mutex2);
            }



--  作者:buddha
--  发布时间:1/1/2008 12:35:00 PM

--  
面包师问题不一定正确.
巴拿马运河不必那么麻烦.可以看做两个读者优先的读者.
不可尽信...
:)
--  作者:cpkug
--  发布时间:1/1/2008 6:57:00 PM

--  
巴拿马运河问题:
1. 觉得只需要下面变量中的一行就够了,不需要两行;
int PshipSum=0,AshipSum=0;
int PshipCur=0,AshipCur=0;

2. 觉得判断己方船只过河总数大于T时则后续船只应该等待的操作应该在判断是否允许通过闸门之后,不然会出现死锁;

3. 觉得大西洋,太平洋初次对闸门的使用应该进行互斥,不然会出现死锁,拟增加互斥变量gate;

以下是本人修改后的算法,有不足请指教:

信息量:
A,P:=1  ——代表两边的船只是否允许通过的闸门。
gate :=1  ——代表对闸门的使用。

mutex1,mutex2:=1 ——互斥信息量

程序:
semaphore A=1;
semaphore P=1;
semaphore gate =1;
semaphore mutex1=1;
semaphore mutex2=1;
int PshipCur=0,AshipCur=0;

//在太平洋过闸门
Pacific(){
P(gate);
if(PshipCur > 0)
 V(gate);
P(P);
P(mutex1);
PshipCur++;
if(PshipCur == 1) {
  P(A);
      V(gate);
    }
V(mutex1)
V(P);
if(PshipCur == (T + 1))
 P(P);    
过闸门;
P(mutex1);
 PshipCur--;
 if(PshipCur==0)
  V(A);  
V(mutex1);
if(PshipCur == T){  
 V(P);
}


//在大西洋过闸门
Atlantic(){
P(gate);
if(AshipCur > 0)
 V(gate);
P(A);
P(mutex2);
AshipCur++;
if(AshipCur==1) {
  P(P);
      V(gate);
    }
V(mutex2);
V(A);
if(AshipCur == (T + 1))
 P(A);
过闸门;
P(mutex2);
 AshipCur--;
 if(AshipCur==0)
  V(P);  
V(mutex2);
if(AshipSum == T)
 V(A);
}


--  作者:xianyun
--  发布时间:1/8/2008 12:34:00 AM

--  
关于巴拿马运河问题和银行问题 05 年助教给了一个答案,这个答案将问题考虑得令人惊讶
答案如下:
巴拿马运河建在太平洋和大西洋之间。由于太平洋和大西洋水面高度不同,有巨大落差,所以运河中修建有T(T>=2)级船闸,并且只能允许单向通行。船闸依次编号为1,2,……,T。由大西洋来的船需经由船闸T,T-1,……,2,1通过运河到太平洋;由太平洋来的船需经由船闸1,2,……,T-1,T通过运河到大西洋。
   试用P,V操作正确解决大西洋和太平洋的船只通航问题。
答:来自不同方向的船只对船闸要互斥使用。但如过有同方向的船只正在通行,则不用等待。
对一个船闸设以下变量:
PtoAcnt   整型,记录此船闸正由太平洋往大西洋航行的船只  初值0。
AtoPcnt   整型,记录此船闸正由大西洋往太平洋航行的船只  初值0。
MutexA     信号量,对PtoAcount互斥  初值1
MutexB     信号量,对AtoPcount互斥  初值1
Lock        信号量  初值1

太平洋到大西洋的船:
P(mutexA);
PtoAcnt =PtoAcnt+1;
if PtoAcnt = = 1
 then P(Lock);
V(mutexA);

P(mutexA)
PtoAcnt=PtoAcnt-1;
if PtoAcnt = = 0;
 then V(Lock);
V(mutexA);

大西洋到太平洋的船:
P(mutexB);
AtoPcnt:=AtoPcnt+1;
if AtoPcnt = =1;
 then P(Lock);
V(mutexB);

P(mutexB)
AtoPcnt =AtoPcnt-1;
if AtoPcnt = =0;
 then V(Lock);
V(mutexB);
某银行有人民币储蓄业务,由 n个柜员负责。每个顾客进入银行后先取一个号,并且等着叫号。当一个柜台人员空闲下来,就叫下一个号。试用P,V操作正确编写柜台人员和顾客进程的程序。
答:
Semaphore counter;  //柜台数,初值为n
Semaphore waiting;  //当前等待的顾客数;初值为0;
Semaphore mutex;    //互斥对顾客号数的访问。初值为1

Customer_i
{
   int num;
   P(mutex);
   num = COSTOMER_NUM++;
   V(mutex);
   V(waiting);  //请求服务
   P(counter);  //等待叫号
   接受服务;
   离开;
   P(mutex);
   COSTOMER_NUM--;
   V(mutex);
}

Clerk_i
{
   While(true){
P(waiting);  //等待顾客
V(counter);  //叫号
服务;
}
}


--  作者:sun120409
--  发布时间:3/19/2008 7:51:00 PM

--  
非常感谢 ,正找这个呢,感谢LZ辛勤劳动

W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
47.363ms