经典进程的同步问题之——哲学家进餐

哲学家进餐问题描述

由Dijkstra提出并解决哲学家进餐问题(The Dinning Philosophers Problem)是经典的同步问题。该问题是描述有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在桌子上有五个碗和五只筷子,他们的生活方式是交替的进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有他拿到两只筷子时才能进餐,进餐完毕继续进行思考。

1 利用记录型信号量解决哲学家进餐问题

经过分析可知,圆桌上的筷子是临界资源,在一段时间内只允许一位哲学家使用,为了实现筷子的互斥使用,可以使用一个信号量表示一只筷子,由这五个信号量构成信号量数组。

描述如下:

 1 Var chopstick:array[0,...,4] of semapthore;
 2 所有信号量均被初始化为1,第i位哲学家的活动可描述为:
 3 repeat
 4     wait(chopstick[i]);          // 申请一个临界资源使用权(获取左边的筷子)
 5     wait(chopstick[(i+1) mod 5]);// 在申请一个临界资源使用权(获取右边的筷子)
 6     ...
 7     eat                          // 资源申请成功后进餐操作
 8     ...
 9     signal(chopstick[i]);          // 释放一个临界资源(放回走手边筷子)
10     signal(chopstick[(i+1) mod 5]) // 再释放一个临界资源(放回右手边筷子)
11     ...
12     think
13 until false

但这种方式会引起死锁,例如:假如五位哲学家同时饥饿,同时拿起左边的筷子,此时五个信号量chopstick均为0;当他们试图拿起右边的筷子时都将因为没有筷子而进入无限等待。对于这样的死锁问题,可采用以下几种解决办法。

(1) 至多只允许有四位哲学家同时去拿左边的筷子,最终能保证至少有一位哲学家能够 进餐,并在用毕时能释放出他用过的两只筷子,从而使更多的哲学家能够进餐。

(2) 仅当哲学家的左、右两只筷子均可用时,才允许他拿起筷子进餐。

(3) 规定奇数号哲学家先拿他左边的筷子,然后再去拿右边的筷子,而偶数号哲学家则 相反。按此规定,将是 1、2 号哲学家竞争 1 号筷子;3、4 号哲学家竞争 3 号筷子。即五位 哲学家都先竞争奇数号筷子,获得后,再去竞争偶数号筷子,最后总会有一位哲学家能获 得两只筷子而进餐。

2.利用 AND 信号量机制解决哲学家进餐问题

在哲学家进餐问题中,要求每个哲学家先获得两个临界资源(筷子)后方能进餐,这在本 质上就是前面所介绍的 AND 同步问题,故用 AND 信号量机制可获得最简洁的解法。

描述如下

1 Var chopstick array of semapthore:=(1,1,1,1,1);
2     processi
3         repeat
4             think;
5             Sswait(chopstick[(i+1) mod 5],chopstick[i]);
6             eat
7             Ssignal(chopstick[(i+1) mod 5],chopstick[i]);
8         until false;

原文地址:https://www.cnblogs.com/IamJiangXiaoKun/p/9467278.html

时间: 2024-10-11 16:26:15

经典进程的同步问题之——哲学家进餐的相关文章

【经典进程的同步问题(1)】生产者-消费者问题

[问题描述] 有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费.为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将其所有生产的产品放入一个缓冲区中:消费者进程可从一个缓冲区中取走产品去消费.尽管所有的生产者进程和消费者进程都是以异步方式运行的,但他们之间必须保持同步,既不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品. [利用记录型信号量解决]

【操作系统】经典的同步问题(生产者消费者问题, 哲学家进餐问题, 读写问题)

用专业术语来说, 进程是程序的一次动态执行.说简单点, 就是进程是系统中的某个任务.操作系统中有多个任务需要执行, 那么怎样执行才能使它们同步呢? 即如何让任务并发执行互不影响呢? 这就引出了进程同步中的经典问题: 生产者消费者问题, 哲学家进餐问题, 读写问题 生产者-消费者问题 有一群生产者进程在生产产品, 并将这些产品提供给消费者进程取消费. 为使生产者进程与消费者进程能并发进行, 在两者间设置了一个具有n个缓冲区的缓冲池, 生产者进程将其所生产的产品翻入缓冲区中, 消费者进程可从一个缓冲

