1. 程式人生 > >作業系統---生產者與消費者總結

作業系統---生產者與消費者總結

一、生產者消費者問題所牽涉的概念: 
程序:具有一定獨立功能的程式關於某個資料集合上的一次執行活動,是系統進行資源非配和排程的一個獨立單位。
程序同步: 程序之間的一種直接的協同工作關係,是一些程序相互合作,共同完成一項任務。
程序互斥:系統中,許多程序常常要共享資源,而這些資源往往要求排他性的使用,因此,各程序之間互斥使用這些資源。
臨界區:系統中一些資源一次只允許一個程序使用,這類資源稱為臨界資源或共
享變數;在程序中訪問臨界資源的那一段程式稱為臨界區。

訊號量:把互斥的關鍵含義抽象成訊號量,用於解決同步互斥問題。 PV操作:p操作是申請一個資源,減1操作;v操作是釋放一個資源,加1操作。 

二、分析同步互斥關係

,確定訊號量(自己的疑惑)

問題描述:生產者P生產產品,一次可放一個產品;消費者Q取產品,一次可取一個產品。
1. 一個生產者,一個消費者,一個緩衝區
同步問題:

P程序不能往滿的緩衝區放產品,設定訊號量empty,初值為0,用於指示空緩衝區數目。 
Q程序不能從空的緩衝區取產品,設定訊號量full,初值為0,用
於知識滿緩衝區數目。
互斥問題:?沒有互斥,看第二個例子

 解決流程:。。。。。

問:為什麼一個生產者,一個消費者和一個緩衝區的問題中沒有考慮互斥?     

見解:因為這個問題中只有一個緩衝區,只能存放一個產品。對於生產者,生產一個產品,存入緩衝區,標誌緩
衝區滿,再判斷產品是否被取走;對於消費者,只有當緩衝區滿,才能取產品,再標誌緩衝區為空;兩者沒有共享資料,所以不用考慮互斥。
2. 多個生產者,多個消費者,一個緩衝區 
例子:

http://blog.163.com/[email protected]/blog/static/1282741962009112944845415/

同步問題:P程序不能往滿的緩衝區放產品,設定訊號量empty,初值為0,用於指示空緩衝區數目。
 Q程序不能從空的緩衝區取產品,設定訊號量full,初值為0,用於知識滿緩衝區數目。
互斥問題: 此時,緩衝區為臨界資源,因為生產者或者消費者之間均對其有競爭,設定mutex為互斥訊號量。
解決流程:。。。。。
3、多個生產者,多個消費者,多個緩衝區
 此時多個緩衝區構成緩衝池,設共有N個緩衝區。
同步問題:P程序不能往滿的緩衝區放產品,設定訊號量empty,初值為0,
用於指示空緩衝區數目。 Q程序不能從空的緩衝區取產品,設定訊號量full,初值為0,用
於知識滿緩衝區數目。
互斥問題: 此時,緩衝區為臨界資源,因為生產者或者消費者之間均對其有
競爭,設定mutex為互斥訊號量。
另外,設定i、j初值為0,i用於指示空緩衝區,j用於指示有產品的滿緩衝區。
解決流程:。。。。。。

注意問題:
問:若顛倒兩個P,V操作是否可以?
見解:P()是把x這個訊號量進入臨界區, V()是把y這個訊號量離開臨界區。 P順序不可變,V可
變。 進入臨界區的話,其他執行緒再申請進入同一個訊號量的臨界區就會block,等待。。 1)P順
序不可逆原因:
對於消費者,這裡先P(full)是為了確保full不是0(即確保可以消費),不然先P(mutex)的
話,如果full為0,就會一直停在這裡,等待消費。然後生產者就一直在等待進入mutex而無法進
行生產,導致死鎖。 對於生產者也是如此。 2)V可逆原因: 對生產者,因為已經生產完了,所
以先退出mutex臨界區或者對full的數目加一,都不會產生影響。
設full=0,此時消費者無法進入full臨界區,如果先V(full),那麼full數目加1,消費者可以
進入full臨界區,但是metux還被生產者使用,所以消費者要等到生產者V(mutex)才能進入,沒
有任何影響。 對於消費者也是如此
問:生產者、消費者會訪問到同一個緩衝區、緩衝池嗎?
見解:兩者可能會訪問到同一個緩衝池,但絕不會訪問到同一個緩衝區。因為緩衝池中可以有多
個緩衝區,兩者可以對其中不同的緩衝區操作;但同一個緩衝區,只能有一個進行操作,否則,
若生產者放入產品,還未標記full,時間片到,而消費者進入緩衝區,取走了產品,生產者再標
記為full,就出錯了! 
三、總結
生產者和消費者問題從單個到多個從同步問題到互斥問題,只有真正分析清楚他們之間的同步
互斥變數,才能做到不放生死鎖,本文首先通過對問題的分析,抽象出同步變數、互斥變數,再
進行操作,使問題得到解決,並對其中所提問題做出解釋。

相關推薦

作業系統---生產者消費者總結

一、生產者消費者問題所牽涉的概念:  程序:具有一定獨立功能的程式關於某個資料集合上的一次執行活動,是系統進行資源非配和排程的一個獨立單位。程序同步: 程序之間的一種直接的協同工作關係,是一些程序相互

