概述
一.管程的组成
封装:
1.一组局部变量
2.对局部变量操作的一组过程
3.对局部变量进行初始化的语句。(联想面向对象中的类)
二.管程特点
- 任何进程只能通过调用管程提供的过程入口才能进入管程访问共享数据;就如同使用临界资源,就要先通过其信号量的申请。
2.任何时刻,仅允许一个进程在管程中执行某个内部过程。
三.管程如何实现同步?
1.对共享变量互斥操作:管程的特点直接实现了该要求,进程一次一个进入管程调用内部过程操作共享变量;管程的互斥访问完全由编译程序在编译时自动添上,无须程序员关心,能保证正确。
2.操作的同步控制:靠条件变量的操作管理实现。进入管程但不能获取资源操作的过程将阻塞,并在满足条件时被唤醒执行。
示例:
type p_c=monitor
var in,out,count: interger;
buffer: array[0,…,n-1] of item
x,y: condition;
procedure entry put(var product:item)
{
if count>=n then x.wait;
buffer[in]=product;
in=in+1 mod n;
count=count+1;
y.signal;
}
procedure entry get(var product:item)
{
if count<=0 then y.wait;
nextc=buffer[out];
out=out-1 mod n;
count=count-1;
x.signal;
}
{
in=out=0;
count=0;
}
生产者——消费者问题的管程解决方法:
Producer:
begin
repeat
生产an item in nextp;
p_c.put(nextp);
until
end
consumer:
begin
repeat
p_c.get(nextc);
消费an item in nextc;
until
end
四.管程的优点
- 保证进程互斥地访问共享变量,并方便地阻塞和唤醒进程。管程可以以函数库的形式实现。相比之下,管程比信号量好控制。
- 管程可增强模块的独立性:系统按资源管理的观点分解成若干模块,用数据表示抽象系统资源,使同步操作相对集中,从而增加了模块的相对独立性。
- 引入管程可提高代码的可读性,便于修改和维护,正确性易于保证:采用集中式同步机制。一个操作系统或并发程序由若干个这样的模块所构成,一个模块通常较短,模块之间关系清晰。
五.管程的缺点 - 大多数常用的编程语言中没有实现管程,如果某种语言本身不支持管程,那么加入管程是很困难的。
- 虽然大多数编程语言也没有实现信号量,但可将P、V操作作为一个独立的子例程或操作系统的管理程序调用加入。
最后
以上就是活力魔镜为你收集整理的操作系统——第二章笔记(三)的全部内容,希望文章能够帮你解决操作系统——第二章笔记(三)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复