一、管程
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、定义:有一个许多进程共享的数据区,满足以下条件,
- 任意多的读进程可以同时读这个文件。
- 一次只有一个写进程可以往文件中写。
- 如果一个写进程正在往文件中写时,则禁止任何读进程读文件。