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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

关于生产者与消费者模型的概念

發(fā)布時(shí)間:2024/5/14 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于生产者与消费者模型的概念 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

之前在閱讀PCI 和PCIe spec中老是能看到 producer and consumer model,一知半解的,具體細(xì)節(jié)也沒有去研究了。以為不甚重要,可以暫時(shí)先略過(guò),也不會(huì)影響后續(xù)的對(duì)協(xié)議的學(xué)習(xí)和研究。 后來(lái),又在操作系統(tǒng)的進(jìn)程概念中有看到類似的概念。最后決定,還是去學(xué)習(xí)一下相關(guān)理論吧。

在網(wǎng)絡(luò)上找到一些文章,以下是一篇轉(zhuǎn)載:

------------------------------------------------------------------------------轉(zhuǎn)載-----------------------------------------------------------------------------------------------------------------

今天打算來(lái)介紹一下“生產(chǎn)者/消費(fèi)者模式”,這玩意兒在很多開發(fā)領(lǐng)域都能派上用場(chǎng)。由于該模式很重要,打算分幾個(gè)帖子來(lái)介紹。今天這個(gè)帖子先來(lái)掃盲一把。如果你對(duì)這個(gè)模式已經(jīng)比較了解,請(qǐng)?zhí)^(guò)本掃盲帖,直接看下一個(gè)帖子(關(guān)于該模式的具體應(yīng)用)?。
  看到這里,可能有同學(xué)心中犯嘀咕了:在四人幫(GOF)的23種模式里面似乎沒聽說(shuō)過(guò)這種嘛!其實(shí)GOF那經(jīng)典的23種模式主要是基于OO的(從書名《Design Patterns: Elements of Reusable Object-Oriented Software》就可以看出來(lái))。而Pattern實(shí)際上即可以是OO的Pattern,也可以是非OO的Pattern的。

  ★簡(jiǎn)介?
  言歸正傳!在實(shí)際的軟件開發(fā)過(guò)程中,經(jīng)常會(huì)碰到如下場(chǎng)景:某個(gè)模塊負(fù)責(zé)產(chǎn)生數(shù)據(jù),這些數(shù)據(jù)由另一個(gè)模塊來(lái)負(fù)責(zé)處理(此處的模塊?是廣義的,可以是類、函數(shù)、線程、進(jìn)程等)。產(chǎn)生數(shù)據(jù)的模塊,就形象地稱為生產(chǎn)者?;而處理數(shù)據(jù)的模塊,就稱為消費(fèi)者?。
  單單抽象出生產(chǎn)者和消費(fèi)者,還夠不上是生產(chǎn)者/消費(fèi)者模式。該模式還需要有一個(gè)緩沖區(qū)處于生產(chǎn)者和消費(fèi)者之間,作為一個(gè)中介。生產(chǎn)者把數(shù)據(jù)放入緩沖區(qū),而消費(fèi)者從緩沖區(qū)取出數(shù)據(jù)。大概的結(jié)構(gòu)如下圖。

  為了不至于太抽象,我們舉一個(gè)寄信的例子(雖說(shuō)這年頭寄信已經(jīng)不時(shí)興,但這個(gè)例子還是比較貼切的)。假設(shè)你要寄一封平信,大致過(guò)程如下:
  1、你把信寫好——相當(dāng)于生產(chǎn)者制造數(shù)據(jù)
  2、你把信放入郵筒——相當(dāng)于生產(chǎn)者把數(shù)據(jù)放入緩沖區(qū)
  3、郵遞員把信從郵筒取出——相當(dāng)于消費(fèi)者把數(shù)據(jù)取出緩沖區(qū)
  4、郵遞員把信拿去郵局做相應(yīng)的處理——相當(dāng)于消費(fèi)者處理數(shù)據(jù)

  ★優(yōu)點(diǎn)?
  可能有同學(xué)會(huì)問了:這個(gè)緩沖區(qū)有什么用捏?為什么不讓生產(chǎn)者直接調(diào)用消費(fèi)者的某個(gè)函數(shù),直接把數(shù)據(jù)傳遞過(guò)去?搞出這么一個(gè)緩沖區(qū)作甚?
  其實(shí)這里面是大有講究的,大概有如下一些好處。
  ◇解耦
  假設(shè)生產(chǎn)者和消費(fèi)者分別是兩個(gè)類。如果讓生產(chǎn)者直接調(diào)用消費(fèi)者的某個(gè)方法,那么生產(chǎn)者對(duì)于消費(fèi)者就會(huì)產(chǎn)生依賴(也就是耦合)。將來(lái)如果消費(fèi)者的代碼發(fā)生變化,可能會(huì)影響到生產(chǎn)者。而如果兩者都依賴于某個(gè)緩沖區(qū),兩者之間不直接依賴,耦合也就相應(yīng)降低了。
  接著上述的例子,如果不使用郵筒(也就是緩沖區(qū)),你必須得把信直接交給郵遞員。有同學(xué)會(huì)說(shuō),直接給郵遞員不是挺簡(jiǎn)單的嘛?其實(shí)不簡(jiǎn)單,你必須得認(rèn)識(shí)誰(shuí)是郵遞員,才能把信給他(光憑身上穿的制服,萬(wàn)一有人假冒,就慘了)。這就產(chǎn)生和你和郵遞員之間的依賴(相當(dāng)于生產(chǎn)者和消費(fèi)者的強(qiáng)?耦合)。萬(wàn)一哪天郵遞員換人了,你還要重新認(rèn)識(shí)一下(相當(dāng)于消費(fèi)者變化導(dǎo)致修改生產(chǎn)者代碼)。而郵筒相對(duì)來(lái)說(shuō)比較固定,你依賴它的成本就比較低(相當(dāng)于和緩沖區(qū)之間的?耦合)。
  ◇支持并發(fā)(concurrency)
  生產(chǎn)者直接調(diào)用消費(fèi)者的某個(gè)方法,還有另一個(gè)弊端。由于函數(shù)調(diào)用是同步的(或者叫阻塞的),在消費(fèi)者的方法沒有返回之前,生產(chǎn)者只好一直等在那邊。萬(wàn)一消費(fèi)者處理數(shù)據(jù)很慢,生產(chǎn)者就會(huì)白白糟蹋大好時(shí)光。
  使用了生產(chǎn)者/消費(fèi)者模式之后,生產(chǎn)者和消費(fèi)者可以是兩個(gè)獨(dú)立的并發(fā)主體(常見并發(fā)類型有進(jìn)程和線程兩種,后面的帖子會(huì)講兩種并發(fā)類型下的應(yīng)用)。生產(chǎn)者把制造出來(lái)的數(shù)據(jù)往緩沖區(qū)一丟,就可以再去生產(chǎn)下一個(gè)數(shù)據(jù)。基本上不用依賴消費(fèi)者的處理速度。
  其實(shí)當(dāng)初這個(gè)模式,主要就是用來(lái)處理并發(fā)問題的。
  從寄信的例子來(lái)看。如果沒有郵筒,你得拿著信傻站在路口等郵遞員過(guò)來(lái)收(相當(dāng)于生產(chǎn)者阻塞);又或者郵遞員得挨家挨戶問,誰(shuí)要寄信(相當(dāng)于消費(fèi)者輪詢)。不管是哪種方法,都挺土的。
  ◇支持忙閑不均
  緩沖區(qū)還有另一個(gè)好處。如果制造數(shù)據(jù)的速度時(shí)快時(shí)慢,緩沖區(qū)的好處就體現(xiàn)出來(lái)了。當(dāng)數(shù)據(jù)制造快的時(shí)候,消費(fèi)者來(lái)不及處理,未處理的數(shù)據(jù)可以暫時(shí)存在緩沖區(qū)中。等生產(chǎn)者的制造速度慢下來(lái),消費(fèi)者再慢慢處理掉。
  為了充分復(fù)用,我們?cè)倌眉男诺睦觼?lái)說(shuō)事。假設(shè)郵遞員一次只能帶走1000封信。萬(wàn)一某次碰上情人節(jié)(也可能是圣誕節(jié))送賀卡,需要寄出去的信超過(guò)1000封,這時(shí)候郵筒這個(gè)緩沖區(qū)就派上用場(chǎng)了。郵遞員把來(lái)不及帶走的信暫存在郵筒中,等下次過(guò)來(lái)時(shí)再拿走。
  費(fèi)了這么多口水,希望原先不太了解生產(chǎn)者/消費(fèi)者模式的同學(xué)能夠明白它是怎么一回事。然后在下一個(gè)帖子中,我們來(lái)說(shuō)說(shuō)如何確定數(shù)據(jù)單元?。

  另外,為了方便閱讀,把本系列帖子的目錄整理如下:
  1、如何確定數(shù)據(jù)單元?
  2、隊(duì)列緩沖區(qū)?
  3、環(huán)形緩沖區(qū)?
  4、雙緩沖區(qū)?
  5、......


版權(quán)聲明?
本博客所有的原創(chuàng)文章,作者皆保留版權(quán)。轉(zhuǎn)載必須包含本聲明,保持本文完整,并以超鏈接形式注明作者編程隨想?和本文原始地址:

http://program-think.blogspot.com/2009/03/producer-consumer-pattern-0-overview.html


---------------------------------------------------------------------------------------以上為轉(zhuǎn)載內(nèi)容------------------------------------------------------------------------------------------


總結(jié)

以上是生活随笔為你收集整理的关于生产者与消费者模型的概念的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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