IPC经典问题(读者写者,哲学家)
2019-02-24 本文已影响0人
小幸运Q
- 读者写者问题:
多个读进程可以同时共享资源,但不能和写进程共享。写进程之间相互排斥,只能独占资源。有两个需要上锁,一个是读进程的标记数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);
}
}
- 理发问题:
理发师在顾客来时理发,又来了新的客人则让他在空椅子上等,若溢出则走人。
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{
// 离开
}
}
- 哲学家就餐问题
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);
}
方法二: