美文网首页
IPC经典问题(读者写者,哲学家)

IPC经典问题(读者写者,哲学家)

作者: 小幸运Q | 来源:发表于2019-02-24 21:26 被阅读0次

    1. 读者写者问题:
      多个读进程可以同时共享资源,但不能和写进程共享。写进程之间相互排斥,只能独占资源。有两个需要上锁,一个是读进程的标记数count,一个是写进程与读进程和其他写进程的互斥。

    方法一:

    // 写进程之间相互互斥,
    count=0; // 读进程计数
    mutex=1;  // 保护count,访问互斥
    write=1  // 读者与写者互斥访问
    
    reader(){
      // 互斥修改count
      P(mutex);
      if count==0 then P(write); // 第一个进程读的时候阻塞写进程
      count++;   // 增加一个读进程
      V(mutex);     
    
      readfile;   // 执行读操作
      
      P(mutex);  // 互斥访问count变量
      count--;
      if(count==0)V(write);  // 当没有读进程的时候解锁写进程
    }
    
    writer(){
      while(1){
        P(writer);
        writing;
        V(writer);
      }
    }
    

    读进程不断读会使写进程无限等待饿死,所以需要改进:
    改进版:有进程请求写,则新的读进程被拒绝,待现有读进程完成后,立即让写进程进行,当无写进程时让读进程工作。

    此时需要两个锁,一个w锁在读进程修改count后阻塞所有写进程,但是在count完成后进行reading的时候释放,允许写进程/其他读进程进入下一步,但是。另一个rw锁负责在count==0之前屏蔽掉写进程的操作,让他能拿到w屏蔽其他后来的读进程但是必须等count==0所有前面的进程读完后才能继续。

    方法二:

    int count=0;
    mutex=1;    // 
    rw=1;    // 用于保证读者写者互斥访问文件
    w=1;     // 写者进程优先
    
    writer(){
      while(1){
        P(w);  // 无写进程
        P(rw);  // 互斥访问共享文件
        writing;   
        V(rw);  // 释放共享文件
        V(w);  //
      }
    }
    
    reader(){
      while(1){
        P(w);  // 无写者请求时进入
        P(mutex);
        if(count==0){P(rw);}  // 当第一个读共享文件时,组织写进程写
        count++;
        V(mutex);
        V(w); // 释放w锁,此时写进程可以争夺该锁,将其他读进程甩在后面,但受制于rw锁,必须等先来的读进程都退出后才能继续写。
    
        reading;
    
        P(mutex);
        count--;
        if(count==0){V(rw);}  // 允许写进程写
        V(mutex);
      }
    }
    

    1. 理发问题:
      理发师在顾客来时理发,又来了新的客人则让他在空椅子上等,若溢出则走人。
    customers=0;
    barbers=0;
    wait=15;  // 15个空椅子
    void barber(){
      while(T){
        P(customers); // 开始理发
        wait--;
        V(barber); // 空闲barber
      }
    }
    
    void customer(){
      if(wait<CHAIRS){
        wait++;
        V(customers); // 唤醒customer队列中的等待进程
        P(barbers);
        // 开始理发
      }
      else{
       // 离开
      }
    }
    

    1. 哲学家就餐问题
      5名哲学家坐成环,每个哲学家之间放一个筷子,当哲学家饥饿的时候会先后拿起两只筷子拼成一双筷子。与左右邻居是互斥访问。

    方法一:

    chopstick[5]={1};
    Pi(){
      do{
        P(chopstick[i]);
        P(chopstick[(i+1)%5]);
        eat;
        V(chopstick[i]);
        V(chopstick[(i+1)%5]);
        think;    
      }while(1);
    }
    

    方法二:

    
    

    相关文章

      网友评论

          本文标题:IPC经典问题(读者写者,哲学家)

          本文链接:https://www.haomeiwen.com/subject/vfapyqtx.html