不小草 2023-11-05 16:08 采纳率: 50%
浏览 3

操作系统PV操作问题

今有一个文件F供进程共享,现把这些进程分为A、B两组,规定同组的进程可以同时读文件F;但当有A组(或B组)的进程在读文件F时就不允许B组(或A组)的进程读文件F。试用P、V操作(记录型信号量)来进行管理。

Semaphore Fmutex=1,Asem=0,Bsem=0;
int c1=c2=0;
Cobegin
Pa(i=1,2,3...){
  P(Asem)
  c1++;
  if(c1==1)P(Fmutex)
  V(Asem)
  reading F;
  P(Asem)
  c1--;
  if(c1==0)V(Fmutex)
  V(Asem)
}
Pb(i=1,2,3...){
  P(Bsem)
  c2++;
  if(c2==1)P(Fmutex)
  V(Bsem)
  reading F;
  P(Bsem)
  c2--;
  if(c2==0)V(Fmutex)
  V(Bsem)
}
coend

请问可以写成这样吗?

Semaphore Fmutex=1,Asem=0,Bsem=0;
int c1=c2=0;
Cobegin
Pa(i=1,2,3...){
  P(Asem)
       if(c1==0)P(Fmutex)
       c1++;
  V(Asem)
  reading F;
  P(Asem)
  c1--;
  if(c1==0)V(Fmutex)
  V(Asem)
}
Pb(i=1,2,3...){
  P(Bsem)
  if(c2==0)P(Fmutex)
       c2++;
  V(Bsem)
  reading F;
  P(Bsem)
  c2--;
  if(c2==0)V(Fmutex)
  V(Bsem)
}
coend

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-05 18:46
    关注

    【以下回答由 GPT 生成】

    上面的代码可以进行一些修改来解决该问题。修改的方案如下:

    Semaphore Fmutex = 1, Asem = 0, Bsem = 0;
    int c1 = c2 = 0;
    int numA = 0, numB = 0;
    
    Cobegin
    Pa(i = 1, 2, 3...) {
        P(Asem)
        if(c1 == 0 && numB == 0) P(Fmutex)
        c1++;
        numA++;
        V(Asem)
    
        reading F;
    
        P(Asem)
        c1--;
        numA--;
        if(c1 == 0 && numA == 0) V(Fmutex)
        V(Asem)
    }
    
    Pb(i = 1, 2, 3...) {
        P(Bsem)
        if(c2 == 0 && numA == 0) P(Fmutex)
        c2++;
        numB++;
        V(Bsem)
    
        reading F;
    
        P(Bsem)
        c2--;
        numB--;
        if(c2 == 0 && numB == 0) V(Fmutex)
        V(Bsem)
    }
    coend
    

    上面的修改主要针对的是numAnumB的添加,用来记录A组和B组进程当前的数量。在进程A中,添加了numA的自增和自减操作,并在判断是否允许进入临界区时,判断同时满足c1为0(表示A组所有进程都不在读取F)和numB为0(表示没有B组进程在读取F);在进程B中同样进行了相似的修改。这样可以确保当A组或B组中有进程在读取F时,对方组的进程不能读取F,从而实现了所需的要求。

    需要注意的是,上面的修改只在代码层面上实现了要求的功能,实际运行时还需要保证进程的安全同步和互斥,因此在实际应用中可能需要更多的控制代码和同步机制来确保正确性。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 11月5日

悬赏问题

  • ¥100 如何寻找到黑客帮助,愿意付丰厚的酬劳
  • ¥15 java代码写在记事本上后在cmd上运行时无报错但又没生成文件
  • ¥15 关于#python#的问题:在跑ldsc数据整理的时候一直抱这种错误,要么--out识别不了参数,要么--merge-alleles识别不了参数(操作系统-linux)
  • ¥15 PPOCRLabel
  • ¥15 混合键合键合机对准标识
  • ¥100 现在不懂的是如何将当前的相机中的照片,作为纹理贴图,映射到扫描出的模型上
  • ¥15 魔霸ROG7 pro,win11.息屏后会显示黑屏,如图,如何解决?(关键词-重新启动)
  • ¥15 有没有人知道这是哪里出了问题啊?要怎么改呀?
  • ¥200 C++表格文件处理-悬赏
  • ¥15 Windows Server2016本地登录失败