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

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

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表示可用资源数量。

猜你喜欢

转载自www.cnblogs.com/zhai1997/p/11999992.html