003. 生产者与消费者 - AND型信号量

-----------------------------

  - 涉及内容:

  - 2020/10/31

  - 识记生产者与消费者特征:
  
  - 1. 具有容器

  - 2. 生产者会使容器容量变小(将数据存放到容器中,使得容器容量变小)

  - 3. 消费者会使容器容量变大(将容器中的数据取出来,使得容器容量变大)

经典问题

题目如下:有两个进程:生产者进程和消费者进程共享一个初始为空、固定大小为 n 缓冲区,只有缓冲区没满时,生产者才能把消息放入到缓冲区,
否则必须等待。同时,只有缓冲区不空时,消费者才能从中取出消息,否则必须等待。由于缓冲区是临界资源,它只允许一个生产者放入消息,
或者一个消费者从中取出消息。

      - 应该了解内容:
      
      - 同步关系:进程之间存在依赖关系,即一个进程的执行需要依赖与其他进程的消息或者信号,从而唤醒该进程
      - 互斥关系:进程之间共享资源,但同一时刻只能有一个进程能够获取到资源,其他进程则需等待
      - p : 表示申请一个资源
      - v : 表示释放一个资源
      - AND信号量:一个进程需要获取多个临界资源方可执行任务,即同时满足多个条件才可执行任务

      - 析:生产者和消费者对于缓冲区的访问属于互斥关系,即缓冲区一次只能有一个进程在访问。同时,必须在生产者放入消息之后,
          消费者才能取出消息,彼此之间存在依赖关系,所以,两者也属于同步关系。    

      - 思路流程:
            producer:
                  1. 先要有一个消息
                  2. 判断缓冲区是否还有剩余空间,并且判断缓冲区是否被占用,空闲则进,被占用则等待 p(empty,mutex)
                  3. 下一步
                  4. 空闲情况下,将消息放入缓冲区 
                  5. 离开缓冲区,并且释放互斥信号量,缓冲区被中占用空间 + 1  v(mutex,full)
            consumer:
                  1. 判断是否有消息可取,即看缓冲区是否有空间被占用,并且判断缓冲区是否被占用,空闲则进,
                     被占用则等待  p(full,mutex)
                  2. 下一步
                  3. 空闲情况下,将消息从缓冲区中取出
                  4. 离开缓冲区,并且释放互斥信号量,缓冲区空闲空间 +1   v(mutex,empty)
                  5. 使用该消息
            
      - 参数说明:

      - mutex:互斥信号量,表示当前缓冲区状态,mutex = 1 即为缓冲区未被占用

      - empty:缓冲区容量信号量,表示当前缓冲区内空余的空间,初始值 empty = n ,表示当前缓冲区还有 n 个空余空间

      - full:缓冲区容量信号量,表示当前缓冲区内已被占用的空间,初始值 full = 0 ,表示当前缓冲区尚未存放消息      

      - buffer:缓冲区


semaphore mutex = 1 , empty = n , full = 0;

producer(){
      while(1) {
            producer an item in nextc;
            p(empty,mutex);
            put nextc to buffer;
            v(mutex,full);
      }
}

consumer () {
      while(1) {
            p(full,mutex);
            take an item from buffer;
            v(mutex,empty);
            consume the item;
      }
}
to be continued...
--------------------

不断修正,不断笔记,能力有限,若有不妥之处,望不吝指教。
--------------------------------------------------------
上一篇:喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水


下一篇:题(1)