1 / 54
文档名称:

IPC经典问题.ppt

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

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

分享

预览

IPC经典问题.ppt

上传人:wz_198617 2014/12/18 文件大小:0 KB

下载得到文件列表

IPC经典问题.ppt

文档介绍

文档介绍:IPC经典问题
(1)读者写者问题
问题描述:
有两组并发进程: 读者和写者,共享一组数据区
要求:
允许多个读者同时执行读操作
不允许读者、写者同时操作
不允许多个写者同时操作
第一类:读者优先
如果读者到:
1)无读者、写者,新读者可以读
2)有写者等,但有其它读者正在读,则新读者也可以读
3)有写者写,新读者等
如果写者到:
1)无读者,新写者可以写
2)有读者,新写者等待
3)有其它写者,新写者等待
第一类读者写者问题的解法
读者:
while (true) {
P(mutex);
readcount ++;
if (readcount==1)
P (w);
V(mutex);

P(mutex);
readcount --;
if (readcount==0)
V(w);
V(mutex);
};
写者:
while (true) {
P(w);

V(w);
};
第一类读者写者问题的解法 (一般信号量集)
读者:
Swait(wmutex,1,1;
rcount,R,0);
写;
Ssignal(wmutex,1);
写者:
Swait(rcount,1,1;
wmutex,1,0);
写;
Ssignal(rcount,1);
增加一个限制条件:同时读的“读者”最多R个
Wmutex表示“允许写”,初值是1
Rcount表示“允许读者数目”,初值为R
(2)哲学家就餐问题
问题描述:
有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子
每个哲学家的行为是思考,感到饥饿,然后吃通心粉
为了吃通心粉,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子
哲学家就餐问题解法(1)
#define N 5
void philosopher (int i) {
while (true) {
思考;
取fork[i]; 取fork[(i+1) % 5];
进食;
放fork[i]; 放fork[(i+1) % 5];
}
}
为防止死锁发生可采取的措施:
最多允许4个哲学家同时坐在桌子周围
仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子()
给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家则反之
为了避免死锁,把哲学家分为三种状态,思考,饥饿,进食,并且一次拿到两只筷子,否则不拿
哲学家就餐问题解法(2)
#define N 5
#define THINKING 0
#define HUNGRY 1
#define EATING 2
#typedef int semaphore;
int state[N];
semaphore mutex=1;
semaphore s[N];
void test(int i)
{
if (state[ i ] == HUNGRY)
&& (state [ (i-1) % 5] != EATING)
&& (state [ (i+1) % 5] != EATING)
{
state[ i ] = EATING;
V(&s[ i ]);
}
}
void philosopher (int i)
{ while (true)
{
思考;
P(&mutex);
state[i] = HUNGRY;
test(i);
V(&mutex);
P(&s[i]);
拿左筷子;
拿右筷子;
进食;
放左筷子;
放右筷子;
P(&mutex)
state[ i ] = THINKING;
test([i-1] % 5);
test([i+1] % 5);
V(&mutex);
}
}
state[ i ] = THINKING
s[ i ] = 0