作業系統-使用訊號量實現生產者消費者(C++實現)

常用函式: HANDLE WINAPI CreateSemaphore(                  _In_opt_  LPSECURITY_ATTRIBUTES lpSemaphoreAttributes   _In_      LONG lInitialCoun

Java學習(7):同步問題之生產者消費者的問題

con runnable pop pre 標記 this auth style about 生產者生產饅頭,消費者消費饅頭。一個籃子,生產者往籃子中放饅頭,消費者從籃子中取饅頭。 /** * 這是一個籃子類 * * @author xcx * @time 2017

生產者消費者問題

bject i++ sig notify ktr nal 消費者 默認 等待 共享數據:產品product(該變量的狀態是可變的) 一個存放產品的容器 生產者(一個或者多個):共同訪問共享數據product,並可能進行修改更新操作 消費者(一個或者多個):共同訪問共享數據p

java生產者消費者模式

食物 會有 實現 條件 3.2 釋放 tac lee trace 前言: 生產者和消費者模式是我們在學習多線程中很經典的一個模式,它主要分為生產者和消費者,分別是兩個線程, 目錄 一:生產者和消費者模式簡介 二:生產者和消費者模式的實現 聲明:本例來源於java經典著作:《

生產者消費者

bsp ++ 生產 ons sin range taxi max continue 1 package main 2 3 import ( 4 "fmt" 5 "gitee.com/ha666/golibs" 6 "git

python:生產者消費者模型

target 代碼 所有 name body style pos 方便 tar 1,生產者與消費者模型的矛盾在於數據供需的不平衡 import time import random from multiprocessing import Queue from multip

生產者消費者的Java實現

pri version per hello security pac rds 生成 thread 首先創建maven工程,需要引入的包: <dependencies> <dependency> <groupId>

廣播模式下的生產者消費者fanout模式

生成 ack word 需要 bin 隊列 highlight time host 生產者 #coding=utf-8 import pika import sys connection = pika.BlockingConnection(pika.ConnectionP

使用Python多線程實現生產者消費者模型

watermark vpd 51cto 實現 this read sleep get DG 1,我所使用到的python版本 2,下面編寫具體的實現過程 import threadingimport time import Queue #首先生成一個隊列q =Queue.

053 kafka自帶的生產者消費者測試

list png con keep produce 添加數據 測試 linux consumer 1.命令    2.啟動生產者   bin/kafka-console-producer.sh --topic beifeng --broker-list linux-ha

Boost lockfree deque 生產者消費者多對多線程應用

cas 生產者 pointers data thread prev included clas signed   boost庫中有一個boost::lockfree::queue類型的 隊列,對於一般的需要隊列的程序,其效率都算不錯的了,下面使用一個用例來說明。   程序

Java並發編程(4)--生產者消費者模式介紹

定義 一點 ava empty 釋放 nal cond 場景 inter 一、前言   這種模式在生活是最常見的,那麽它的場景是什麽樣的呢? 下面是我假象的,假設有一個倉庫,倉庫有一個生產者和一個消費者,消費者過來消費的時候會檢測倉庫中是否有庫存,如果沒有了則等待生產,如

生產者消費者 程式碼實現 java

        首先,我利用忙測試寫出了第一次版本的程式碼       1 package How; 2 //自寫程式碼 缺陷 無法完全實現pv操作執行緒處於忙測試狀態 3 public class bin_1_1 4 { 5

生產者消費者案例

手頭有兩個人(也就是兩個類),一個做存操作,一個做取操作,並且只有當存完或者取完方可進行令一個操作。以此達到迴圈輸出的存取操作。 第一步:先寫測試生產者類與消費者類 和 執行緒操作Msg類 //生產者 public class Product implements Runnable{

生產者-消費者問題

1.實驗目的 本實驗的目的是通過編寫和除錯一個解決生產者-消費者問題的簡單模擬程式,進一步深入理解課堂教學中講授的程序同步問題,以及用於解決同步問題的訊號量機制的基本思想,即通過研究程序同步和訊號量機制實現生產者消費者問題的併發控制,以便階段性的鞏固學習成果。 2.實驗內容以及概述 (1)概述

淺談Java簡單實現的生產者消費者問題

一、面對生產者和消費者的問題,首先我們得明白幾點: 生產者:生產資料;消費者:消費資料。消費者在沒有資料可供消費的情況下,不能消費;生產者在原資料沒有被消費掉的情況下,不能生產新資料。假設,資料空間只有一個。實際上,如果實現了正確的生產和消費,則,兩個執行緒應該是嚴格的交替執行。synchronized關鍵

java簡單實現非同步佇列:使用生產者消費者模型

package com.yunshouhu; import java.util.concurrent.*; //java簡單實現非同步佇列:使用生產者與消費者模型 public class MyAsynQueue { // http://www.importnew.com/22519.h

執行緒操作案例---生產者消費者

class Producer implements Runnable{ //通過Runnable實現多執行緒 private Info info = null; //儲存Info引用 public Producer(Info info) { this.info = info; }

SpringBoot+RabbitMq實現生產者消費者的多種情景

一、新建maven工程:springboot-rabbitmq 二、引入springboot和rabbitmq的依賴  <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3