版权声明:私藏源代码是违反人性的罪恶行为!博客转载无需告知,学无止境。 https://blog.csdn.net/qq_41822235/article/details/85368636
在面向过程语言提及的过程和面向对象提及的方法是一个意思。
一、管程机制
1.1 定义
代表共享资源的数据结构以及对该共享数据结构实施操作的一组过程所组成的资源管理程序共同构成了一个操作系统的资源管理模块。
管程相当于“围城 ”。
1.2 模型给出
特点:
- 管程内部的局部变量只能被管程内部的过程所访问,局部于管程内部的过程只能访问管程内部的变量和形参。
- 任何进程只能通过调用管程提供的过程入口进入管程。
- 任何时刻,最多只能有一个进程在管程中执行。
保证进程互斥进入管程是由编译器负责的,程序员本身无需考虑。
二、生产者-消费者问题
这不是真正的代码,只是一种算法的描述,不要拘泥于语法细节:
Monitor producerconsumer{
item buffer[N]; //存放产品的缓冲池
int in,out; //in代表第一个空位置,out代表第一个非空位置
condition notfull, notempty; //notfull和notempty实际上都分别指向一个队列
int count; //记录缓冲区现有产品数量
public:
void put(item x) //生产者
{
if(count >= N) cwait(notfull); //如果缓冲区已满,生产者必须等待
else
{
buffer[in] = x; //产品放入缓冲区
in = (in+1)%N; //空位置+1
count++; //缓冲区现有产品数目+1
csignal(notempty); //生产者唤醒因得不到产品而阻塞的第一个消费者
}
}
void get(item &x) //消费者
{
if(count <= 0) cwait(notempty); //如果缓冲区已空,消费者必须等待
else
{
x = buffer[out]; //取出一个产品
out = (out+1)%N; //非空位置+1
count--; //缓冲区现有产品数目-1
csignal(notfull); //消费者唤醒因缓冲区满而阻塞的第一个生产者
}
}
{ in = 0; out = 0; count = 0; }
}PC; //定义变量PC
在使用管程解决生产者-消费者问题,过程描述为: