1. 程式人生 > >程序同步互斥經典題之消費者與生產者問題

程序同步互斥經典題之消費者與生產者問題

問題背景:有兩個程序分別為消費者程序和生產者程序,對同一個臨界資源進行訪問,生產者不斷地將生產的產品加入快取區,而消費者不斷地消費快取區中的資源,利用訊號量實現兩個程序的同步和互斥。

問題分析:在生產者往快取區中加入產品的時候,需要兩個訊號量,一個是互斥訊號量,使得在生產者往快取裡放產品的時候其他程序不能對臨界資源進行操作,另一個訊號量是指示快取區是否已滿的訊號量,從而判斷生產者能否往快取區加入產品;而消費者從快取區中消費資源的時候,也需要兩個訊號量,一個訊號量是互斥訊號量,使得消費者在從快取區中取產品的時候其他程序不能對臨界資源進行操作,另外一個訊號量是指示快取區是否空,從而判斷消費者能否對快取區進行操作。

由以上分析,可知在該問題中共需要三個訊號量,一個是用於互斥的訊號量mutux=1;一個是用於指示快取區空位置數目的empty=N;另外一個是指示快取區填滿位置的訊號量full=0;

從而,可以該問題可以有以下解決辦法:


那麼,從上面可以看出,用於同步的訊號量一定是位於不同程序中,用於互斥的訊號量一定是位於同一個程序中。

下面我們來分析一個例題,如下:


在這個例題中,水桶只有三個,井和缸只能容納一個桶進出,並且缸只能容納十桶水:

所以 1.對井的操作需要加互斥關係

  2.對缸的操作需要加互斥關係

  3.記錄桶數目的訊號量

          4.指示缸滿和缸空的訊號量

因此,我們設定以下訊號量:mutux1=1;  mutux2=0;  empty=10;  full=0;  count=3;

那麼,這個問題可以通過以下演算法解決:


相關推薦

程序同步互斥經典消費者生產者問題

問題背景:有兩個程序分別為消費者程序和生產者程序,對同一個臨界資源進行訪問,生產者不斷地將生產的產品加入快取區,而消費者不斷地消費快取區中的資源,利用訊號量實現兩個程序的同步和互斥。 問題分析:在生產者往快取區中加入產品的時候,需要兩個訊號量,一個是互斥訊號量,使得在生產者

程序同步互斥經典問題(一)生產者-消費者問題

問題描述: 生產者-消費者問題,也叫做快取繫結問題(bounded-buffer),是一個多程序同步問題。 即有兩個程序:製造少和消費者,共享一個固定大小的快取 製造商的工作是製造一段資料,放進快取,如此重複。 消費者一次消費一段資料

作業系統5————程序同步經典問題:司機售票員&問題生產者消費者問題&哲學家進餐問題&讀者寫者問題

作業系統5————程序同步的經典問題:司機售票員&問題生產者消費者問題&哲學家進餐問題&讀者寫者問題 一. 目錄 二. 訊號量的簡單應用 1. 使用訊號量實現互斥 思路:設mutex為互斥訊號量,其初值為1,取值範圍為(-1,0,1)。

JAVA多執行緒——經典面試消費者生產者

