最近开始看操作系统的书(本身不是这个方向的),单看书本管程还是不能完全理解,现在简单总结一下吧。
1.管程 (英语:Monitors,也称为监视器) 是一种程序结构,结构内的多个子程序(对象或模块)形成的多个工作线程互斥访问共享资源。这些共享资源一般是硬件设备或一群变数。管程实现了在一个时间点,最多只有一个线程在执行管程的某个子程序。与那些通过修改数据结构实现互斥访问的并发程序设计相比,管程实现很大程度上简化了程序设计系统中的各种硬件资源和软件资源,均可用数据结构抽象地描述其资源特性,即用少量信息和对资源所执行的操作来表征该资源,而忽略了它们的内部结构和实现细节。利用共享数据结构抽象地表示系统中的共享资源,而把对该共享数据结构实施的操作定义为一组过程。
像一个中介站,程序利用共享资源要通过这个的子程序(操作具体共享资源的一个过程,已经将具体硬件软件资源抽象成一种数据结构,对这个过程进行操作相当于使用资源),最多一个线程执行保证互斥。
2.管程的条件变量:条件变量是在管程内部的数据结构,且只有在管程内才能被访问,它对管程内所有过程是全局的,只能通过wait(),signal()两个操作访问。
wait():挂起调用进程并释放管程,直至另一进程在条件变量上执行signal()。
signal():如果有其他进程因对条件变量执行wait()而被挂起,便释放之,如果没有进程等待,则信号被忽略,不保存。
wait和signal是利用资源的内部语句,条件变量相当于要用的资源,如果已经被别的调用,就wait改变量,用好了别的资源会signal,然后这个程序再利用
3.管程有一个很重要的特性,即任一时刻管程中只能有一个活跃进程,这一特性使管程能有效地完成互斥。管程是编程语言的组成部分,编译器知道它们的特殊性,因此可以采用与其他过程调用不同的方法来处理对管程的调用。典型的处理方法是,当一个进程调用管程过程时,该过程中的前几条指令将检查在管程中是否有其他的活跃进程。如果有,调用进程将被挂起,直到另一个进程离开管程将其唤醒。如果没有活跃进程在使用管程,则该调用进程可以进入。
4. 从语言的角度看,管程主要有以下特性:
(1)模块化。管程是一个基本程序单位,可以单独编译;
(2)抽象数据类型。管程是中不仅有数据,而且有对数据的操作;
(3)信息掩蔽。管程外可以调用管程内部定义的一些函数,但函数的具体实现外部不可见;
(1)模块化。管程是一个基本程序单位,可以单独编译;
(2)抽象数据类型。管程是中不仅有数据,而且有对数据的操作;
(3)信息掩蔽。管程外可以调用管程内部定义的一些函数,但函数的具体实现外部不可见;
5.简单点说就是只能被单个线程执行的代码了,举个例子假如一个管程类叫atm(取款机),里面有两个方法叫提款 取款,不同的人为不同的线程,但是atm只允许一个人在一个时间段中进行操作,也就是单线程,那么这个atm就需要一个锁,单一个人在使用时,其他的人只能wait。再者一个人如果使用的时间太长也不行,所以需要一个条件变量来约束他。条件变量可以让一个线程等待时让另一线程进入管程,这样可以有效防止死锁
6.因为调用wait原语后,使进程等待的原因有多种,为了区别它们,引入了条件变量,就是为了排不同wait的队列(等待原因不同)