1. 程式人生 > >生產者消費者模型和讀者寫者模型

生產者消費者模型和讀者寫者模型

消費者模型
生產者-消費者問題是一個經典的程序同步問題,生產者程序在生產產品,並將這些產品提供給消費者程序去消費。為使生產者程序與消費者程序能併發執行,在兩者之間設定一個具有N個緩衝區的緩衝池,生產者程序將它所生產的產品放入一個緩衝區;消費者程序可從一個緩衝區中取走產品去消費。當緩衝區滿的時候生產者就不能放,當緩衝區空的時候消費者就不能取。
以下是我在Linux下實現的生產者消費者模型:
這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

讀者寫者模型
讀者與寫者問題的特點在於讀者不使緩衝區數量改變,並且多個讀者可以同時讀取緩衝區資訊,而寫者與寫者、寫者與讀者只能互斥訪問緩衝區的相同資料。對於相同的資料項,多個讀者之間可以同時訪問;對於相同的資料項,多個寫者或寫者與讀者之間不能同時訪問。

兩個模型之間的區別
從兩個模型的原理中可以看出,兩個模型最大的區別在於在生產者消費者模型中,生產者與生產者是互斥關係,消費者和消費者是互斥關係,生產者和消費者之間是互斥與同步關係;而在讀者寫者模型中,讀者和讀者沒有關係,寫者和寫者是互斥關係,讀者和寫者是互斥與同步關係。

對讀者和寫者模型的深入探究

實現此模型的操作:

