管程
管程的产生
当信号量不正确的用来解决临界区问题,很容易产生各种类型的错误,所以,利用管程可以实现解决上述问题
理解
管程内封装了si you私有数据类型和公有的操作方法,提供了一组由程序员定义的,在管程内互斥的操作,包括了共享数据,初始化代码,阻塞队列和条件变量等待队列,详见图
- 当一个进程执行wait(条件变量)操作,会唤醒阻塞队列里面的一个进程开始执行,而执行wait的进程将会放入到条件变量deng hda等待队列中等待signal操作
- 阻塞队列的实现可以将signal的初始值定义为0即可,即会阻塞住队列中的进程
- 当一个进程调用signal(条件变量)操作,会从该条件变量等待队列中唤醒一个进程执行,而他自身会进入到阻塞队列中等待
- 该管程的mutex互斥锁 是最外层的东西,只有当管程内的所有队列都没有进程在等待时,才会从释放互斥锁,从管程外部调用一个新的进程进入管程
wait和signal的具体实现模式
wait的实现
x-count++;
if (next-count > 0)
signal(next);
else
signal(mutex);
wait(x-sem);
x-count--;
signal的实现
if (x-count > 0) {
next-count++;
signal(x-sem);
wait(next);
next-count--;
}
其余任何进程可用一下代码替换:
wait(mutex);
…
body of F ;
…
if (next-count > 0) //如果管程内部进程未执行完,则调用内部进程
signal(next)
else
signal(mutex); //否则则打开互斥锁,放入外部进程