日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

生产者和消费者代码———操作系统_操作系统基础15-生产者消费者问题

發(fā)布時間:2024/10/8 windows 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 生产者和消费者代码———操作系统_操作系统基础15-生产者消费者问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在上一篇操作系統(tǒng)基礎(chǔ)14提到通過信號量解決生產(chǎn)者消費者問題。本篇來詳細說說操作系統(tǒng)中的經(jīng)典問題-生成者消費者問題

生產(chǎn)者消費者問題 (Producer-consumer problem)

該問題是一個著名的同步問題。通俗的描述是:一群生產(chǎn)者進程正在生產(chǎn)產(chǎn)品,并將這些產(chǎn)品提供給消費者進程去消費。為使生產(chǎn)者和消費者能夠并發(fā)執(zhí)行。在兩者之間設(shè)置了一個公共區(qū)域,生產(chǎn)者進入公共區(qū)域生產(chǎn)產(chǎn)品并放入其中。消費者進入公共區(qū)域并取走產(chǎn)品進行消費。

當一個生產(chǎn)者進入公共區(qū)域生產(chǎn)產(chǎn)品時,其他生產(chǎn)者和消費者不能同時進入公共區(qū)域生產(chǎn)產(chǎn)品或消費產(chǎn)品。當一個消費者進入公共區(qū)域消費產(chǎn)品的時候,其它消費者和生產(chǎn)者不能同時進入該區(qū)域消費產(chǎn)品或生產(chǎn)產(chǎn)品。也就是說,任意時刻,最多只允許一個生產(chǎn)者或一個消費者進入公共區(qū)域。即生產(chǎn)者和消費者必須互斥的訪問公共區(qū)域。

當產(chǎn)品放滿公共區(qū)域時,生產(chǎn)者必須等待,使消費者先消費。當公共區(qū)域為空時,消費者必須等待,使生產(chǎn)者先生產(chǎn)。即在公共區(qū)域為空或為滿時,生產(chǎn)者或消費者在執(zhí)行時要滿足一定的先后順序。即生產(chǎn)者與消費者對公共區(qū)域的訪問必須同步

根據(jù)以上描述,可以得出如下結(jié)論:

(1)生產(chǎn)者與生產(chǎn)者之間存在競爭即互斥關(guān)系

(2)消費者與消費者之間存在競爭即互斥關(guān)系

(3)生產(chǎn)者與消費者之間存在互斥與同步關(guān)系

以上三個結(jié)論可以概括為:三種關(guān)系,兩種角色,一個臨界區(qū)。即“三二一”規(guī)則

生產(chǎn)者消費者問題也稱有限緩沖問題(Bounded-buffer problem),從多線程同步來看,該問題描述了共享固定大小緩沖區(qū)的兩個線程——即所謂的“生產(chǎn)者”和“消費者”——在實際運行時會發(fā)生的問題。生產(chǎn)者的主要作用是生成一定量的數(shù)據(jù)放到緩沖區(qū)中,然后重復此過程。與此同時,消費者也在緩沖區(qū)消耗這些數(shù)據(jù)。該問題的關(guān)鍵就是要保證生產(chǎn)者不會在緩沖區(qū)滿時加入數(shù)據(jù),消費者也不會在緩沖區(qū)中空時消耗數(shù)據(jù)。
.
要解決該問題,就必須讓生產(chǎn)者在緩沖區(qū)滿時休眠(要么干脆就放棄數(shù)據(jù)),等到下次消費者消耗緩沖區(qū)中的數(shù)據(jù)的時候,生產(chǎn)者才能被喚醒,開始往緩沖區(qū)添加數(shù)據(jù)。同樣,也可以讓消費者在緩沖區(qū)空時進入休眠,等到生產(chǎn)者往緩沖區(qū)添加數(shù)據(jù)之后,再喚醒消費者。通常采用進程間通信的方法解決該問題。緩沖區(qū)是臨界資源,必須互斥的訪問,所以如果解決方法不夠完善,則容易出現(xiàn)死鎖的情況。出現(xiàn)死鎖時,兩個線程都會陷入休眠,等待對方喚醒自己。該問題也能被推廣到多個生產(chǎn)者和消費者的情形。

有限緩沖問題

問題分析

該問題需要注意的幾點:

  • 在緩沖區(qū)為空時,消費者不能再進行消費
  • 在緩沖區(qū)為滿時,生產(chǎn)者不能再進行生產(chǎn)
  • 在一個線程進行生產(chǎn)或消費時,其余線程不能再進行生產(chǎn)或消費等操作,即保持線程間的同步
  • 注意條件變量與互斥鎖的順序

資源可以使用

由于前兩點原因,因此需要保持線程間的同步,即一個線程消費(或生產(chǎn))完,其他線程才能進行競爭CPU,獲得消費(或生產(chǎn))的機會。對于這一點,可以使用條件變量進行線程間的同步:生產(chǎn)者線程在product之前,需要wait直至獲取自己所需的信號量之后,才會進行product的操作;同樣,對于消費者線程,在consume之前需要wait直到?jīng)]有線程在訪問共享資源(緩沖區(qū)),再進行consume的操作,之后再解鎖并喚醒其他可用阻塞線程。

等待使用資源

通用實現(xiàn)

也就是上一篇中的通過信號量機制(P、V操作)解決

生產(chǎn)者和消費者進程共享以下數(shù)據(jù)結(jié)構(gòu):

int n;? ? ? ? ? //緩沖池有n個緩沖區(qū),每個緩沖區(qū)可存一個數(shù)據(jù)項semaphore? mutex = 1;? ? //信號量 mutex 提供緩沖池訪問的互斥要求,并初始化為1semaphone? empty = n; //信號量 empty 表示空的緩沖區(qū)數(shù)量semaphone? full = 0? ? ? //信號量 full 表示滿的緩沖區(qū)數(shù)量

生產(chǎn)者(producer)消費者(consumer)進程結(jié)構(gòu):

producer(){ while(1){ 生成一個產(chǎn)品; P(empty); //消耗一個空閑緩沖區(qū) P(mutex); 把產(chǎn)品放入緩沖區(qū); V(mutex); V(full) //增加一個產(chǎn)品 }}consumer(){ while(1){ P(full); //消耗一個產(chǎn)品 P(mutex); 從緩沖區(qū)取出一個產(chǎn)品; V(mutex); V(empty); //增加一個空閑緩沖區(qū) 使用產(chǎn)品; }}

生產(chǎn)者消費者進程結(jié)構(gòu)

互斥的實現(xiàn)是在同一個進程中進行的一對PV操作。

同步的實現(xiàn)是在兩個進程中進行的,在一個進程中執(zhí)行P操作,在另一個進程中執(zhí)行V操作。

能否改變P、V操作的順序

若此時緩沖區(qū)內(nèi)已經(jīng)放滿產(chǎn)品,則 empty = 0,full = 0

則生產(chǎn)者進程執(zhí)行① 使mutex變?yōu)?,再執(zhí)行②,由于已沒有空閑緩沖區(qū),因此生產(chǎn)者被阻塞。由于生產(chǎn)者被阻塞,因此切換回消費者進程。消費者進程執(zhí)行③,由于mutex為0,即生產(chǎn)者還沒釋放對臨界資源的“鎖”,因此消費者也被阻塞。這就造成了生產(chǎn)者等待消費者釋放空閑緩沖區(qū),而消費者又等待生產(chǎn)者釋放臨界區(qū)的情況,生產(chǎn)者和消費者循環(huán)等待被對方喚醒,出現(xiàn)“死鎖”。

同樣的,如何緩沖區(qū)中沒有產(chǎn)品,即 empty = n,full = 0

按③④①的順序執(zhí)行也會發(fā)生死鎖

因此,實現(xiàn)互斥P操作一定要在實現(xiàn)同步P操作之后。V操作不會導致進程阻塞,因此兩個V操作順序可以交換。

小結(jié)

生成者和消費者問題是一個互斥、同步的綜合問題。隱含著兩對同步關(guān)系。有時候是消費者需要等待生產(chǎn)者生成,有時候是生成者等待消費者消費,這是兩個不同的“一前一后問題”,因此也需要設(shè)置兩個同步信號量。

總結(jié)

以上是生活随笔為你收集整理的生产者和消费者代码———操作系统_操作系统基础15-生产者消费者问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。