zoukankan      html  css  js  c++  java
  • 操作系统(生产者、消费者问题)

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

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

  • 相关阅读:
    设计手稿: 搜索引擎
    软件版本介绍
    VS2012中使用编译的Qt-5.1.1静态库开发程序
    POJ2236(并查集)
    Java关键字this的用法总结
    paip.提升用户体验-----c++ gcc 命令在notepad++扩展中的配置..
    MySQL基本查询语句练习
    [置顶] 提升代码内外部质量的22条经验
    mysql 数据库复制表 create table city1 like city;
    两个脚本
  • 原文地址:https://www.cnblogs.com/zhai1997/p/11999992.html
Copyright © 2011-2022 走看看