一、管程
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、定義:有一個許多進程共享的數據區,滿足以下條件,
- 任意多的讀進程可以同時讀這個文件。
- 一次只有一個寫進程可以往文件中寫。
- 如果一個寫進程正在往文件中寫時,則禁止任何讀進程讀文件。