[2020年新版操作系统哲学家就餐问题实验报告]哲学家就餐问题pv

  精选资料,欢迎下载

 精选资料,欢迎下载

 1、 实验目的:

 (1) 、掌握基本的同步互斥算法,理解哲学家就餐模型。

 (2) 、了解windows 2000/XP中多线程的并发执行机制,线程间的同步和互斥。

 (3) 、学习使用windows 2000/XP中基本的同步对象,掌握相应的 API。

 2、 实验要求

 有五个哲学家共用一张放有五把椅子的餐桌, 每人坐在一把椅子上,桌子上

 有五个碗和五只筷子,每人两边各放一只筷子。哲学家们是交替思考和进餐,饥 饿时便试图取其左右最靠近他的筷子。条件: (1)、只有拿到两只筷子时,哲学

 家才能吃饭。(2)、如果筷子已被别人拿走,则必须等别人吃完之后才能拿到筷 子。(3)、任意一个哲学家在自己未拿到两只筷子吃饭前,不会放下手中拿到的 筷子。

 3、 实验环境

 硬件:CPU : AMD QL64内存:2GB显卡:ATI 4570硬盘:日立250G

 软件:Windows 2000/XP。开发工具:VC++6.0

 4、 实验内容

 1)实现原理

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

 2、 临界区互斥编程原理。

 2 )程序结构(流程图)

 图1.主程序模块流程图

 图2.状态改变模块流程图

 图4返回餐具状态模块流程图

 数据结构

 、定义一个哲学家类,包含两个私有对象和四个公有对象。

 、定义函数:

 Numbe对象:哲学家的编号;

 Status对象:保存当前该哲学家的状态,0表示等待,1表示吃饭,2表示思 考;

 Philosopher? nt num)方法:哲学家类构造函数,参数 num表示哲学家编号;

 fin d() const 方法:返回该哲学家编号;

 get in fo() const 方法:返回哲学家当前状态;

 Cha nge()方法:根据题目要求改变哲学家的状态(等待 -> 进餐-> 思考)

 另外,程序中包含一个公有对象,bool类型数组tools[6],用来保存6把餐 具当前状态:true表示该餐具当前空闲,false表示该餐具当前正被使用。

 程序中还包含两个公有函数:print和toolstatus 。Print用来返回一个哲学 家的状态,toolstatus 用来返回一个餐具的状态。

 实现步骤

 1)打开VC,选择菜单项File->New,选择Projects 选项卡并建立一个名为 xwj 的wi n32 con sole applicatio n 工程,创建时注意指定创建该工程的目录;

 (2 )在工程中创建源文件 xwj.cpp :选择菜单项 Project->Add to project->Files, 此时将打开一个新窗口,在其中的“文件名”输入栏中输入自

 己想要创建的文件名,这里是xwj.cpp;接着询问是否创建新文件时回答“yes”。

 通过Workspace->Source Files 打开该文件,在其中编辑源文件并保存;

 通过调用菜单项Build->Rebuild all进行编译连接,可以在指定的工程目 录下得至U debug->xwj.exe程序。

 5、实验测试及分析:

 ■ I H:\xwj\De b u g\Kwj. exe闲当前状态誓待输入n进入死锁;

 ■ I H:\xwj\De b u g\Kwj. exe

 闲

 当前状态誓待

 输入n进入死锁;输入其他,结束程序:呼

 输入

 1就餐

 粵等待

 图5.测试结果1

 图6.测试结果2

 图7.测试结果3

 图8.测试结果4

 5、结果分析:

  、程序分为四大模块,一步步解决了哲学家状态及状态改变的问题, 筷子的 “闲”、“用”问题;

 、实现了哲学家等待、吃饭、思考三个过程的转换循环,并且避免了死锁问 题;

 、让临界资源得到了充分的利用。

 6实验心得体会

 、这次实验加强了我上网查数检索问题的能力;

  、这次实验让我学会分模块解决问题,怎样运用互斥锁对临界资源进行管理;

  、这次实验,发现自己在编程上及一些函数的认识仍存在较大的问题, 以后 应该多多实践,提高自己的反应速度,加强逻辑思维能力。

 附录:源代码

 #in elude <win dows.h>

 #in elude <time.h>

 #in elude <stri ng>

 #in elude <iostream>

 #in elude <assert.h>

 using n amespaee std;

 bool tools[5]; // 全局变量,用餐工具

 CRITICAL_SECTION es; //信号量,在线程中使用,临界区 elass Philosopher

 {

 private:

 int nu mber;

 int status; /* 标记当前哲学家的状态,0表示正在等待

 (即处于饥饿状态),1表示得到两支筷子正在吃饭,2表示正在思考*/

 publie:

 Philosopher? nt num=0): status(2), nu mber( num) { } const int fin d()

 {

 return nu mber;

 }

 const int geti nfo()

 { return status; }

 void Cha nge() ; // 状态改变函数

 void dead_loek();

 }; _

 /////////

 void Philosopher::dead_loek()

 { _

 En terCritiealSeetion (&es) ; // 进入临界区

 stri ng s;

 if(status==1)

 tools[number%5]=true;

 // tools[(number-1)%5]=true;

 status=2;

 }

 else if(status==2)

 {

 status=0;

 //tools[(number-1)%5]=false;

 //tools[(number-1)%5]=true;

 }

 else if(status==0)

 {

 tools[number%5]=false; tools[(number-1)%5]=false; status=1;

 }

 LeaveCriticalSection (&cs) ;

 r/ ^? ■*““"*********"?

 }

 /////////

 void Philosopher::Change()

 {

 EnterCriticalSection (&cs) ; // 进入临界区 if(status==1) // 正在进餐

 {

 tools[number%5]=true; // 放下左手工具 tools[(number-1)%5]=true; // 放下右手工具 status=2; // 改变状态为思考

 }

 else if(status==2) // 思考中

 {

 status=0; // 改变状态为等待

 }

 else if(status==0) // 等待中

 左右手两边工具均为{ if(tools[number%5]&&tools[(number-1)%5]) // 空闲状态

 左右手两边工具均为

 {

 tools[number%5]=false; // 拿起左手工具 tools[(number-1)%5]=false; // 拿起右手工具 status=1;

 }

 }

 LeaveCriticalSection (&cs) ;

 }

 string print(Philosopher *pA)

 {

 //pA->Change();

 int i=pA->getinfo(); string str;

 if(i==0) str=" 等待 ";

 else if(i==1)

 str=" 就餐 ";

 else str=" 思考 ";

 return str;

 }

 string toolstatus(bool a)

 {

 string state; if(a==true) state=" 闲 ";

 if(a==false)

 state=" 用 ";

 return state;

 }

 int main()

 {

 char con='y'; // 判断是否继续

 // con = 'n';

 for(int i=0;i<5;i++)

 tools[i]=true; // 筷子都未使用,初始化

 Philosopher P1(1),P2(2),P3(3),P4(4),P5(5);

 InitializeCriticalSection (&cs) ; // 初始化初始化临界区

 cout<<"

 状态

 说明示意图:

  "<<endl;

 cout<<"

 "<<" 哲学家

 1 号的状态 "<<" "<<endl;

 cout<<"

 筷子 0 的状态 "<<"

 "<<"

 筷子 1 的状态 "<<endl;

 cout<<"

 哲学家 5 号的状态 "<<"

 "<<"

 哲学家 2 号的状态

 "<<endl;

 cout<<"

 筷子 4 的状态 "<<"

 "<<"

 筷子 2 的状态 "<<endl;

 cout<<"

 哲学家 4 号的状态 "<<"

 "<<"

 哲学家 3 号的状态 "<<endl;

 cout<<"

 "<<" 筷子

 3 的状态 "

 <<endl;

 //cout<<" "<<" 哲学家 3 号的状态 "<<" "<<endl; cout<<" 筷子的状态,用表示使用中,闲表示空闲中。

 "<<endl;

 cout<<"

 "<<endl;

 //cout<<" 哲学家们开始生活: "<<endl;

 //cout<<" 当前状态: "; cout<<endl;

 //cin>>con; while(con=='y') {

 P1.Change(); P2.Change(); P3.Change(); P4.Change(); P5.Change();

 cout<<" 当前状态为: "<<endl;

 cout<<" "<<P1.find()<<print(&P1)<<" "<<endl;

 cout<<" "<<toolstatus(tools[0])<<"

 "<<toolstatus(tools[1])<<endl;

 cout<<" "<<P5.find()<<print(&P5)<<"

 "<<P2.find()<<print(&P2)<<endl;

 cout<<" "<<toolstatus(tools[4])<<"

 "<<toolstatus(tools[2])<<endl;

 cout<<" "<<P4.find()<<print(&P4)<<"

 "<<P3.find()<<print(&P3)<<endl;

 cout<<" "<<toolstatus(tools[3])<<endl;

 cout<<" "<<endl;

 cout<<" 若要继续下一状态,输入 y;输入 n 进入死锁;输入其他,结束程 序:";

 cin>>con;

 Sleep(20);

 } while(con=='n') {

 P1.dead_lock();

 P2.dead_lock(); P3.dead_lock(); P4.dead_lock(); P5.dead_lock();

 cout<<" 死锁情况 "<<endl;

 cout<<" "<<P1.find()<<print(&P1)<<" "<<endl;

 cout<<" "<<toolstatus(tools[0])<<"

 "<<toolstatus(tools[1])<<endl;

 cout<<" "<<P5.find()<<print(&P5)<<"

 "<<P2.find()<<print(&P2)<<endl;

 cout<<" "<<toolstatus(tools[4])<<"

 "<<toolstatus(tools[2])<<endl;

 cout<<" "<<P4.find()<<print(&P4)<<"

 "<<P3.find()<<print(&P3)<<endl;

 cout<<" "<<toolstatus(tools[3])<<endl; cout<<" "<<endl;

 cout<<" 输入 n 继续;输入其他,结束程序:

 cin>>con;

 Sleep(20);

 退出资源区}

 退出资源区

 DeleteCriticalSection (&cs) ; // return 0;

 }

 Welcome !!!

 欢迎您的下载,

 资料仅供参考!

推荐访问:就餐 哲学家 新版 操作系统 实验