int count_Reader=0;    //記錄正在讀的讀者數
int mutex_Count_Reader=1;    //用於讀者之間互斥訪問count_Reader 
int mutex_Reader_Writer=1;  //用於讀者與寫者之間的互斥和寫者與寫者之間的互斥
Reader { while(ture) { p( mutex_Count_Reader ); if( 0 == count_Reader ) //如果當前的讀者數為0,就要先去檢查一下是不是寫者正在寫 p( mutex_Reader_Writer); //如果寫者正在寫,讀者就會阻塞在此處 ++ count_Reader; v( mutex_Count_Reader); 進行讀操作; p( mutex_Count_Reader ); - - count_Reader; if
( 0 == count_Reader ) //如果讀者數已經為0,說明所有讀者都讀完了,寫者可以寫啦 v( mutex_Reader_Writer); v( mutex_Count_Reader ); } } Writer { while(true) { p( mutex_Reader_Writer); 進行寫操作 v( mutex_Reader_Writer); } }

這其實是一個讀者優先的演算法。
設想一下,如果此時有多個讀者和寫者都在等待,而此時又是讀者正在讀,讀者就一直佔著mutex_Reader_Writer訊號量,等待的讀者可以進去讀,但寫者就要等所有的讀者讀完後才能寫,這就會造成寫者飢餓的問題。解決方法是設定寫者優先。

寫者優先
寫者優先演算法要解決的是在上面的基礎上,當讀者和寫者同時等待時,讓寫者先進去寫。

int count_Reader=0;    //記錄正在讀的讀者數
int count_Writer=0;    //記錄正在等待的寫者數
int mutex_Count_Reader=1;    //讀者之間互斥訪問count_Reader
int mutex_Count_Writer=1;    //寫者之間互斥訪問count_Writer
int mutex_Reader_Writer=1;  //讀者與寫者之間的互斥
int mutex_write=1;   //寫者與寫者之間的互斥

Reader
{
    P( mutex_Count_Writer );    //如果有寫者在等待,就阻塞讀者程序,這樣就能保證寫者優先       
    V( mutex_Count_Writer );    
    P( count_Reader );    
    if( 0 == count_Reader )  
        p( mutex_Reader_Writer);  //如果寫者正在寫,讀者就會阻塞在此處
    ++ count_Reader;  
    V( mutex_Count_Reader);    

    進行讀操作;         

    P( mutex_Count_Reader ); 
    - - count_Reader;   
    if( 0 == count_Reader )  
        v( mutex_Reader_Writer);  
    V( mutex_Count_Reader );  
}
Writer  
{  
    P( mutex_Count_Writer );              
    if( 0 == count_Writer )  
        p( mutex_Reader_Writer);  
    ++count_Writer;  
    V( mutex_Count_Writer);    

    寫操作;    

    P( mutex_Count_Writer );    
    - -count_Writer;    
    if( 0 == count_Writer )      
        V( mutex_Reader_Writer); 
    V( mutex_Count_Writer ); 
}  

相關推薦

生產者消費者模型讀者模型

消費者模型 生產者-消費者問題是一個經典的程序同步問題,生產者程序在生產產品,並將這些產品提供給消費者程序去消費。為使生產者程序與消費者程序能併發執行,在兩者之間設定一個具有N個緩衝區的緩衝池,生產者

Linux中執行緒的同步與互斥、生產者消費模型讀者問題、死鎖問題

執行緒的同步與互斥 執行緒是一個存在程序中的一個執行控制流,因為執行緒沒有程序的獨立性,在程序內部執行緒的大部分資源資料都是共享的,所以在使用的過程中就需要考慮到執行緒的安全和資料的可靠。不能因為執行緒之間資源的競爭而導致資料發生錯亂,也不能因為有些執行緒因為

Java實現生產者消費者問題與讀者問題

1、生產者消費者問題     生產者消費者問題是研究多執行緒程式時繞不開的經典問題之一,它描述是有一塊緩衝區作為倉庫,生產者可以將產品放入倉庫,消費者則可以從倉庫中取走產品。解決生產者/消費者問題的方法可分為兩類:(1)採用某種機制保護生產者和消費者之間的同步;(2)在生產者和消費者之間建立一個管道。第一

讀者模型生產者消費者模型

讀者寫者模型 讀者寫者訪問一塊共享的資料區域,讀者對共享資源進行讀訪問,寫者對共享記憶體進行寫操作。在多處理器系統中,運去多個讀者同時訪問共享記憶體,而寫者是排他性的,每次只能有一個寫者去寫入資料。在使用讀寫鎖時,一個讀寫鎖只能同時一個讀者和多個寫者,但不能同

讀者模型(概念&與生產消費者的區別¥讀優先順序問題)

    1 #include<stdio.h>                                                        2 #include<pthread.h>   3                   4 int book=0;      

Linux---讀者模型

一 怎麼理解讀者寫者模型 讀者寫者問題就是在一些程式中,對某些資源的訪問會存在兩種可能的情況:一種就是寫操作,寫操作是可以獨佔資源的,具有排他性;另一種情況就是讀操作,在讀操作中可以有多個操作併發的去訪問某種資源,它的訪問方式是共享的。這種從對檔案的讀寫操作中

例說讀者模型

什麼是讀者寫者模型 讀者和寫者模型是作業系統中的一種同步與互斥機制,它與消費者和生產者模型類似,但也有不同的地方,最明顯的一個特點是在讀者寫者模型中,多個多者之間可以共享“倉庫”,讀者與讀者之間採用了並行機制;而在消費者和生產者模型中,消費者只能有一個獨佔

作業系統實驗——讀者模型優先)

# 作業系統實驗——讀者寫者模型(寫優先) [個人部落格主頁](http://www.vfdxvffd.cn) 參考資料: [Java實現PV操作 | 生產者與消費者](https://www.cnblogs.com/TQCAI/p/7700354.html) ## 讀者寫者 對一個公共資料進行寫入和讀

多執行緒設計模式:第三篇 - 生產者-消費者模式鎖模式

一,生產者-消費者模式         生產者-消費者模式是比較常見的一種模式,當生產者和消費者都只有一個的時候,這種模式也被稱為 Pipe模式,即管道模式。      &nb

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

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

linux系統生產者-消費者讀者-,哲學家就餐 C語言實現

#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> #include <unistd.h> #define NUM 15 int que

作業系統程序同步三大問題:生產者消費者,哲學家進餐,讀者問題

對於非科班出身的我,,,最近自學作業系統做了一些程序同步的筆記,寫出來,希望能對大家有幫助,我是參照哈工大張英濤老師的視訊和湯子瀛的書寫的: 程序與程序之間的合作機制: 訊號量機制!!! 訊號量是一種資料結構。 訊號量的值與相應資源的使用情況有關。 訊號量的值僅由原語P、V

生產者消費者 & 讀者

生產者消費者 對於生產者消費者這個問題,我們可以用生活中一個簡單的例子來說明: 桌子上有個盤子,一個人往盤子裡面放蘋果,一個人從盤子裡面拿走蘋果,放蘋果的人相當於生產者,拿走蘋果的人相當於消費者,而

讀者模型--同步問題

場景描述: 寫者負責再資源池中寫 讀者負責從資源池中讀資料 同一時間內不允許多個寫者進行寫,但允許多個讀者進行讀 當寫者和讀者都準備佔用資源池時,寫者優先佔用資源池(此問題描述的時寫者優先順序高的場景) 建立模型 一個交易場所(資源池),

剖析Elasticsearch集群系列第一篇 Elasticsearch的存儲模型操作

推薦 arch 變更 git 排序。 _id 包含 doc 現在 剖析Elasticsearch集群系列涵蓋了當今最流行的分布式搜索引擎Elasticsearch的底層架構和原型實例。 本文是這個系列的第一篇,在本文中,我們將討論的Elasticsearch的底層存儲模型及

nn.moduleList Sequential由來、用法例項 —— 網路模型

對於cnn前饋神經網路如果前饋一次寫一個forward函式會有些麻煩,在此就有兩種簡化方式,ModuleList和Sequential。其中Sequential是一個特殊的module,它包含幾個子Module,前向傳播時會將輸入一層接一層的傳遞下去。ModuleList也是一個特殊的modul

【Linux】讀模型-讀

在編寫多執行緒的時候,有⼀種情況是⼗分常⻅的。那就是,有些公共資料修改的機會⽐較少。相⽐較改寫,它們讀的機會反⽽⾼的多。通常⽽⾔,在讀的過程中,往往伴隨著查詢的操作,中間耗時很⻓。給這種程式碼段加鎖,會極⼤地降低我們程式的效率。那麼有沒有⼀種⽅法,可以專⻔處理這種多讀少寫的情況呢? 有,那就是讀寫鎖

多線程面試題系列(14):讀者問題繼 讀鎖SRWLock

線程面試題 oid out 讀者寫者問題 五個 lock val ref win7 在第十一篇文章中我們使用事件和一個記錄讀者個數的變量來解決讀者寫者問題。問題雖然得到了解決,但代碼有點復雜。本篇將介紹一種新方法——讀寫鎖SRWLock來解決這一問題。讀寫鎖在對資源進行保

操作系統中有關讀者問題

技術分享 http 有關 alt ima mage 讀者寫者 nbsp images 如下內存來至於現代操作系統的94頁: 操作系統中有關讀者寫者問題

讀者-問題”的優先算法實現

共享 代碼 申請 writer integer sha IT AC 書籍 轉自http://blog.csdn.net/zoudaokou2006/article/details/3966694讀者一寫者問題是一個用信號量實現的經典進程同步問題。在系統中,一個數據集( 如文