• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-4  評論-40  文章-117  trackbacks-0

             



              “雙緩沖區(qū)”是一個應(yīng)用很廣的手法。該手法用得最多的地方想必是屏幕繪制相關(guān)的領(lǐng)域(主要是為了減少屏幕閃爍)。另外,在設(shè)備驅(qū)動和工控方面,雙緩沖也經(jīng)常被使用。不過今天要聊的,并不是針對上述的某個具體領(lǐng)域,而是側(cè)重于并發(fā)方面的同步/互斥開銷。另外提醒一下,雙緩沖方式和前面提到的隊列緩沖、環(huán)形緩沖是可以結(jié)合使用滴。

              ★為啥要雙緩沖區(qū)
              記得前幾天在介紹隊列緩沖區(qū)時,提及了普通隊列緩沖區(qū)的兩個性能問題:“內(nèi)存分配的開銷”和“同步/互斥的開銷”(健忘的同學(xué),先回去看看那個帖子復(fù)習(xí)一下)。“內(nèi)存分配的開銷”已經(jīng)在介紹環(huán)形緩沖區(qū)的時候解決了,而今天要介紹的雙緩沖區(qū),就是沖著同步/互斥的開銷來的。
              為了防止有人給咱扣上“過度設(shè)計”的大帽子,又得來一個事先聲明:只有當(dāng)同步或互斥的開銷非常明顯的時候,你才應(yīng)該考慮雙緩沖區(qū)的使用。否則的話,大伙兒還是老老實實用最基本、最簡單的隊列緩沖區(qū)吧。

              ★雙緩沖區(qū)的原理
              前面說了一通廢話,現(xiàn)在開始切入正題,說說具體實現(xiàn)。
              所謂“雙緩沖區(qū)”,故名思義就是要有倆緩沖區(qū)(簡稱A和B)。這倆緩沖區(qū),總是一個用于生產(chǎn)者,另一個用于消費者。當(dāng)倆緩沖區(qū)都操作完,再進(jìn)行一次切換(先前被生產(chǎn)者寫入的轉(zhuǎn)為消費者讀出,先前消費者讀取的轉(zhuǎn)為生產(chǎn)者寫入)。由于生產(chǎn)者和消費者不會同時操作同一個緩沖區(qū)(不發(fā)生沖突),所以就不需要在讀寫每一個數(shù)據(jù)單元的時候都進(jìn)行同步/互斥操作。順便提一下,這又一次展現(xiàn)了空間換時間的優(yōu)化思路。
              但是光有倆緩沖區(qū)還不夠。為了真正做到“不沖突”,還得再搞兩個互斥鎖(簡稱La和Lb),分別對應(yīng)倆緩沖區(qū)。生產(chǎn)者或消費者如果要操作某個緩沖區(qū),必須先擁有對應(yīng)的互斥鎖。補(bǔ)充一句:要達(dá)到“不沖突”的效果,其實可以有多種搞法,今天只是挑一個簡單的來聊。

              ★雙緩沖區(qū)的幾種狀態(tài)
              為了加深某些同學(xué)的理解,再描述一下雙緩沖區(qū)的幾種狀態(tài)。
              ◇倆緩沖區(qū)都在使用的狀態(tài)(并發(fā)讀寫)
              大多數(shù)情況下,生產(chǎn)者和消費者都處于并發(fā)讀寫狀態(tài)。不妨設(shè)生產(chǎn)者寫入A,消費者讀取B。在這種狀態(tài)下,生產(chǎn)者擁有鎖La;同樣的,消費者擁有鎖Lb。由于倆緩沖區(qū)都是處于獨占狀態(tài),因此每次讀寫緩沖區(qū)中的元素(數(shù)據(jù)單元)都不需要再進(jìn)行加鎖、解鎖操作。這是節(jié)約開銷的主要來源。
              ◇單個緩沖區(qū)空閑的狀態(tài)
              由于兩個并發(fā)實體的速度會有差異,必然會出現(xiàn)一個緩沖區(qū)已經(jīng)操作完,而另一個尚未操作完。不妨假設(shè)生產(chǎn)者快于消費者。
              在這種情況下,當(dāng)生產(chǎn)者把A寫滿的時候,生產(chǎn)者要先釋放La(表示它已經(jīng)不再操作A),然后嘗試獲取Lb。由于B還沒有被讀空,Lb還被消費者持有,所以生產(chǎn)者進(jìn)入發(fā)呆(Suspend)狀態(tài)。
              ◇緩沖區(qū)的切換
              接著上面的話題。
              過了若干時間,消費者終于把B讀完。這時候,消費者也要先釋放Lb,然后嘗試獲取La。由于La剛才已經(jīng)被生產(chǎn)者釋放,所以消費者能立即擁有La并開始讀取A的數(shù)據(jù)。而由于Lb被消費者釋放,所以剛才發(fā)呆的生產(chǎn)者會緩過神來(Resume)并擁有Lb,然后生產(chǎn)者繼續(xù)往B寫入數(shù)據(jù)。
              經(jīng)過上述幾個步驟,倆緩沖區(qū)完成了對調(diào),變?yōu)椋荷a(chǎn)者寫入B,消費者讀取A。

              ★可能的并發(fā)問題
              本來單個緩沖區(qū)的生產(chǎn)者/消費者問題就已經(jīng)是教科書的經(jīng)典問題了,現(xiàn)在搞出倆緩沖區(qū),所以就更加耗費腦細(xì)胞了。一不小心,就會搞出些并發(fā)的Bug,而且并發(fā)的Bug還很難調(diào)試和測試(這也就是為啥不要輕易使用該玩意兒的原因)。
              ◇死鎖的問題
              假如把前面介紹的操作步驟調(diào)換一下順序:生產(chǎn)者或消費者在操作完當(dāng)前的緩沖區(qū)之后,先去獲取另一個緩沖區(qū)的鎖,再來釋放當(dāng)前緩沖區(qū)的鎖。那會咋樣捏?
              一旦兩個并發(fā)實體同時處理完各自緩沖區(qū),然后同時去獲取對方擁有的鎖,那就會出現(xiàn)典型的死鎖(死鎖的詳細(xì)解釋參見“這里”)場景。它倆從此陷入萬劫不復(fù)的境地。

              ★應(yīng)用場景
              介紹完并發(fā)問題,按照本系列的慣例,最后再來介紹一下雙緩沖區(qū)在某些場合的應(yīng)用。
              ◇用于并發(fā)線程
              在線程方式下,首先要考慮的是緩沖區(qū)的類型:到底用隊列方式還是環(huán)形方式。這方面的選擇依據(jù)在介紹環(huán)形緩沖區(qū)的時候已經(jīng)闡述過了,此處不再啰嗦(省去不少口水)。
              另一個需要注意的是,某些編程語言或者程序庫提供了的線程安全的緩沖區(qū)(比如JDK 1.5引入的ArrayBlockingQueue)。由于這種緩沖區(qū)會自動為每次的讀寫進(jìn)行同步/互斥,所以就把雙緩沖的優(yōu)勢抵消掉了。因此,大伙兒在進(jìn)行緩沖區(qū)選型的時候要避開這類緩沖區(qū)。
              ◇用于并發(fā)進(jìn)程
              在進(jìn)程間使用雙緩沖,先得考察不同IPC類型的特點。由于今天討論雙緩沖的目的是降低同步/互斥的開銷,對于那些已經(jīng)封裝了同步/互斥的IPC類型,就沒太大必要再去搞雙緩沖了(單憑這條就足以讓好多種IPC出局)。剩下的IPC類型中,比較適合用雙緩沖的主要是:共享內(nèi)存和文件。非常湊巧,這兩個玩意兒的特點和適用范圍在環(huán)形緩沖區(qū)的帖子里面也已經(jīng)介紹過了,俺又可以節(jié)省不少口水 :)
            版權(quán)聲明
            本博客所有的原創(chuàng)文章,作者皆保留版權(quán)。轉(zhuǎn)載必須包含本聲明,保持本文完整,并以超鏈接形式注明作者編程隨想和本文原始地址:
            http://program-think.blogspot.com/2009/04/producer-consumer-pattern-4-double.html


            posted on 2010-01-28 11:39 李陽 閱讀(2292) 評論(0)  編輯 收藏 引用
            国产欧美久久久精品| 青青热久久综合网伊人| 94久久国产乱子伦精品免费 | 日本亚洲色大成网站WWW久久| 久久A级毛片免费观看| 久久99热国产这有精品| 久久亚洲精品国产亚洲老地址| 亚洲精品成人久久久| 久久性生大片免费观看性| 国内精品久久人妻互换| 色婷婷综合久久久久中文一区二区| 伊人久久一区二区三区无码| 伊人久久大香线蕉无码麻豆| 亚洲精品tv久久久久| 亚洲综合伊人久久大杳蕉| 久久永久免费人妻精品下载| 国产成年无码久久久久毛片| 久久被窝电影亚洲爽爽爽| 久久免费99精品国产自在现线| 欧美精品福利视频一区二区三区久久久精品| 久久精品一区二区三区中文字幕| 亚洲国产精品久久久天堂| 亚洲国产精品成人久久| 无码人妻久久一区二区三区蜜桃| 日韩精品无码久久久久久| 国产精品一久久香蕉国产线看观看| 国产精品久久久久久久久软件| 伊人久久久AV老熟妇色| 亚洲精品乱码久久久久久不卡| 久久精品无码专区免费青青| 久久久久一级精品亚洲国产成人综合AV区| 久久天堂AV综合合色蜜桃网| 久久久久久曰本AV免费免费| 久久影视综合亚洲| 久久精品国产精品亚洲| 88久久精品无码一区二区毛片 | 思思久久99热只有频精品66| 99久久亚洲综合精品成人| 精品久久久噜噜噜久久久| 97超级碰碰碰久久久久| 久久精品免费观看|