实验四模拟"五个哲学家"问题
魏陈强学号:23020092204168
谢思发学号:23020092204174
一、实验题目:
哲学家就餐问题是一种典型的同步问题,它是由Dijkstra提出并解决的。该问题描述如下:有五个哲学家围坐在一张圆形餐桌,交替做以下两件事:吃饭和思考。餐桌中间有一碗意大利面,每两个哲学家之间只有一支餐叉,如果他们想吃面则必须使用其左右的两支餐叉。显然每次最多只能有2个哲学家同时进餐,而且进餐过程有可能会产生死锁,如每个哲学家都拿着左手餐叉,等待右手餐叉。从而导致五个哲学家无法进餐而饿死。现需实验模拟解决哲学家进餐问题,使哲学家们能顺利的进餐思考。
二、算法分析:
该实验的要点是,解决并发环境下,多进程之间的同步与互斥问题。进程间的同步互斥必然涉及进程间通信。但是进程的内存空间是彼此隔离的,因此它们之间的通信只能通过如下手段:IPC机制、管道、信号或文件。本次实验采用文件手段解决通信问题。经验证如果哲学家中同时存在左撇子和右撇子,则哲学家问题有解。模拟程序的框架如下所示: 定义5个文件,分别表示5个叉子。其文件名按如下方式说明:
Static char* forks[5]={"fork0","fork1","fork2","fork3","fork4"};
哲学家的行为可以用如下函数描述: Void philosopher(int i) { while(1){ thinking(i,nsecs); TakeFork(i); eating(i,nsecs); putFork(i); } }
在主程序里,可以用以下的程序段生成5个哲学家进程:
#define N 5
for(i=0;i<N;i++){
pid=fork();
If(pid==0)
philosopher(i);
}
wait(NULL);
拿起叉子可以如此定义:
void takeFork(i)
{
if(i==N-1){
lock(forks[0]);
lock(forks[i]);
www.99jianzhu.com/包含内容:建筑图纸、PDF/word/ppt 流程,表格,案例,最新,免费下载,施工方案、工程书籍、建筑论文、合同表格、标准规范、CAD图纸等内容。