Java总结(十)—实现Runnable接口创建线程,线程安全同步,死锁(哲学家进餐问题),读写锁

一.通过实现Runnable接口创建线程 定义实现Runnable接口的类 (1)Runnable接口中只有一个方法public void run();用来定义线程运行体: class MyRun implements Runnable(){ public void run(){ 线程执行的具体代码 } } (2)创建线程的实例的时候将这个类的实例作为参数传递到线程实例内部.然后再启动: Thread thread=new Thread(new MyRun()); Thread.start();

用信号量解决进程的同步与互斥探讨【持续更新】

现代操作系统采用多道程序设计机制,多个进程可以并发执行,CPU在进程之间来回切换,共享某些资源,提高了资源的利用率,但这也使得处理并发执行的多个进程之间的冲突和相互制约关系成为了一道难题.如果对并发进程的调度不当,则可能会出现运行结果与切换时间有关的情况,令结果不可再现,影响系统的效率和正确性,严重时还会使系统直接崩溃.就比如你只有一台打印机,有两个进程都需要打印文件,如果直接让他们简单地并发访问打印机,那么你很可能什么都打印不出来或者打印的文件是...anyway,我们需要增加一些机制来控制并

java笔记--超级类Object多线程的应用+哲学家进餐算法内部类与多线程结合

关于Object类中的线程方法: Object类是所有Java类的 父类,在该类中定义了三个与线程操作有关的方法,使得所有的Java类在创建之后就支持多线程 这三个方法是:notify(),notifyAll(),wait(),这几个方法都是用来控制线程的运行状态的. 方法列表如下: notify() : 唤醒在此对象监视器上等待的单个线程 notifyAll() : 唤醒在此对象监视器上等待的所有线程 wait() : 在其他线程时调用此对象的notify()或者notifyAll()方法前,

计算机操作系统学习笔记_5_进程管理 -- 同步与互斥

h3.western { font-family: "Liberation Sans",sans-serif; }h3.cjk { font-family: "微软雅黑"; }h3.ctl { font-family: "AR PL UMing CN"; }h2.western { font-family: "Liberation Sans",sans-serif; font-size: 16pt; }h2.cjk { fon

利用Linux下的pthread_mutex_t类型来实现哲学家进餐问题

首先说一下什么是哲学家进餐问题,这是操作系统课程中一个经典的同步问题, 问题如下:如上图,有6个哲学家和6根筷子(那个蓝色部分表示哲学家,那个紫色长条部分表示筷子),他们分别被编了0~5的号!如果某个哲学家想要进餐的话,必须同时拿起左手和右手边的两根筷子才能进餐!哲学家进餐完毕之后,就放下手中拿起的两根筷子!这样其他哲学家就能拿这些筷子进餐了!注意这个哲学家的个数必须是偶数个! OK,这样就可能存在一个死锁问题,比如0号哲学家拿了0号筷子,1号哲学家拿了1号筷子!如此往复,最终的结果就是每个哲学

[一个经典的多线程同步问题]总结

针对一个经典的线程同步互斥问题,前面几篇文章提出了四种解决方案:关键段.事件.互斥量.信号量. 下面对这四种解决方案做一个总结,梳理一下知识点: 首先来看下关于线程同步互斥的概念性的知识,相信大家通过前面的文章,已经对线程同步互斥有一定的认识了,也能模糊的说出线程同步互斥的各种概念性知识,下面再列出从<计算机操作系统>一书中选取的一些关于线程同步互斥的描述.相信先有个初步而模糊的印象再看下权威的定义,应该会记忆的特别深刻. 1.线程(进程)同步的主要任务 答:在引入多线程后,由于线程执行的异步

哲学家进餐

问题描述 一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭,如图2-10所示.哲学家们倾注毕生精力用于思考和进餐,哲学家在思考时,并不影响他人.只有当哲学家饥饿的时候,才试图拿起左. 右两根筷子(一根一根地拿起).如果筷子已在他人手上,则需等待.饥饿的哲学家只有同时拿到了两根筷子才可以开始进餐,当进餐完毕后,放下筷子继续思考. 问题分析 1) 关系分析.5名哲学家与左右邻居对其中间筷子的访问是互斥关系. 2) 整理思路.显然这里有五个进程.本题的关键是如何让一个哲