码迷,mamicode.com
首页 > 系统相关 > 详细

进程同步——生产者、消费者问题

时间:2019-12-07 12:11:48      阅读:405      评论:0      收藏:0      [点我收藏+]

标签:释放   idt   出现   生产者消费者问题   mamicode   wait   out   sem   rod   

进程同步是对多个相关进程在执行次序上进行协调,使并发执行的多个进程之间按照一定的规则共享系统资源。

1、生产者消费者问题:

生产者、消费者问题生产者生产产品放入缓冲区中,消费者从缓冲区中取出产品去消费。不允许消费者从空缓冲区中取产品,也不允许生产者向已经满了的缓冲区添加产品。

技术图片

 

 2、过程描述:

生产者:

void producer(){
    while(1)
    {
      while(counter==n);//缓冲池已满,不再执行后面的操作 
      buffer[in]=nextp;//将生产出来的产品放入缓冲池
      in=(in+1)%n;//指针后移
      counter++;    
    }
 
} 

消费者:

void consumer(){
    while(1)
    {
      while(counter==0);//缓冲池为空,不再执行后面的操作
      nextc=buffer[out];//取出一件产品
      out=(out+1)%n;//指针后移 
      counter--; 
    }
} 

如果不对生产者和消费者进程加以控制会出现不同的结果 (有正确的有错误的),即进程的不可再现性,这是由于进程失去了封闭性引起的。

3、进程同步(信号量机制):

(1)使用wati()和signal()操作来实现对临界资源的访问。

semaphone mutex=1;
Pa(){
    while(1){
        wait(mutex);//进入区 
        临界区;//访问临界资源的代码 
        signal(mutex);//退出区 
        剩余区; //其他部分 
    }
} 

(2)信号量机制解决进程同步问题:

生产者:

int n=0,out=0;
item buffer[n];
semaphore mutex=1,empty=n,full=0;//缓冲池一个,空缓冲区n个,满缓冲区0个
void producer)(){
    while(1){
        wait(empty);//先对缓冲区执行p操作,如果empty执行之前为0,则阻塞,不必在执行后面的
        wait(mutex);//减缓冲池
        buffer[in]=nextp;//将生产出来的产品放入缓冲池
        in=(in+1)%n;//指针后移
        signal(mutex);//释放资源,v操作 
        signal(full);    
    }
} 

消费者:

int n=0,out=0;
item buffer[n];
semaphore mutex=1,empty=n,full=0;//缓冲池一个,空缓冲区n个,满缓冲区0个
void consumer(){
    while(1){
        wait(full);//先对缓冲区执行p操作,如果full执行之前为0,则阻塞,不必在执行后面的
        wait(mutex);//减缓冲池
        buffer[in]=nextp;//将消费的产品放入缓冲池
        out=(out+1)%n;//指针后移
        signal(mutex);//释放资源,v操作 
        signal(full);        
        }
}  

其中,mutex信号量保证了消费者和生产者对缓冲池的互斥访问,即在消费者(或生产者)释放资源之前, 消费者(或者生产者)不能再利用缓冲池。

(3)信号量值的意义:

例如:设某一个信号量的初始值为1,进行一次p操作后变为0,此时,已经没有资源了,但是没有进程处于阻塞;

           进行第二次操作后,变为-1,表示已经没有资源了,并且另外一个进程处于阻塞状态;

           初始值1表示可用资源数量。

 

进程同步——生产者、消费者问题

标签:释放   idt   出现   生产者消费者问题   mamicode   wait   out   sem   rod   

原文地址:https://www.cnblogs.com/zhai1997/p/11999992.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!