-
管程由几个部分组成?
管程是一种高级同步工具,是一种特殊的软件模块,有这些部分组成:
a.局部于管程的共享数据结构说明
b.对该数据结构进行操作的一组过程
c.对局部于管程的共享数据结构设置初始值的语句
简单可以这样说明:管程=数据结构+操作+对数据结构中的初始值设置 -
条件变量的作用是什么?
管程必须使用条件变量提供对同步的支持,这些条件变量包含在管程中,并且只有在管程中才能被访问。以下两个函数可以操作条件变量:
a.cwait(c):调用进程的执行在条件c上挂起,管程现在可被另一个进程使用
b.csignal(c):恢复在cwait上因为某些条件而挂起的进程的执行。如果有多种这样的进程,选择其中一个。
此外,管程中的条件变量只能访问定义在管程里的条件变量。
附送课堂七问。我是懵了,操作系统磨人
问题1 如果某个管程中存在A和B两个操作过程,线程P1正在执行A,请问,线程P2可以同时执行A或者B吗?
//不能,两个都不能,任何时候只能有一个进程在管程中执行,即线程P1执行A
问题2 如果线程P1执行A的时候阻塞,一定是因为检测条件变量吗?
这是回答是的。这里可以体现一个空闲让进的原则,执行A的时候堵塞,但没有其他进程继续执行操作,那么就是条件变量发生变化,导致相关条件队列的条件发生改变。
问题3 条件变量只能被在管程中定义的过程访问吗?
是的,只能在定义的过程中被访问。条件变量的作用就是为了实现同步控制,在管程中定义条件变量即可,管程中的条件变量只能访问定义在管程里的条件变量。
问题4 如何访问条件变量?
两个函数操作条件变量。
cwait(c):调用进程的执行在条件c上挂起,管程现在可被另一个进程使用
csignal(c):恢复在cwait上因为某些条件而挂起的进程的执行。如果有多种这样的进程,选择其中一个。
问题5 条件变量和信号量在控制同步时有什么区别
条件变量不需要积累信号,wait操作必须在signal操作之前。
问题6 如果父母姐弟在一个盘子里传递橘子和苹果,用管程控制他们的行为过程,需要如何定义管程?
不区分拿取操作,设置条件变量来区分橘子和苹果。满足橘子的话,就让儿子拿。满足苹果就让女儿拿。
问题7 定义几个条件变量控制前驱关系?
put(){
wait(plate);
<把水果放在盘子里>
if(盘里是橘子)
signal(orange);
else
signal(apple);
}
get(){
<把水果拿出盘子>
if(儿子拿了水果)
wait(orange);
else
wait(apple);
signal(plate);
}