计算机操作系统 2.5对经典进程的同步问题 的简单解释

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40712616/article/details/78916514

首先简单说明以下P.V.操作的作用

P操作:信号量– –;
V操作:信号量++;

生产者—消费者问题:

empty:表示空缓冲区的数目,其初值为缓冲池的大小n,表示消费者已把缓冲池中全部产品取走,有n个空缓冲区可用。

full:表示满缓冲区的数目(即产品数目),其初值为0,表示生产者尚未把产品放入缓冲池,有0个满缓冲区可用。

mutex:互斥信号量,表示进程对缓冲池的互斥使用,及任何时间点内只能由一个进程访问缓冲池。

int in=0,out=0;  //生产数,消费数
item buffer[n];  //缓冲区数
semaphore mutex=1, empty=n, full=0;  
/***************************************
生产者
***************************************/
void producer(){
while(1){
P(empty);  //空资源减一
P(mutex);  //该进程对缓冲区进行操作
buffer[in] = nextp; //给第in个缓冲区写数据
in = (in + 1) % n;  //in+1,如果超出范围返回第一个
V(mutex); //终止进程对缓冲区的占用
V(full);  //非空闲资源加一
}
}
/***************************************
消费者
***************************************/
void consumer(){
while(1){
P(full);  //非空资源减一
P(mutex);  //该进程对缓冲区进行操作
nextc= buffer[out]; //给第out个缓冲区写数据
out = (out+ 1) % n;  //out+1,如果超出范围返回第一个
V(mutex); //终止进程对缓冲区的占用
V(empty);  //空闲资源加一
}
}

哲学家进餐问题

chopstick:筷子是临界资源所以设置筷子为信号
量,又因为有5只筷子所以定义信号量数组,切互斥所以初始值设置为1,此外哲学家(进程)对筷子的操作相同。

semaphore chopstick[5]={1,1,1,1,1};
void activity(){
while(1){
P(chopstick[i]); //使用第i只筷子
P(chopstick[(i+1)%5]); //使用第i+1只筷子
//eat
V(chopstick[i]); //释放第i只筷子
Vchopstick[(i+1)%5]);  //释放第i+1只筷子
}
}

读者-作者问题

readcount:共享变量,记录当前正在读数据集的读进程数目,初值为0。
rmutex :读互斥信号量,表示读进程互斥地访问共享变量readcount,初值为1.
wmutex:写互斥信号量,表示写进程与其它进程(读、写)互斥地访问数据集,初值为1.

注:只要有一个Reader进程在读,便不允许Writer进程写。所以,当Readcount=0及无Reader进程在读时,Reader进程才需要执行Wait(Wmutex)操作。若wait(Wmutex)操作成功,Reader进程便可去读,相应的,做Readcount+1操作。

semaphore rmutex = 1, wmutex = 1;
int readcount = 0;
/*************************
读者
**************************/
void reader(){
while(1){
P(rmutex);//多一个读者,并不允许在多一个读者
if(readcount == 0) P(wmutex);//第一位读者阻止写者进程
readcount++;
V(rmutex);//允许在多一个读者
// perfrom read operation
P(rmutex);//少一个读者,并不允许在少一个读者
readcount--;
if(readcount == 0) V(wmutex);//最后一个读者开放写者进程
V(rmutex);//允许在少一个读者
}
}
/*************************
作者
**************************/
void writer(){
while(1){
P(wmutex);//开始写作,读者等待
V(wmutex);//可以让读者读
}
}

猜你喜欢

转载自blog.csdn.net/qq_40712616/article/details/78916514