用wait與notify、notifyAll 實現生產者與消費者 關於多執行緒的生產者與消費者有多種方式實現。目前用學過的wait、notifyAll來實現。程式碼: public class ThreadTest6 { static class

寬搜經典二——8數碼難題+康托展開

col out number ini 它的 proc == pty font 寬搜的定義在上次寬搜一中已講,現在直接看跟本題有關的”康托展開“。 什麽是”康托展開“?其實就是寬搜中實現其主要思想的一個工具——已經考察過的狀態就不再考察。 解釋:X=a[n]*(n-1)!+

作業系統(8)程序--同步互斥介紹;同步問題的三種解決方案:禁用硬體中斷、基於軟體、更高階抽象

文章目錄 1. 背景 2. 同步問題的一個例子 3. 同步問題的初步解決方案 1. 方法一 禁用硬體中斷 2. 方法二 基於軟體的同步辦法 3. 方法三 更高階的抽象方法

Python多程序,同步互斥,訊號量,鎖補充上一篇文章

from multiprocessing import Event,Process from time import sleep def wait_event1(): print("1想操作臨界區資源") e.wait() print("1開始操作臨界區資源",e.is_set()

[作業系統]複習四 程序 同步互斥 死鎖

程序和程式的本質區別在於動態和靜態特徵 系統中感知程序的唯一實體是PCB(程序控制塊,process control block) 程序和執行緒的區別: 程序是執行中的程式,一個程序中包含若干執行緒,它們共享程序所擁有的資源。在OS中,程序是分配資源的基本單位,執行緒

程序同步經典問題2——哲學家就餐問題

出處:<<mordern operating system>> by Andrew S. Tanenbaum In 1965, Dijkstra posed and solved a synchronization problem he calle

程序同步互斥——不死鎖哲學家問題

一、問題分析 二、概要設計 (1)利用程序併發執行原理,採用奇數號哲學家先拿左叉子,偶數號哲學家先拿右叉子的演算法解決哲學家就餐問題。 (2)利用java中Swing技術將哲學家就餐的活動過程用可檢視形化介面表示出來 三、程式碼實現: Philosopher類

面試常見sizeofstrlen的區別

     前段時間一直在忙論文和專利的事情,沒時間去看一些c++/資料結構等筆試面試要用的知識,雖說做科研一直用的是c語言,但是平時用的哪些知識太狹隘了,主要集中在一些聚類演算法上面,並沒有多少時間去探討一些c++/c底層的一些東西,現在馬上要找工作了,著手看了一些東西,現

消費者生產者---LinkedList方式模擬

move nal lin class sleep ons 使用 sys 移除 采用LinkedList數據結構方式來模擬消費者與生產者模型,小Demo import java.util.LinkedList; public class MyQueue {

消費者生產者模型--wait( )和notify( )方法

生產者與消費者 wait()方法 notify()方法 notifyAll()方法 生產者與消費者模型 wait()方法 方法wait()

多執行緒的等待喚醒機制消費者生產者模式

/** * 等待喚醒之生產者和消費者模型 * 生成者: 建立和新增資料的執行緒 * 消費者: 銷燬和刪除資料的執行緒 * 問題1: 生成者生成資料過快, 消費者消費資料相對慢,不接收資料了, 會造成資料丟失 * 問題2: 消費者消費資料過快, 生成者生成資料相對慢,不傳送資料了, 會造成資料被重複讀取

Kafka JavaApi中消費者生產者的配置

檔案目錄如下: 1.ConsumerDemo配置 package com.course.test; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.c

消費者生產者模式的概念

str 需要 rand threading 是把 consumer bsp odin span 生產者與消費者模型,其實是把一個需要進程通信的問題 分開考慮 生產者,只需要王隊列裏存任務 消費者,只需要從隊列裏取任務 多線程版生產者與消費者模式 # -*-

經典程序同步互斥問題——生產者消費者問題

問題描述:生產者——消費者問題是指有兩組程序共享一個環形的緩衝池,一組稱為生產者,一組稱為消費者。緩衝池是由若干個大小相等的緩衝區組成,每個緩衝區可以容納一個產品。生產者程序不斷的將產品放入緩衝池中,消費者不斷將產品從緩衝池中取出。核心:生產者——消費者問題,既存在著程序同步

程序同步互斥經典問題二

讀者/寫者問題 問題描述: 有兩組併發程序:讀者和寫者,共享一組資料區 要求: 允許多個讀者同時進行讀操作 不允許讀者、寫著同時進行操作 不允許多個寫著同時進行操作 解答如下:

經典程序同步互斥習題總結

基礎知識導引 臨界資源       在作業系統中,程序是佔有資源的最小單位(執行緒可以訪問其所在程序內的所有資源,但執行緒本身並不佔有資源或僅僅佔有一點必須資源)。但對於某些資源來說,其在同一時間只能被一個程序所佔用。這些一次只能被一個程序所佔用的資源就是所謂的臨界

有關程序同步互斥經典問題

1生產者消費者問題 1.1使用二元訊號量解決無限緩衝區的生產者消費者問題 //使用二元訊號量解決無限緩衝區的生產者消費者問題 int count = 0; //count為緩衝區中的資料項個數 BinSem s = 1, delay = 0; //s為二元訊號量,控制生產者和消費