生产者-消费者问题(The producer-consumer problem)

本文介绍了生产者-消费者问题,通过记录型信号量、AND信号量和管程三种方式来解决进程同步问题。内容包括缓冲池的描述、信号量机制、互斥信号量与资源信号量的使用,以及AND信号量和管程的概念与应用。
摘要由CSDN通过智能技术生成

(注:参考教材:计算机操作系统第四版 西安电子科技大学出版社)

          问题描述:一群生产者进程在生产产品,并将这些产品提供给消费者去消费。为了使生产者进程与消费者进程能够并发进行,在两者之间设置一个具有n个缓冲区的缓冲池,生产者进程将产品放入一个缓冲区中;消费者可以从一个缓冲区取走产品去消费。尽管所有的生产者进程和消费者进程是以异方式运行,但它们必须保持同步:当一个缓冲区为空时不允许消费者去取走产品,当一个缓冲区满时也不允许生产者去存入产品。

            解决方案我们这里利用一个一个数组buffer来表示这个n个缓冲区的缓冲池,用输入指针和输出指针+1来表示在缓冲池中存入或取出一个产品。由于这里的缓冲池是循环缓冲的,故应把in和out表示成:in = ( in +1 ) % n (或把out表示为 out = ( out +1 ) % n )当( in +1) % n= out的时候说明缓冲池满,in = out 则说明缓冲池空。在这里还要引入一个整型的变量counter(初始值0),每当在缓冲区存入或取走一个产品时,counter +1或-1。那么问题的关键就是,把这个counter作为临界资源处理,即令生产者进程和消费者进程互斥的访问它。              

       首先解释一下信号量(Semaphores)机制。这是荷兰学者Dijkstra在1965年提出的一种有效的进程同步工具。Dijkstra定义的整型信号量是一个用于表示资源数目的整型量,不同于一般的整型量,它除了初始化以外只能通过两个标准的原子操作(Atomic Operation)waits(S)和signal(S)来访问。很长时间以来这两个操作分别被称为P、V操作。wait和signal操作描述如下:

wait(S){

        while (S <= 0); //无可用资源
        S-- ;
}

signal(S){

        S-
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值