1. 程式人生 > >作業系統中生產者/消費者問題(一)

作業系統中生產者/消費者問題(一)

生產者/消費者是個典型的程序同步問題,只有生產者生產出來東西了,消費者才能消費

也就是說,生產者生成出來一個東西,然後通知消費者,(東西好了,快來拿吧),而消費者則檢視緩衝器裡面有沒有東西,若沒有則會通知生產者生產東西,這樣一個鐘相互合作的程序同步問題。

一、一個生產者,一個消費者,一個緩衝器

分析:

首先需要一個訊號量用於計數剩餘空的緩衝器的數量sp = 1。

需要一個存放資料的緩衝器buffer;

因為有兩個人(生產者,消費者)要清楚知道緩衝器的狀況(滿還是空),所以還需要一個訊號量sc = 0,用於說明空暫存器的個數。

int buffer;
Semaphore sp = 1,sc = 0;

process producer(void)
{
    while(1)
    { 
        {生產一個產品producer};
        p(sp);
        Buffer = product;
        v(sc);          //喚醒消費者
    }
}
process consumer(void)
{
    while(1)
    { 
        p(sc);
        {取走緩衝器中的產品};
        v(sp);        //喚醒生產者
        {消費該產品};
    }
}

二、一個生產者,一個消費者和n個緩衝器

這個和上面差不多,也是一個一個往緩衝器裡面放東西,生產者看到有緩衝器是空就會往裡面放東西,但還是一個一個放,所以只要修改上面程式將buffer改為buffer[k],然後k=(++k)%n,計數就行。

int buffer[n],k = 0, t = 0;
Semaphore sp = 1,sc = 0;

process producer(void)
{
    while(1)
    { 
        {生產一個產品producer};
        p(sp);
        Buffer[k] = product;
        k = (++k)%n;
       v(sc);          //喚醒消費者
    }
}

process consumer(void)
{
    while(1)
    { 
        p(sc);
        {取走緩衝器中的產品};
        t = (++t)%n;
        v(sp);        //喚醒生產者
        {消費該產品};
    }
}

大家先把上面理解清楚,明天再講稍微有一點難的情況!

相關推薦

作業系統生產者/消費者問題()

生產者/消費者是個典型的程序同步問題,只有生產者生產出來東西了,消費者才能消費 也就是說,生產者生成出來一個東西,然後通知消費者,(東西好了,快來拿吧),而消費者則檢視緩衝器裡面有沒有東西,若沒有則會

Java多執行緒程式設計生產者-消費者模式的詳解

生產者-消費者模式是一個經典的多執行緒設計模式,它為多執行緒的協作提供了良好的解決方案。在生產者-消費者模式中,通常有兩類執行緒,即若干個生產者執行緒和若干個消費者執行緒。生產者執行緒負責提交使用者請求,消費者執行緒負責處理使用者請求。生產者和消費者之間通過共享記憶體緩衝區

作業系統模擬生產者消費者問題

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #i

作業系統生產者-消費者問題

Producer - Consumer Problem --(about process cooperation) data description: buffer[ ]   生產者和消費者的共享緩衝佇列; BUF_SIZE  緩衝佇列的全部可用長度; in        

kafka生產者消費者API

actor 成功 edm icc per class 持久化 spout payment 使用idea實現相關API操作,先要再pom.xml重添加Kafka依賴: <dependency> <groupId>

Python生產者消費者模型

ssi png 問題 import odi rand com 共享數據 守護 了解知識點: 1、守護進程: ·什麽是守護進程: 守護進程其實就是一個‘子進程’,守護即伴隨,守護進程會伴隨主進程的代碼運行完畢後而死掉 ·為何用守護進程: 當該子進程內的代碼在父進程代碼運行完畢

【Python爬蟲學習筆記10】多線程生產者消費者模式

其中 因此 問題 共享 and 生產者消費者模式 共享問題 由於 接下來 在多線程編程中,最經典的模式是生產者消費者模式。其中,生產者是專門用來生產數據的線程,它把數據存放在一個中間變量中;而消費者則從這個中間變量取出數據進行消費。由於生產者和消費者共享中間變量,這些變量大

