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

2019-02-24  本文已影响0人  小幸运Q

  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);
}

方法二:


上一篇下一篇

猜你喜欢

热点阅读