操作系统-管程

管程

为什么引入管程?
如果使用信号量来处理同步问题时,PV操作会分散在各个进程中,维护麻烦,修改麻烦,反正就是麻烦。

它的实现思路很简单,将共享变量以及对共享变量的操作统一封装起来。如下图所示,管程 A 将共享变量 data 和相关的操作入队enq()、出队deq() 封装起来。线程 A 和线程 B想访问共享变量 data ,只能通过调用管程提供的 enq() 和 deq() 。当然前提是 enq()、deq()保证互斥性,只允许一个线程进入管程。是不是很有面向对象的感觉。

任何进程只能通过调用管程提供的入口进入管程。
任一时刻,最多只能由一个进程在管程中进行。

在管程中同时引入了条件变量。目的很简单,防止死锁,如果在管程内的进程得不到邻接资源必须能够将进程阻塞。下面给出一个例子。

人们到一家叫做计算机的银行取钱,这个银行里面就一个空窗口。最早之前,每个人需要从这个窗口爬进去取钱。这里,银行里面每一个需要取钱的人看作进程,而银行里面的钱可以看做计算机的共享资源,一般是硬件设备或一群共享变量。每个人都向窗口拥挤,场面混乱不堪。后面计算机银行不断改进,发明了一种叫ATM的机器(管程),ATM(管程)封装了钱和对外开放了一些存取钱的操作。这样一来,ATM(管程)在计算机银行的钱和客户之间担任了中介服务的角色。在一个相对封闭的屋子里面,一次只能服务一个人(让进程互斥使用)。ATM屋子里面有人的时候,其他需要依次排队使用。一个人(进程)在ATM使用的时间太长也不行,所以需要一个条件变量(condition)来约束他。条件变量可以让一个线程等待时让另一线程进入管程,这样可以有效防止死锁。

例子转载自知乎:链接:https://www.zhihu.com/question/30641734/answer/378435042

上一篇:day22 ATM解析


下一篇:RPC模式开发一个银行atm模拟系统