操作系统-管程

管程

管程的产生

当信号量不正确的用来解决临界区问题,很容易产生各种类型的错误,所以,利用管程可以实现解决上述问题

理解

管程内封装了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);      //否则则打开互斥锁,放入外部进程

Guess you like

Origin blog.csdn.net/weixin_45774350/article/details/115943096