• 操作系统(生产者、消费者问题)


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

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

  • 相关阅读:
    园友五一快乐
    silverlight 2.0 入门教程(三)
    AJXA控件示例之   Accordion
    LINQ学习入门教程(一)
    泛型学习笔记
    梆定一个方法并把数据库中的值作为参数
    翻译IP地址转换成IP Number并得到国家
    vs 2005中解决找不到模板项
    silverlight 入门学习(二)
    最近的学习计划
  • 原文地址:https://www.cnblogs.com/zhai1997/p/11999992.html
Copyright © 2020-2023  润新知