正在加载图片...
读。 Process Writer j中的第一循环语句保证让正在工作的读者完成读后再执行写,完成写 操作后由第二个循环语句恢复Sn的初值,最后的V(S)用于唤醒被阻塞的读、写进程 3.1.3管程 使用信号量来处理同步问题时,同步操作P(S)和V(S)分散在各个进程中,并遍布整个程 序。这不仅给系统的管理和程序的维护和修改带来了麻烦,两且还会因同步操作的使用不当造 成死锁。为了解决上述问题,又产生了一种新的进程同步工具一管程 1.管程的定义 管程机制提供了与信号量机制相同的表达能力,但它更容易控制。管程是由一组局部的变 量对局部变量进行操作的一组过程以及对局部变量进行初始化 的语句序列构成的一个软件模块,它可用来实现进程同步。取名为 monitor name的管程,其语 去如下 type momtor name=momtor variable declarations procedue entry P1(…) procedure entry Pn(.) begin…end; initialization code 而且,管程具有以下特点 (1)管程内的局部变量只能被局部于管程内的过程所访问:反之亦然,即局部于管程内的 过程只能访问管程内的变量。 (2)任何进程只能通过调用管程提供的过程入口进入管程 (3)任一时刻,最多只能有一个进程在管程中执行 保证进程互斥地进入管程是由编译器负责的。也就是说,管程是一种编程语言的构件,它 的实现需要得到编译器的支持。 2.条件变量 在任何时刻,最多只有一个进程在管程中执行,因此用管程很容易实现互斥,只要将需要 互斥访问的资源用数据结构来描述,并将该数据结构放入管程中便可。若要用管程来实现同步, 则在相应条件不满足时(如临界资源得不到时)必须能够将在管程内执行的进程阻塞。由于阻 塞的原因不同,为了将它们区分开,引入了局部于管程的条件变量。条件变量的定义格式 为: VarXJ: condition。对条件变量只能执行以下两种操作 (1)wait操作。如.wait用来将执行进程挂到与条件变量x相应的等待队列上 (2) signal操作。如X. signal用来唤醒与ⅹ相应的等待队列上的一个进程。值得注意的 是,若没有等待进程,则X. Signal不起任何作用 3.利用管程解决生产者一消费者问题 利用管程来解决生产者一消费者问题,首先必须为它们建立二个管程: type p c=momtor Var in, out, count: integer; Buffer: array [0, n-1] of iter notfull, notempty: condition读。Process Writer j 中的第一循环语句保证让正在工作的读者完成读后再执行写,完成写 操作后由第二个循环语句恢复 Sn 的初值,最后的 V(S)用于唤醒被阻塞的读、写进程。 3.1.3 管程 使用信号量来处理同步问题时,同步操作 P(S)和 V(S)分散在各个进程中,并遍布整个程 序。这不仅给系统的管理和程序的维护和修改带来了麻烦,两且还会因同步操作的使用不当造 成死锁。为了解决上述问题,又产生了一种新的进程同步工具一管程。 1.管程的定义 管程机制提供了与信号量机制相同的表达能力,但它更容易控制。管程是由一组局部的变 量对局部变量进行操作的一组过程以及对局部变量进行初始化 的语句序列构成的一个软件模块,它可用来实现进程同步。取名为 monitor_name 的管程,其语 法如下: type momtor_name=momtor variable declarations; procedue entry P1(…); begin …end; ┆ procedure entry Pn(…); begin …end; begin initialization code; end 而且,管程具有以下特点: (1)管程内的局部变量只能被局部于管程内的过程所访问:反之亦然,即局部于管程内的 过程只能访问管程内的变量。 (2)任何进程只能通过调用管程提供的过程入口进入管程。 (3)任一时刻,最多只能有一个进程在管程中执行。 保证进程互斥地进入管程是由编译器负责的。也就是说,管程是一种编程语言的构件,它 的实现需要得到编译器的支持。 2.条件变量 在任何时刻,最多只有一个进程在管程中执行,因此用管程很容易实现互斥,只要将需要 互斥访问的资源用数据结构来描述,并将该数据结构放入管程中便可。若要用管程来实现同步, 则在相应条件不满足时(如临界资源得不到时)必须能够将在管程内执行的进程阻塞。由于阻 塞的原因不同,为了将它们区分开,引入了局部于管程的条件变量。条件变量的定义格式 为:VarXJ:condition。对条件变量只能执行以下两种操作: (1)wait 操作。如 X.Wait 用来将执行进程挂到与条件变量 x 相应的等待队列上。 (2)signal 操作。如 X.signal 用来唤醒与 x 相应的等待队列上的一个进程。值得注意的 是,若没有等待进程,则 X.Signal 不起任何作用。 3.利用管程解决生产者一消费者问题 利用管程来解决生产者一消费者问题,首先必须为它们建立二个管程: type p_c=momtor Var in,out,count:integer; Buffer:array[0,…,n-1] of item; notfull,notempty:condition;
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有