版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、-1-1-北京邮电大学操作系统实验-实验报告班号:姓名:学号:实验日期:20门门18实验名称:哲学家就餐问题(避免死锁)一、实验目的1、熟悉LINUX的基本环境,了解LINUX下进程和线程的实现三、实验内容(1)安装LINUX;(2)熟悉UNIX/LINUX的常用基本命令如Is、who、wc、pwd、ps、pstree、top,cat,cd,chgrp,chmod,chown,comm,cmp,cp,rm,diff,mv,rmdir等,了解系统的坏境。(3)利用pthread及系统的信号量(semaphore,h),实现哲学家进餐问题(避免死锁):四、项目要求及分析假如所有的诉学家都同时拿起左
2、侧筷子,看到右侧筷子不可用,又都放下左侧筷子,等一会儿,又同时拿起左侧筷子,如此这般,永远重复。对于这种情况,即所有的程序都在无限期地运行,但是都无法取得任何进展,即出现饥饿,所有哲学家都吃不上饭。规定在拿到左侧的筷子后,先检查右面的筷子是否可用。如果不可用,则先放下左侧筷子,等一段时间再重复整个过程。分析:当出现以卞情形,在某一个瞬间,所有的哲学家都同时启动这个算法,拿起左侧的筷子,而看到右侧筷子不可用,又都放下左侧筷子,等一会儿,又同时拿起左侧筷子如此这样永远重复下去。对于这种情况,所有的程序都在运行,但却无法取得进展,即出现饥饿,所有的哲学家都吃不上饭。解决死锁问题:为了避免死锁,把哲学
3、家分为三种状态,思考,饥饿,进食,并且一次拿到两只筷子,否则不拿。仅当一个哲学家左右两边筷子都可用时,才允许他拿筷子。这样要么一次占有两只筷子在吃面,然后释放所有资源;要么不占用资源。这样就不会导致死锁了。五、具体实现5.1、流程图(参考)5.2、添加函数的代码(所用到的各子函数)voidp_operate(intsemid,ushortseiraium)structsembufthesops;thesops.sem_num二seninum;thesopssem_op=l;thesops.SEm_flg二SEM_UND0;/thesopssem_flg=0:semop(semid,&theso
4、ps,1);voidvoperate(intsemid,ushortseiraium)structsembufthesops;thesops.sem_num二seninum;thesopssem_op=l;thesops.SEm_flg二SEM_UND0;/thesopssem_flg=0;semop(semid,&thesops,1);voidthink(intargi)#%d,Iwillthinkfor%dprintfClmphilosopher#%d,Iwillthinkfor%dsecondsnv,argi,argi+THINKTINE);sleep(argi+THINKTM);voi
5、deat(intargi)printf(/ZImphilosopher#%d,Iwill已atfor%dsecondsnz/,argi,argi+EATTIME);sleep(argi+EATTIME);voidtest(intargi,char*state,intsemid)if(stateargi=HUNGRY&stateLEFTI=EATING&stateRIGHTEATING)stateargiSEATING;printf(/zHehe,philosopher#%dcan已atnown,/,argi);v_operate(semid,argi);)else辻(stateargi!二HU
6、NGRY)printf(zzFaint,philosopher#%ddontwantto已atnz,,argi);elseprintfCOh,philosopher#%dcanteatnow!n,argi);voidtake_forks(intargi,char*state,intsemid)properate(semid,PhNum);stateargiHUNGRY;printf(“Philosopher#%dishungryCanheEat.n?,,argi);test(argi,statsemid);v_operate(semid,PhNum);properate(semid,argi)
7、;voidput_forks(intargi,char*state,intsemid)properate(semid,PhNum);stateargi=THINKING;printf(“Philosopher#%dEat0KCanhisneighbours已at.nargi);test(LEFT,statsemid);test(RIGHT,state,semid);v_operate(semid,PhNum);voidphilosopher(intargi,char*state,intsemid)while(1)-4-4think(argi);take_forks(argi,state,sem
8、id);eat(argi);put_forks(argi,state,semid);)5.3、修改原有函数部分代码(头文件变量定义主程序)#include#include#include#include#includesignalh#include#include#includestdlibh#definePhNum#defineLEFT#defineRIGHT5(PhNum+argil)%PhNum(argi+l)%PhNum#defineTHINKING0#defineHUNGRY1#defineEATING2#defineTHINKTINE4#defineEATTINE3unionsei
9、nunintval;struetsemid_ds*buf;ushort*array;intmain(intargc,char*argv)intsemkey,shmkey,semid,shmid,fori,forki,mynum;char*state;unionsemunargl;structshmid_dsarg2;ushortarrayPhNum+1;if(semid=semget(IPC.PRIVATE,PhNum+1,06001IPC.CREAT)二二一1)perror(zzSemgeterror!”);exit(l);辻(shmid=shmget(IPC.PRIVATE,PhNum,0
10、6001IPC.CREAT)二二T)semct1(semid,0,IPC_RMID,argl);perror(Z/Shmgeterror!“);exit(l);)arrayPhNum=l;for(fori=0:foriPhIIum;fori+)arrayfori=0:/*设置信号量数组初值*/arglarray二array;辻(semct1(semid,PhNum+1,SETALL,argl)=l)/*设置各信号量的初始值*/semct1(semid,0,IPC_RMID,argl);shmct1(shmid,IPC_RMID,&arg2);perrorCSetdefaulterror1);e
11、xit(l);if(state=shmat(shmid,0,0)=(char*)-1)/*将共享内存映射到当前进程地址空间*/semct1(semid,0,IPC_RMID,argl);shmct1(shmid,IPC_RMID,&arg2);perror(Shmaterror!);exit(l);)for(fori=0;foriPhNum;fori+)stateforiTHINKING;/*初始化状态数组*/signal(SIGINT,SIG_IGN);/*将进程对中断信号的处理设为忽略*/for(fori=l;fori=PhNum;fori+)/*创建5个哲学家子进程*/wh订e(fork
12、i=fork0)=1);辻(!forki)/*子进程执行代码*/mynum=foril;signal(SIGINT,SIG.DFL);/*设置子进程对SIGINT信号的处理过程*/-4-4break;辻(forki)vdiile(wait(char*)0)!=1);/*等待子进程执行结束,此处的(char*)0相当于NULL,即忽略返回状态*/semct1(semid,0,IPC_RMID,argl);shmdt(state);shmct1(shndd,IPC_RMID,&arg2);printf(z/nTmmonitor.Allisovern);)elsephilosopher(mynum,
13、state,semid);/*子进程调用*/六、调试运行结果唾)厲&创盟11月21日星期一10:21UfQmuyeTOQmuyemuye-laptop:文件(F)=6(V)终床E斜助(H)muy&?iTfuye-laptop:Sgccphilosopher.cImuyerouye-laptop:-S./a.outII*!philosopherImphilosophermuy&?iTfuye-laptop:Sgccphilosopher.cImuyerouye-laptop:-S./a.outII*!philosopherImphilosopherrmphilosopherInphilosoph
14、erImphilosopher#2.1willthink*14willthink#3,1willthink#4.1willthink*9,1willthinkfor6secondsfor5secondsfor7secondsfor8secondsfor4secondsPhilosopher#eishungry.canheeat.iHeherphilosophercaneatnowphilosopher#8,1willeatfor3secondsPhilosopher#1ishungry.Canheeat.Oh,philosopher#1canteatnow!Philosopher#2ishun
15、gry.canheeat.Hehe,philosopher#2caneatnowImphilosopher#2,1willeatfor5secondsPhilosopher#3ishungry.canheeat.:0h,philosopher#3canteatnow!.PhilosophereatO.K.CanhisneighbourseatFaint,philosopher#4dontwanttoeatOh,philos叩her#1canteatnow!rmphilosopher#8,1willthinkfor4secondsPhilosopher#4ishungry.Canheeat.Heherphllosopher#4caneatnow-HImph讥osopher#4,1willeatfor7secondsjPhilosopher2eatO.K.Canhisneighbourseat.Hehe.philosopher#1caneatnowOh,philosopher#3canteatnow!Imphilosopher#2,1willthinkfor6secondsll*mphilosopher#1,1willeatfor4seconds(PhilosopherMishungry
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025久和新科技(深圳)有限公司招聘商务专员等岗位7人(广东)笔试参考题库附带答案详解(3卷)
- 2025万家寨水务控股集团所属企业校园招聘82人笔试参考题库附带答案详解(3卷)
- 郴州市2024湖南郴州市引进高素质专业化党政人才120人笔试历年参考题库典型考点附带答案详解(3卷合一)
- 宜昌市2024年湖北宜昌市事业单位进校园(湖南大学站)人才引进招聘笔试历年参考题库典型考点附带答案详解(3卷合一)
- 天津市2024天津华北地质勘查局所属事业单位第二批招聘40笔试历年参考题库典型考点附带答案详解(3卷合一)
- 国家事业单位招聘2024国家自然资源部海洋发展战略研究所招聘在职人员拟聘人员笔试历年参考题库典型考点附带答案详解(3卷合一)
- 国家事业单位招聘2024中国科学院生物物理研究所学术支撑部招聘1人笔试历年参考题库典型考点附带答案详解(3卷合一)
- 南宁市2024广西南宁市青秀区自主招聘事业单位急需紧缺人才64人笔试历年参考题库典型考点附带答案详解(3卷合一)
- 上杭县2024福建省龙岩市上杭县上半年招聘部分机关事业单位编外工作人员笔试历年参考题库典型考点附带答案详解(3卷合一)
- 2025年福州市可持续发展城市研究院有限公司招聘备考题库参考答案详解
- 2025年下半年上海当代艺术博物馆公开招聘工作人员(第二批)参考笔试试题及答案解析
- “实用性阅读与交流”学习任务群的解读与实施
- 2024年江苏省普通高中学业水平测试小高考生物、地理、历史、政治试卷及答案(综合版)
- 方格网计算土方表格
- 学校计算机机房设计方案
- 证券投资案例分析题及答案
- 煎药室岗前培训PPT
- 家具制造企业安全检查表优质资料
- 如家酒店新版
- GA 1016-2012枪支(弹药)库室风险等级划分与安全防范要求
- 《电能质量分析》课程教学大纲
评论
0/150
提交评论