以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 操作系统原理 』  (http://bbs.xml.org.cn/list.asp?boardid=63)
----  [求助]PV操作控制两组进程的疑问  (http://bbs.xml.org.cn/dispbbs.asp?boardid=63&rootid=&id=41557)


--  作者:Maxwin_
--  发布时间:12/24/2006 2:57:00 PM

--  [求助]PV操作控制两组进程的疑问
有一个文件F供进程共享,现把这些进程分成A B两组,规定同一组的进程可以同时进行读; 但当有A组(或B组)在读时就不允许另一组进行读。
//貌似有个过桥问题也是如此
不知道分析的是否正确,同时求解决方法。
//以下是书上的答案:
readA {
    P(SAB);
    CA ++;
    if (CA == 1) P(SB);    //无意义
    V(SAB);

    read F;

    P(SAB);
    CA --;
    if (CA == 0) V(SB);
    V(SAB);
}

readB {
    P(SAB);
    CB ++;
    if (CB == 1) P(SA);
    V(SAB);

    read F;

    P(SAB);
    CB --;
    if (CB == 0) V(SA);
    V(SAB);
}

但是当A B两组进程同时进行时,SA和SB并没有什么作用。可能出现以下情况造成A B进程在同时读
A1先要求读,B1紧接着也要读:

A1: P(SAB);    //申请成功,继续
B1: P(SAB);    //进入SAB等待队列
A1: CA++; ...
    V(SAB);    //释放SAB,唤醒B1进程
B1: CB++; ...
    V(SAB);
//以下造成两组都在读。
A1: read F;
B1: read F;
=================================
我做改进如下:
readA {
    P(SA);
    P(SAB);
    CA ++;
    if (CA == 1) P(SB);    //阻塞B组进程
    V(SAB);
    V(SA);

    read F;

    P(SAB);
    CA --;
    if (CA == 0) V(SB);    //唤醒B组进程
    V(SAB);
}

readB {
    P(SB);
    P(SAB);
    CB ++;
    if (CB == 1) P(SA);
    V(SAB);
    V(SB);

    read F;

    P(SAB);
    CB --;
    if (CB == 0) V(SA);
    V(SAB);
}

但这个按如下步骤会造成死锁:
A1: P(SA);    //成功,继续
B1: P(SB);    //成功
    P(SAB);    //成功
    CB++;
    if(CB == 1) P(SA); //阻塞,等待V(SA)唤醒
A1: P(SAB); //阻塞,等待V(SAB),死锁...

=================================
交换P(SAB) 和 P(SA), P(SB)的位置同样会有死锁。
readA {
    P(SAB);
    P(SA);
    CA ++;
    if (CA == 1) P(SB);    //阻塞B组进程
    V(SAB);
    V(SA);

    read F;

    P(SAB);
    CA --;
    if (CA == 0) V(SB);    //唤醒B组进程
    V(SAB);
}

readB {...
按如下步骤:
A1: P(SAB); //成功;
    P(SA); //SUCCESS
    ... P(SB);
    V(SAB);
    V(SA);
    read F;

B1: P(SAB); //成功
    P(SB); //被A1阻塞中,等待V(SB);
A1: P(SAB); //阻塞,以下A1读完要唤醒SB,结果又被 B1的P(SAB)阻塞,死锁


--  作者:Maxwin_
--  发布时间:12/24/2006 3:06:00 PM

--  
SAB: 互斥信号量
SA, SB用于A B两组进程的同步信号量
CA, CB用于记录各组读进程数的共享变量

SAB = SA = SB = 1;
CA = CB = 0;


--  作者:Maxwin_
--  发布时间:12/24/2006 4:10:00 PM

--  
想了下,这样应该没问题了
SAB: 用于A B两组互斥的信号量
SA:A组对CA进行操作的互斥信号量
SB:B组对CB进行操作的互斥信号量
CA, CB用于记录当前各组中在读进程

SAB = SA = SB = 1;
CA = CB = 0;

readAi {
 P(SAB);
 P(SA);
 CA ++;
 IF (CA == 1) P(SB);
 V(SA);
 V(SAB);

 READ F;

 P(SA);
 CA --;
 IF (CA == 0) V(SB);
 V(SA);
}

readBi {
 P(SAB);
 P(SB);
 CB ++;
 IF (CB == 1) P(SA);
 V(SB);
 V(SAB);

 READ F;

 P(SB);
 CB --;
 IF (CB == 0) V(SA);
 V(SB);
}


--  作者:小南航
--  发布时间:1/5/2007 4:47:00 PM

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