java每日練------生產者消費者(執行緒)

import java.util.ArrayList; import java.util.List; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import

.netRabbitMQ生產者/消費者

  #region 伺服器配置資訊是配置再webconfig中 private static string _HostName = System.Configuration.ConfigurationManager.AppSettings["RabbitMQHostName"].ToString

作業系統——生產者-消費者問題

一、簡單生產者-消費者問題 問題描述:一組生產者程序和一組消費者程序共享一個初始為空、大小為 n 的緩衝區,只有緩衝區沒滿時,生產者才能把訊息放入到緩衝區,否則必須等待;只有緩衝區不為空時,消費者才能從中取出訊息,否則必須等待。由於緩衝區是臨界資源,它只允許一個生產者放入訊息,或者一個消費者從中取出訊息。

jni的執行緒, 同步以及生產者消費者模式

編譯環境centos6.×64 執行緒建立以及結束 #include <pthread.h> pthread_create (thread, attr, start_routine, arg) 連線和分離執行緒 pthrea

結合生活,剖析《生產者消費者模型》-java多執行緒(

  部落格園的園友們好,看部落格園上各位大佬的文章,已陪伴了我程式設計師職業的三年, 如今自己同樣希望能把自己從小白到菜鳥的成長過程分享給大家。不定期更新!!! 首先我本人智商不高,理解問題十分吃力,完全不屬於天才的行列,因此學習每一個知識 都喜歡刨根問底,結合生活,徹徹底底理解知識的本質! 進入正題,這篇文

python 生產者消費者 模式

生產者與消費者 模式 摘要: 最近一段時間,寫了一些生產者與消費者模型, 特此此文 作為總結. 文中總結了不同的 生產者與消費者的情況. 一個生產者, 多個消費者,與一個生產者,多個消費者 的程式設計模式. 一. 生產者與消費者 在軟體開發的過程中,經常碰

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

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

挑戰408——作業系統(11)——多角度看生產者消費者問題

對於訊號量的使用,主要是如何選擇訊號量和如何安排pv操作在程式中的位置。下面來分析一下經典的生產者消費者問題。教材的說法有點過於籠統了,我就用自己的語言來重新描述一遍。 生產者——消費者問題 問題描述:有兩組程序共享一個環形的緩衝池,其中的一組程序稱為生產者,另

執行緒同步wait()和notify()的使用(用生產者消費者模式解釋)

wait()和notify()是什麼 雖然我們一般在多執行緒中使用wait和notify的方法,但其實它們是不屬於Thread類的,他們是Object類中的方法,我們先來看一下API中的解釋: 1、notify():喚醒在此物件監視器上等待的單個執行緒。 2、n

作業系統實驗】python程式碼模擬實現生產者消費者模式

相比C/C++指標的折磨,本人更喜歡python程式碼的簡潔,廢話不多說: from multiprocessing import Process, JoinableQueue import time,

python多執行緒的共享資料,通過queue來實現,內有生產者消費者經典模型的示例程式碼

queue:佇列,即先進先出,它有以下幾個方法: 1.判斷佇列的大小:size() 2.向佇列中新增:put() 3.向佇列中取出:get() 4.如果佇列規定了長度,用來判斷是否滿了:full() import threading,time import queu

二十、使用Condition重寫waitnotify生產者消費者模型案例

//生產者 public class PushTarget implements Runnable{ private Tmail tmail;//銷售平臺 public PushTarget(Tmail tmail) { this.tmail = tmail; } @Over

作業系統實驗之程序管理——生產者消費者問題

實驗要求 選擇一個經典的同步問題(生產者-消費者問題、讀者-寫者問題、哲學家就餐問題等),並模擬實現該同步問題的程序管理; 採用訊號量機制及相應的P操作、V操作; 應避免出現死鎖; 能夠顯示相關的狀態。 我這裡選擇的是生產者消費者問題,使用java實現