死锁问题.doc
《死锁问题.doc》由会员分享,可在线阅读,更多相关《死锁问题.doc(10页珍藏版)》请在咨信网上搜索。
1、。 哲学家就餐问题与死锁2.1 设计目的理解死锁的概念,掌握死锁预防方法。死锁是进程并发执行过程中可能出现的现象,哲学家就餐问题是描述死锁的经典例子。假设有几位哲学家围坐在一张餐桌旁,桌上有吃不尽的食品,每两位哲学家之间摆放着一根筷子,筷子的个数与哲学家的数量相等,每一位哲学家要么思考,要么等待,要么拿起左右两根筷子进餐。本设计假设有五个哲学家和五根筷子,它们的编号都是从0到4。 如果每位哲学家都拿起左边的筷子,就会发生死锁。为了防止死锁,可以采用资源预分配法或者资源按序分配法。资源预分配法是指进程在运行前一次性地向系统申请它所需要的全部资源,如果系统当前不能够满足进程的全部资源请求,则不分配
2、资源, 此进程暂不投入运行,如果系统当前能够满足进程的全部资源请求, 则一次性地将所申请的资源全部分配给申请进程。资源按序分配法是指事先将所有资源类全排序, 即赋予每一个资源类一个唯一的整数,规定进程必需按照资源编号由小到大的次序申请资源。在哲学家就餐问题中,要采用资源预分配法只需让每个哲学家同时申请左右两根筷子。要采用资源按序分配法只需规定每个哲学家先申请左右两根筷子中编号小的筷子,再申请编号大的筷子。2.2 设计要求利用多线程技术编写哲学家就餐程序,使之在运行时能演示产生死锁的情况,也能演示采用死锁防止方法后不产生死锁的情况。程序要采用简单的控制台界面,运行后在屏幕上显示功能菜单,列出该程
3、序具有的功能,供用户选择,用户选择功能后应该转到相应的处理程序。程序应该包括以下功能:(1)演示死锁现象;(2)通过资源按序分配法防止死锁;(3)通过资源预分配法防止死锁;(4)退出。2.3 设计步骤2.3.1 程序结构设计程序需要六个线程,主线程用于显示主菜单,接收用户的功能选择;五个哲学家线程用于模拟哲学家的活动,即不停地思考、饥饿、进食。相邻的两个哲学家线程需要共享他们中间的同一根筷子,因此对每一根筷子的使用要互斥,用互斥体数组h_mutex_chopsticks来实现。主线程创建五个哲学家线程后要等待所有哲学家结束,用线程句柄数组h_thread来表示五个线程,主线程通过等待这五个线程
4、句柄来实现同步。该程序共有7个函数,这些函数可以分成4组。各组包含的函数及其功能如表2-1所示。组别包括函数函数功能一main()显示主菜单,接收用户的选择并执行相应的功能。二deadlock_philosopher()deadlock()演示死锁情况的哲学家线程函数初始化函数:创建五个哲学家并等待它们结束三ordered_allocation_philosopher()ordered_allocation()通过按序分配法防止死锁的哲学家线程函数初始化函数:创建五个哲学家并等待它们结束四pre_allocation_philosopher()pre_allocation()通过预先分配法防止
5、死锁的哲学家线程函数初始化函数:创建五个哲学家并等待它们结束图2-1 函数及其功能2.3.2 算法设计下面给出主要函数的算法描述。(1)deadlock_philosopher函数 while(1)随机等待一段时间;提示等待左边筷子;申请左边筷子;随机等待一段时间;提示等待右边筷子;申请右边筷子;提示正在进餐;放下左边筷子;放下右边筷子;(2)ordered_allocation_philosopher函数 while(1)随机等待一段时间;提示等待左右两边编号较小的筷子;申请编号较小的筷子;随机等待一段时间;提示等待左右两边编号较大的筷子;申请编号较大的筷子;提示正在进餐;放下编号较小的筷子
6、;放下编号较大的筷子;(3)pre_allocation_philosopher函数 while(1)提示等待左边筷子;提示等待右边筷子;同时申请左边和右边两根筷子;提示正在进餐;随机等待一段时间;放下左边筷子;放下右边筷子;(4)deadlock函数为每根筷子创建一个互斥信号量;创建五个可能产生死锁的哲学家线程;等待五个哲学家线程结束;其他的初始化函数与deadlock()的算法相同,只不过在创建线程时使用不同的线程函数。在windows中可以用系统调用WaitForMultipleObjects()同时申请两份资源,具体解法如下所示。#define N 5 typedef enumthin
7、king, hungry, eatingstatus; status stateN; semaphore selfN;semaphore mutex = 1;void test(int i) if(statei = hungry)& (state(i-1)%N != eating)& (state(i+1)%N != eating) statei = eating; V(selfi); void pick_chopsticks(int i) P(mutex); statei = hungry; test(i); V(mutex); P(selfi); void put_chopsticks(i
8、nt i) P(mutex); statei = thinking; test(i-1)%N); test(i+1)%N); V(mutex); void philosopher(int i) while(1) think(); pick_chopsticks(i); eat(); put_chopsticks(i); void main int i; for(i=0;i5;i+)statei = thingking;selfi.value = 0; 在上述程序中, 自定义数据类型status用来枚举哲学家的状态,数组state用来存放五个哲学家的状态,由于该数组是全局变量,所以用信号灯变量m
9、utex实现对它的互斥访问。信号量数组self包含五个元素,每个元素的初始值皆为0,当第i号哲学家不具备进食条件时,会将自己阻塞在信号量selfi上。函数test用于测试i号哲学家是否具备进食的条件。i号哲学家可以进食必须同时满足以下条件:i号哲学家饥饿,左边哲学家不在进食,右边哲学家不在进食。2.3.3 参考源代码2.3.3.1 windows下的参考源程序#include #include #include #include #include #include #include #define MAX_PHILOSOPHERS 5 /待测试的哲学家数#define ZERO 48 /数字0
10、的ASCII码#define DELAY rand()%25HANDLE h_mutex_chopsticksMAX_PHILOSOPHERS; /互斥体数组,每根筷子需要一个互斥体int thread_numberMAX_PHILOSOPHERS=0,1,2,3,4;/会产生死锁的哲学家线程int deadlock_philosopher(LPVOID data)int philosopher_number=*(int *)(data); /哲学家编号for(;)srand( (unsigned)time( NULL ) * ( philosopher_number+ 1) ); Sleep
11、(DELAY); printf(%s%c%s%cn,Philosopher ,ZERO+philosopher_number, is waiting chopstick ,(ZERO+philosopher_number); WaitForSingleObject(h_mutex_chopsticksphilosopher_number, INFINITE); printf(%s%c%s%cn,Philosopher ,ZERO+philosopher_number, got chopstick ,(ZERO+philosopher_number);Sleep(DELAY/4);printf(
12、%s%c%s%cn,Philosopher ,ZERO+philosopher_number, is waiting chopstick ,(ZERO+(1+philosopher_number)%MAX_PHILOSOPHERS); WaitForSingleObject(h_mutex_chopsticks(1+philosopher_number)%MAX_PHILOSOPHERS), INFINITE); printf(%s%c%s%cn,Philosopher ,ZERO+philosopher_number, got chopstick ,(ZERO+(1+philosopher_
13、number)%MAX_PHILOSOPHERS); printf(%s%c%sn,Philosopher ,ZERO+philosopher_number, is eating.); Sleep(DELAY); ReleaseMutex(h_mutex_chopsticksphilosopher_number);printf(%s%c%s%cn,Philosopher ,ZERO+philosopher_number, released chopstick ,ZERO+philosopher_number); ReleaseMutex(h_mutex_chopsticks(1+philoso
14、pher_number)%MAX_PHILOSOPHERS);printf(%s%c%s%cn,Philosopher ,ZERO+philosopher_number, released chopstick ,(ZERO+(1+philosopher_number)%MAX_PHILOSOPHERS); Sleep(DELAY); / end forreturn 0;/死锁时的初始化程序void deadlock()int i=0;HANDLE h_threadMAX_PHILOSOPHERS;printf(可能出现死锁的哲学家就餐问题n);for(i=0;iMAX_PHILOSOPHERS
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 死锁 问题
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【w****g】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【w****g】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。