哲学家进餐问题

合集下载

哲学家就餐问题代码

哲学家就餐问题代码

哲学家就餐问题代码

哲学家就餐问题是一个经典的并发编程问题,描述了五位哲学家围坐在圆桌旁,每个哲学家面前有一碗米饭和一只筷子。哲学家的生活由思考和就餐两个活动组成,思考时不需要筷子,但就餐时需要同时拿起自己左右两边的筷子才能进餐。问题在于如何设计算法,使得每位哲学家都能够顺利地进行思考和就餐,而不会发生死锁。

以下是一个简单的解决方案,使用Java语言实现:

java.

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

class Philosopher implements Runnable {。

private int id;

private Lock leftChopstick;

private Lock rightChopstick;

public Philosopher(int id, Lock leftChopstick, Lock

rightChopstick) {。

this.id = id;

this.leftChopstick = leftChopstick;

this.rightChopstick = rightChopstick;

}。

private void think() {。

System.out.println("哲学家 " + id + " 正在思考");

try {。

Thread.sleep((long) (Math.random() 1000));

操作系统课程设计 哲学家进餐问题

操作系统课程设计 哲学家进餐问题

哲学家进餐问题课程设计

学 院 计算机信息与工程学院 专 业 计算机科学与技术

课程名称 操作系统 题 目 哲学家进餐问题

完成期限 自2014年6月3日至2014年6月30日共4周

务 一、项目的目的

(1)通过实现哲学家进餐问题的同步,深入了解和掌握进程同步和互斥的原理。

(2)了解并掌握利用信号量解决资源死锁问题。

(3)加强对c++语言的编写能力。

二、项目任务的主要内容和要求

设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并能无死锁的推算出下一状态各哲学家的状态和桌上餐具的使用情况

三、项目设计(研究)思路

本次设计包括了总体设计,模块设计,以及程序编写等步骤,主要研究哲学家进餐问题,利用记录信号量避免产生资源死锁问题,设计时候首先总体需求分析,其次模块求精,最后测试编写的程序,采用了在windows环境下的c++语言解决哲学家进餐问题。

四、具体成果形式和要求

程序最后能够显示五个哲学家和五支筷子的状态,能够清楚显示资源是否释放,以及各哲学家对资源的竞争。

排 起止日期 工作内容

6月3至6月10 总体设计思想的分析

6月10至6月17日 从总体到部分,了解程序所需的变量以及函数,对模块进行分析。

6月17日至6月30日 根据总体和模块的分析,编写程序,并且对程序进行编译和测试。 主

料 1.汤小丹,计算机操作系统[第三版],西安电子科技出版社,2007;

2.黄干平,陈洛资,等.计算机操作系统.北京:科学出版社,1989;

3.李勇,陈恩林.计算机体系结构.长沙:国防科技大学出版;

4.黄祥喜,计算机操作系统实验教程.广州:中山大学出版社,1994.

指导教师

意见

(签字): 年 月 日

系(教研室)主任意见

(签字): 年 月 日

进程同步模拟设计——哲学家就餐问题

进程同步模拟设计——哲学家就餐问题

武汉理工大学《操作系统》课程设计说明书

1 / 9

学 号: 01201034

课 程 设 计

目 进程同步模拟设计—哲学家就餐

学 院 计算机科学与技术

业 计算机科学与技术

班 级 计算机

指导教师

20011 年 1 月 19 日

需求分析

1.1问题描述

有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子,即共5只筷子。 武汉理工大学《操作系统》课程设计说明书

2 / 9

每个哲学家的行为是思考和进餐。为了进餐,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子。思考时则同时将两支筷子放回原处

(此图中以叉子代表筷子)

规则:

只有拿到两只筷子时,哲学家才能吃饭;

如果筷子已经在他人手上,则该哲学家必须等到他人吃完之后才能拿到筷子;

任何一个哲学家在自己没有拿到两只筷子吃饭之前,决不放下自己手中的筷子。

由此出现的问题:

可能出现死锁问题,因为当五个哲学家都饥饿时,都拿着一支筷子,这样就可能五个哲学家都用不上餐

1.2问题分析

该问题可用记录型信号量或者是AND型信号量解决。

记录型信号量解决:

经分析可知,放在桌子上的筷子是临界资源,在一段时间内只允许一位哲学家使用,为了实现对筷子的互斥使用,可以用一个信号量表示一只筷子,由这五个信号量组成信号量数组。当哲学家饥饿时总是先拿其左边的筷子,成功后,再去拿右边的筷子,又成功后方可就餐。进餐完,又先放下他左边的筷子,再放下右边筷子。这个算法可以保证不会有两个相邻的哲学家同时就餐,但有可能引起死锁。

AND型信号量解决:

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

1.3解决方法

对于死锁问题可采取这样的几种解决方法:

(1)至多只允许四个哲学家同时进餐,以保证至少有一个哲学家可以进餐,最终总会释放出他所用过的两只筷子,从而可使更多的哲学家进餐;

计算机导论哲学家共餐问题

计算机导论哲学家共餐问题

哲学家共餐问题

 问题描述

1. 哲学家的的生活除了吃面条就是思考问题。

2. 吃面条的时候需要左、右手各拿起一根筷子。

3. 吃完后将筷子放回原处,继续思考问题。

 一个哲学家的活动进程表示

1. 思考问题。

2. 饿了停止思考,左手拿一只筷子(拿不到就等)。

3. 右手拿一只筷子(拿不到就等)。

4. 进餐。

5. 放下右手筷子。

6. 放下左手筷子。

7. 重新回到思考问题状态。

 可能出现的问题

1. 当所有的哲学家都同时放下筷子时,则所有的哲学家都将拿不到右手的筷子,并处于等待状态,那么哲学家都将无法进餐,最终饿死。

2. 经哲学家的活动进程修改一下,变为右手的筷子拿不到时,就放下左手的筷子。

3. 可能在同一个时间,所有的哲学家都拿起了左手的筷子,则自然拿不到右手的筷子,于是都同时

哲学家就餐问题--计算机操作系统

哲学家就餐问题--计算机操作系统

13、分析下面用信号量解决哲学家进餐问题的同步算法是否满足同步机制的准则。若不满足,说明为什么,并给出满足同步机制准则的同步算法。

Var chopstick : array[0,...,4] of semaphore ;

Chopstick[0]:=chopstick[1]:=chopstick[2]:=chopstick[3]:=chopstick[4]:=1;

Pi: repeat

wait(chopstick[i]);

wait(chopstick[(i+1)mod 5]);

eat ;

signal(chopstick[i]);

signal(chopstick[(i+1)mod 5]);

think;

until false;

答:该算法不满足同步机制的"有限等待"原则,即每个哲学家都只拿一个筷子时就会产生死锁。下面给出三种解决办法。

1、互斥申请资源

设置信号量mutex初值为4,即最多可以有4个哲学家同时申请筷子。这样保证了4个哲学家中至少有1人可以拿到两个筷子就餐而不发生死锁。

mutex=4

Pi(i=0,1,...,4);

Repeat

wait(mutex);

wait(chopstick[i]);

wait(chopstick[(i+1) mod 5]);

signal(mutex);

Eat ;

signal(chopstick[i]);

signal(chopstick[(i+1)mod 5]);

think;

until false ;

2、改变申请资源次序

规定奇数号哲学家先拿起左边的筷子,然后再去拿右边的筷子;偶数号哲学家正好相反。也即拿到一个筷子的哲学家才有权去拿下一个筷子,而没有拿到筷子的哲学家则退出竞争。这样就不会出现5个哲学家都只拿一个筷子的情况。

利用Java高级别并发对象求解哲学家进餐问题

利用Java高级别并发对象求解哲学家进餐问题

第31卷第6期 2013年11月 佳木斯大学学报(自然科学版) 

Journal of Jiamusi University(Natural Science Edition) Vo1.31 No.6 

Nov. 2013 

文章编号:1008—1402(2013 l06-0905-03 

利用Java高级别并发对象求解哲学家进餐问题① 

詹劲松 

(福建师范大学福清分校数学与计算机科学系.福建福清350300) 

摘要:介绍了利用Java高级别并发对象求解哲学家进餐问题死锁预防的一种方法,并和我 

们过去的方法进行了比较,结果表明新方法的效率有所提高. 

关键词: 高级别并发对象;哲学家进餐问题;死锁预防 

中图分类号:TP316 文献标识码:A 

哲学家进餐问题是操作系统的一个经典的同 

步问题,是一大类并发控制问题的范例.死锁要发 

生,四个必要条件(互斥、部分分配、环路等待、不 

剥夺)的每一个都要成立….可以通过破坏产生死 

锁的四个必要条件之一或更多来预防死锁的发生. 

Java高级别并发对象是和Java 5平台一起推出的, 

适用于高级任务,特别是利用多处理器和多核系统 

的大型应用. 

1 哲学家进餐问题的一种解法 

哲学家进餐问题有很多解法,其中的一种解法 

是只有当哲学家可以同时获得两个筷子(临界资 

源)时,才允许哲学家拿起筷子进餐.这种解法的 

实质是预先分配哲学家需要的全部资源,从而预防 

死锁的发生. 

算法描述如下: 

Semaphore:chopstick[0]=chopstick[1]=chopstick[2]=chopstick 

[3]=chopstick[4]=1 

Philosopher i: while(1){ 

思考; while(!impendingPickup()){//尝试同时获得左右两支筷 

子,包括P操作 

等待;//不成功,进入等待状态 

} 

吃饭; 

V(chopstick[i]); V(chopstick[(i+1)%5}; 

linuxc语言哲学家进餐---信号量PV方法一

linuxc语⾔哲学家进餐---信号量PV⽅法⼀

1、实验原理

由Dijkstra提出并解决的哲学家进餐问题(The Dinning Philosophers Problem)是典型的同步问题。该问题是描述

有五个哲学家共⽤⼀张圆桌,分别坐在周围的五张椅⼦上,在圆桌上有五个碗和五只筷⼦,他们的⽣活⽅式是交替地

进⾏思考和进餐。平时,⼀个哲学家进⾏思考,饥饿时便试图取⽤其左右最靠近他的筷⼦,只有在他拿到两只筷⼦时

才能进餐。进餐完毕,放下筷⼦继续思考。

2.实验内容:

显⽰出每个哲学家的⼯作状态,如吃饭,思考。连续运⾏30次以上都未出现死锁现象。

3.分析解决⽅案⼀:现在引⼊问题的关键:这些哲学家很穷,只买得起五根筷⼦。他们坐成⼀圈,两个⼈的中间放⼀根筷⼦。哲学家吃饭的时候必须同时得到左⼿边和右⼿边的筷⼦。如果他⾝边的任何⼀位正在使⽤筷⼦,那他只有等着。所以我们就假设

最多只有4民哲学家在进餐这样就能保证没有死锁的情况。

代码如下:

1 #include

2 #define NUM 5

3 int ID[NUM]={0,1,2,3,4};

4 sem_t sem_chopsticks[NUM];

5 sem_t sem_eaters;

6 int eaters_num=0;//记录已经吃过饭的次数

7

8 //初始化信号量函数

9 void sem_signal_init(){

10 int i;

11 for(i=0;i

12 if(sem_init(&sem_chopsticks[i],0,1)==-1){

13 perror("oops:em_init error!");

14 exit(1);

15 }

16 }

17 if(sem_init(&sem_eaters,0,NUM-1)==-1){

18 perror("oops:em_init error!");

19 exit(1);

20 }

21

22

23 }

24

关于哲学家就餐问题的SPIN检测

关于哲学家就餐问题的SPIN模型检测分析

1. 问题描述

哲学家就餐问题是在计算机科学中的一个经典问题,用来演示在并行计算中多线程同步(Synchronization)时产生的问题。在1971年,著名的计算机科学家艾兹格•迪科斯彻提出了一个同步问题,即假设有五台计算机都试图访问五份共享的磁带驱动器。稍后,这个问题被托尼•霍尔重新表述为哲学家就餐问题。这个问题可以用来解释死锁和资源耗尽。

哲学家就餐问题可以这样表述,假设有六位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。餐桌中间有一大碗意大利面,每两个哲学家之间有一只餐叉。因为用一只餐叉很难吃到意大利面,所以假设哲学家必须用两只餐叉吃东西。他们只能使用自己左右手边的那两只餐叉。哲学家就餐问题有时也用米饭和筷子而不是意大利面和餐叉来描述,因为很明显,吃米饭必须用两根筷子。

哲学家从来不交谈,这就很危险,可能产生死锁,每个哲学家都拿着左手的餐叉,永远都在等右边的餐叉(或者相反)。即使没有死锁,也有可能发生资源耗尽。例如,假设规定当哲学家等待另一只餐叉超过五分钟后就放下自己手里的那一只餐叉,并且再等五分钟后进行下一次尝试。这个策略消除了死锁(系统总会进入到下一个状态),但仍然有可能发生“活锁”。如果五位哲学家在完全相同的时刻进入餐厅,并同时拿起左边的餐叉,那么这些哲学家就会等待五分钟,同时放下手中的餐叉,再等五分钟,又同时拿起这些餐叉。

在实际的计算机问题中,缺乏餐叉可以类比为缺乏共享资源。一种常用的计算机技术是资源加锁,用来保证在某个时刻,资源只能被一个程序或一段代码访问。当一个程序想要使用的资源已经被另一个程序锁定,它就等待资源解锁。当多个程序涉及到加锁的资源时,在某些情况下就有可能发生死锁。例如,某个程序需要访问两个文件,当两个这样的程序各锁了一个文件,那它们都在等待对方解锁另一个文件,而这永远不会发生。 2. 求解问题的逻辑语言陈述

哲学家进餐问题产生死锁的1种解决方案

第31卷第1期 2010年3月 内 蒙 古农 业 大 学 学 报 

Journal of Inner MongoHa A cultural University Vo1.31 No.1 Mill".2010 

哲学家进餐问题产生死锁的1种解决方案 

白戈力, 付学良 

(内蒙古农业大学计算机与信息工程学院,呼和浩特010018) 

摘要: 哲学家进餐问题是《操作系统原理》课程中经典的进程同步问题。本文对哲学家进餐问题产生死锁提出了1 种解决方案,并在JAVA多线程环境下编程实现,有较强的参考价值和实践意义。 关键词:哲学家进餐问题;死锁;JAVA 中图分类号:¥312JA 文献标识码:A 文章编号:1009—3575(2010)01—0245—03 

A SOLUTION FOR THE DEADLOCK OF DlNING PHILOSOPHERS 

BAI Ge—li.FU—Xue—liang 

(College ofComputer and Information Engineering,Inner Mongolia Agricultural University,Huhhot,010018,China) 

Abstract:Dining Philosophers is a typical representative of classical processes synchronizing in(The Principle of Operating System)). This article introduces a solution for the Deadlock of Dining Philosophers.and programs it in JAVA multi—threaded environment, which has a strong reference value and practical significance. Key words:Dining philosophers;deadlock;JAVA 

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

semaphore chopstick[5]={1,1,1,1,1};

semaphore room=4;

void philosopher(int i){

while(true){

think();

wait(room); //请求进入房间进餐

wait(chopstick[i]); //请求左手边的筷子

wait(chopstick[(i+1)%5]); //请求右手边的筷子

eat();

signal(chopstick[(i+1)%5]); //释放右手边的筷子

signal(chopstick[i]); //释放左手边的筷子

signal(room); //退出房间释放信号量room

}

}

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档