1 / 55
文档名称:

IPC经典问题76.ppt

格式:ppt   大小:677KB   页数:55页
下载后只包含 1 个 PPT 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

IPC经典问题76.ppt

上传人:放射辐射 2022/6/14 文件大小:677 KB

下载得到文件列表

IPC经典问题76.ppt

相关文档

文档介绍

文档介绍:IPC经典问题76
哲学家就餐问题解法(2)
#define N 5
#define THINKING 0
#define HUNGRY 1
#define EATING 2
#typedef int se三种:
P等待Q继续,直到Q退出或等待√(Hoare)
Q等待P继续,直到P等待或退出
规定唤醒为管程中最后一个可执行的操作
管程的实现——问题
因为管程是互斥进入的,所以当一个进程试图进入一个巳被占用的管程时它应当在管程的入口处等待,因而在管程的入口处应当有一个进程等待队列,称作入口等待队列
如果进程P唤醒进程Q,则P等待Q继续,如果进程Q在执行又唤醒进程R,则Q等待R继续,……,如此,在管程内部,由于执行唤醒操作,可能会出现多个等待进程,因而还需要有一个进程等待队列,这个等待队列被称为紧急等待队列。它的优先级应当高于入口等待队列的优先级
管程的实现——问题(续1)
由于管程通常是用于管理资源的,因而在管程内部,应当存在某种等待机制。当进入管程的进程因资源被占用等原因不能继续运行时使其等待。为此在管程内部可以说明和使用一种特殊类型的变量,称作条件变量:
VAR C:condition;
对于条件型变量,可以执行wait和signal操作:
管程的实现——问题(续2)
wait(c):如果紧急等待队列非空,则唤醒第一个等待者;否则释放管程的互斥权,执行此操作的进程的PCB进入c链尾部
signal(c):如果c链为空,则相当于空操作,执行此操作的进程继续;否则唤醒第一个等待者,执行此操作的进程的PCB进入紧急等待队列的尾部
管程的实现——问题(续3)
管程的实现
两个主要途径:
* 直接构造 → 效率高
* 间接构造
→ 用某种已经实现的同步机制去构造
例子:用PV操作构造管程
管程的实现
TYPE one_instance=RECORD
mutex:semaphore;(初值1)
urgent:semaphore;(初值0)
urgent_count:integer;(初值0)
END;
TYPE
monitor_elements=MODULE;
define enter,leave,wait,signal;
mutex(入口互斥队列)
urgent(紧急等待队列)
urgent_count(紧急等待队列计数)
PROCEDURE enter(VAR instance:one_instance);
BEGIN
P()
END;
PROCEDURE leave(VAR instance:one_instance);
BEGIN
IF >0 THEN
BEGIN --;
V()
END
ELSE
V()
END;
PROCEDURE wait(VAR instance:one_instance;VAR s:semephore;VAR count:integer);
BEGIN
count++;
IF >0 THEN
BEGIN
--;
V()
END
ELSE
V(instance. mutex);
P(s);
END;
PROCEDURE
signal(VAR instance:one_instance;
VAR s:semaphore;VAR count:integer);
BEGIN
IF count>0 THEN
BEGIN
count--;
++;
V(s);
P()
END
END;
例子:一个信息缓冲区是一个共享资源
抽象成一个数据结构:数组
构造一些操作(过程或函数)
发送:向缓冲区发消息
接收:从缓冲区取消息
隐藏了内部的数据结构和实现细节
例子:读者-写者问题
TYPE r_and_w=MODULE;
VAR instance:one_i