互斥與同步(二)

一、管程

1、定義:管程是由一個或多個過程、一個初始化序列和局部數據組成的軟件模塊,主要特點如下:

  • 局部數據變量只能被管程的過程訪問。
  • 進程通過調用管程的一個過程進入管程。
  • 任何時候,只能有一個進程在管程中執行,調用管程的任何其他進程被掛起。

2、函數

  • cwait(c):調用進程的執行在條件c 上被掛起,管程現在可被另一個過程使用。——進入條件隊列
  • csignal(c):恢復在cwait 之後爲某些條件而掛起的進程的執行。——從條件隊列中取出一個

3、例子

生產者-消費者問題

cond notfull,notempty;
void append(char x)
{
     if(count == N)
         cwait(notfull);
     count ++;
     csignal(notempty);
}
void take(char x)
{
     if(count==0)
         cwait(notempty);
     count --;
     csignal(notfull);
}
二、消息傳遞

使用消息傳遞解決生產者-消費者問題

void producer()
{
     message pmsg;
     while(true)
     { 
          receive(mayproduce,pmsg);
          pmsg = produce();
          send(mayconsumer,pmsg);
     }
}
void consumer()
{
     message cmsg;
     while(true)
     { 
          receive(mayconsumer,cmsg);
          consume(cmsg);
          send(mayproduce,null);
     }
}
其中,mayproduce是生產者信箱,而mayconsumer是消費者信箱。


三、讀者-寫者問題

1、定義:有一個許多進程共享的數據區,滿足以下條件,

  • 任意多的讀進程可以同時讀這個文件。
  • 一次只有一個寫進程可以往文件中寫。
  • 如果一個寫進程正在往文件中寫時,則禁止任何讀進程讀文件。

      




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章