DANCE WITH JAVA

          開發出高質量的系統

          常用鏈接

          統計

          積分與排名

          好友之家

          最新評論

          互斥

          互斥的幾種實現方式:
          一,忙等待互斥
          1,禁止中斷
          2,鎖變量
          3,嚴格的輪換
          4,peterson算法
          5,Tsl
          忙等待存在著各種各樣的問題,一個最大的問題使消耗cpu,另外容器產生各種錯誤。而且還可能出現優先級反轉問題,所以忙等待并不是很好的辦法

          ?互斥2-生產者消費者(原始狀態)

          一,休眠與喚醒
          1,經典的生產者與消費者問題
          生產者消費者現象的原型是這樣的:
          一個生產者生產,當緩沖區滿了,就自己休眠
          一個消費者消費,當緩沖區空了,就自己休眠

          一個生產者生產,當生產一個產品時,就喚醒消費者(可以消費了)
          一個消費者消費,當消費一個產品時,就喚醒生產者(可以生產了)

          無論是生產者,還是消費著,當被喚醒的時候不一定馬上執行,還需要獲得cpu

          ◎這種設計產生了一個問題,原因是需要一個count來記錄產品個數,而count的獲得并沒有互斥
          例如如下情況:
          消費者取得count=0,但是還沒來得及休眠自己的時候,發生了系統進程調度,切換到生產者
          生產者生產了一個產品后,喚醒消費者,但是這個時候的消費者并沒有休眠,所以喚醒丟失
          然后生產者繼續生產,直到緩沖滿了,自動休眠。
          但是這個時候的消費者也是休眠狀態,沒有人來喚醒他,所以兩個都一直休眠下去。

          解決方案:
          提供一個標志位,當生產者發送喚醒給消費者的時候,記錄下來為1,當消費者要休眠之前檢查一下這個標志位,如果是1就不休眠,如果不是就休眠
          這個方法暫時解決了問題,考慮一下。
          如果是m個生產者,n個消費者,m,n又很大的情況下,標志位就太多了。
          這種情況下情況下地解決辦法見下一篇文章 <互斥3-生產者消費者>

          這個方案地實現程序如下:
          #define N=100
          int count=0;
          void product(void){
          ?int item;
          ?while(TRUE){
          ??item=produce_item()
          ??if(count==N)sleep();
          ??insert_item(item);
          ??count=count+1;
          ??if (count==1)wakeup(consumer);
          ?}
          }
          void consumer(void){
          ?int item;
          ?while(TRUE){
          ??if(count==0)sleep();
          ??item=remove_item();
          ??count=count-1;
          ??if(count==N-1)wakeup(product);
          ??consume_item(item);
          ?}
          }?


          posted on 2006-09-20 21:32 dreamstone 閱讀(530) 評論(0)  編輯  收藏 所屬分類: 基礎

          主站蜘蛛池模板: 郁南县| 仙游县| 高陵县| 司法| 安岳县| 石嘴山市| 金溪县| 集贤县| 阿克| 赣州市| 井研县| 贺兰县| 通辽市| 星座| 阜南县| 东丽区| 祁东县| 无棣县| 深州市| 芒康县| 青岛市| 昌图县| 昂仁县| 龙海市| 南投县| 津南区| 霍山县| 勃利县| 右玉县| 滦南县| 安化县| 永靖县| 肥乡县| 青河县| 长垣县| 曲周县| 博白县| 左权县| 建宁县| 二连浩特市| 神池县|