银行家算法C语言实现-课程设计_第1页
银行家算法C语言实现-课程设计_第2页
银行家算法C语言实现-课程设计_第3页
银行家算法C语言实现-课程设计_第4页
银行家算法C语言实现-课程设计_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

银行家算法银行家算法C C语言实现语言实现 课程设计课程设计 编编程模程模拟实现拟实现生生产产者者 消消费费者者问题问题 一 实验目的与实验项目介绍 银行家算法是最有代表性的避免死锁的算法 由于该算法能用于银行系统现金贷款的发 放而得名 其实现思想是 允许进程动态地申请资源 系统在每次实施资源分配之前 先 计算资源分配的安全性 若此次资源分配安全 即资源分配后 系统能按某种顺序来为每 个进程分配其所需的资源 直至最大需求 使每个进程都可以顺利地完成 便将资源分 配给进程 否则不分配资源 让进程等待 实验的目的 1 加深对死锁概念的理解 2 能够利用银行家算法 有效避免死锁的发生 或检测死锁的存在 二 实验项目方案设计 1 定义银行家算法中的数据结构available allocation need 等 利用定义的全局变量来进行函数间值的传递 2 此实验通过3个函数实现 a 主函数 main b 安全检测函数 check c 输出函数 print 3 主函数 main 的实现 输入已知条件 利用安全检测函数检测已知的进程分配情况是否 为安全状况 如果为安全 则输入需请求资源的进程号和所需资源数 否则结束主函数 reqi 为进程i的请求向量 进行银行家算法 1 如果reqi j need i j 则认为出错 输出请求的资源 数超过它所需的最大数 否则执行 2 2 如果reqi j available i j 则输出尚无足够的资源 否则执行 3 3 系统试探着把资源分配给进程i 并修改下面数据结构中的数值 available j available j reqi j allocation i j allocation i j reqi j need i j need i j reqi j 并且保存修改前的数值 4 系统执行安全性算法 如果不安全则还原 3 中保存的avai lable j allocation i j need i j 的值 最后输入是否要继续 如继续则转至前面的输入请求资源的进程号 否则退出 4 安全检测函数 check 1 设置两个向量work和finish work available 表示系统可提供给进程继续运行所需的各类资源数目 finish表示系统是否有 足够的资源分配给进程 使之完成 开始时先做finish i false 当有足够资源分配给进程时 再令finish i true 2 从进程集合中找到一个能满足下述条件的进程 a finish i false b need i j work j 若找到 执行 3 否则 执行 4 3 当进程i获得资源后 可顺利执行 直到完成 并释放出分配给它的资源 故应执行 work j work j allocation i j finish i true a v i 记录安全序列 go to step 2 4 如果所有进程的finish i true都满足 则表示系统处于安全状态 输出安全序列 否则 系统处于不安全状态 5 输出函数 print 利用循环体输出各进程号 已分配的资源数数 仍需要的资源数 剩余的可用资源数 三 实验实施步骤 1 在TC上新建一个文件 并保存为bank1 在编辑界面中输入以下代码 define M 50 int allocation M M need M M available M 定义全局变量 int n m r main void check void print int i j p 0 q 0 int req M allocation1 M M need1 M M available1 M printf Please input the sum of processes scanf d 输入进程总数 printf Please input the sum of kinds scanf d 输入资源种类总数 printf Please input the known condition n printf Allocation n for i 0 i n i for j 0 j m j scanf d 输入已知的进程已分配资源数 printf Need n for i 0 i n i for j 0 j m j scanf d 输入已知的进程还需要的资源数 printf Available n for i 0 i m i scanf d 输入已知的可用资源数 print 输出各已知条件 check 检测已知的状态是否安全 if r 1 如果已知的状态安全则执行以下代码 do printf nplease input the NO of process scanf d 输入请求资源的进程号 printf please input the resources of request A B C for j 0 j m j scanf d 输入该进程所需的资源数 p 0 q 0 for j 0 jneed i j p 1 判断请求是否超过它所宣布的最大资源数 if p printf The resources of request have been beyond the max number needed else for j 0 javailable j q 1 判断请求是否超过可用资源数 if q printf There are not enough available resources else for j 0 j m j 请求满足条件86 银行家算法C语言实现 available1 j available j 保存原已分配的资源数 allocation1 i j allocation i j 仍需要的资源数 和可用的 need1 i j need i j 资源数 available j available j req j 系统尝试把资源分配 allocation i j allocation i j req j 给请求的进程 need i j need i j req j print check 进行安全检测 if r 0 分配后状态不安全 for j 0 j m j available j available1 j 还原分配前的已分配的资 allocation i j allocation1 i j 源数 仍需要的资源数 need i j need1 i j 和可用的资源数 printf return n print printf nDo you want to continue y or n n 判断是否继续进行资源分配 while getch y void check 检测函数 int k f v 0 i j int work M a M finish M r 1 for i 0 i n i finish i 0 初始化各进程均没得到足够资源并完成 for i 0 i m i work i available i 用work i 表示可提供进程继续运行的各类资源数 k n do for i 0 i n i if finish i 0 f 1 for j 0 jwork j f 0 if f 1 找到还没完成的且需求数小于可提供进程继续运行的 finish i 1 资源数的进程 a v i 记录安全序列 for j 0 j0 f 1 for i 0 i n i 判断是否所有的进程都完成 if finish i 0 f 0 break if f 0 若有进程没完成 则为不安全状态 printf This is unsafe n r 0 else 否则为安全状态 printf This is safe and the safe number is for i 0 i n i printf d a i 输出安全序列 void print 输出函数 int i j int process M printf Process t Allocation t Need n 系统免费 printf 2d need i j printf n printf Available n for i 0 i m i printf 2d available i printf n 运行以上程序代码 其中一种输出结果如下 银行家算法C语言实现 四 实验小结与心得 1 银行家算法的关键在于安全性算法 n遍检测所有进程后 如系统处于安全状态 一定能 使n个进程都完成 2 要注意当系统试探着把资源分配给进程后 如此时检测到系统处于不安全状态 则此时 系统不把资源分配给该进程 请联系 这时要还原尝试分配时所改变的各数据结构中的数值 3 刚开始做这个课程设计时不知道从哪里入手 后来到图书馆和网上查了些资料 觉得并不难 但是真正做起来才发现很多细节问题都忘了考虑 银行家算法中可能出现的 情况比较多 所以需要考虑的方面也比较多 经过了反复的思考和多次的修改才得出了以上 的结果 通过这次的课程设计 对银行家算法有了更深的认识 并能掌握其设计思想 这两 个程序都可以 bank是事先确定好已知的allocation need available 输入简单 bank1怎没固定已知条件中的allocation need available 须手动输入 但适用更广 define M 50 int allocation M M need M M available M int n m r main void check void print int i j p 0 q 0 int req M allocation1 M M need1 M M available1 M printf Please input the sum of processes scanf d for j 0 j m j scanf d printf Available n for i 0 i m i scanf d print check if r 1 do printf nplease input the NO of process scanf d printf please input the resources of request A B C for j 0 j m j scanf d p 0 q 0 for j 0 jneed i j p 1 if p printf The resources of request have been beyond the max number needed else for j 0 javailable j q 1 if q printf There are not enough available resources else for j 0 j m j available1 j available j allocation1 i j allocation i j need1 i j need i j available j available j req j allocation i j allocation i j req j need i j need i j req j print check if r 0 for j 0 j m j available j available1 j allocation i j allocation1 i j need i j need1 i j printf return n print printf nDo you want to continue y or n while getch y void check int k f v 0 i j int work M a M finish M r 1 for i 0 i n i finish i 0 for i 0 i m i work i available i k n do for i 0 i n i if finish i 0 f 1 for j 0 jwork j f 0 if f 1 finish i 1 a v i for j 0 j0 f 1 for i 0 i n i if finish i 0 f 0 break if f 0 printf This is unsafe n r 0 else printf This is safe and the safe number is for i 0 i n i printf d a i void print int i j int process M printf Process t Allocation t Need n for i 0 i n i process i i printf n printf Available n for i 0 i m i printf 2d available i printf n include define m 3 define n 5 struct REQUEST int x int requ m req int allocation1 n m need1 n m available1 m int r t void check int allocation m int available m int need m void print int allocation m int available m int need m main int i j p 0 q 0 int allocation n m 0 1 0 2 0 0 3 0 2 2 1 1 0 0 2 int need n m 7 4 3 1 2 2 6 0 0 0 1 1 4 3 1 int available m 3 3 2 print allocation available need check allocation available need if t 1 do printf nplease input the NO of process scanf d r req x printf please input the resouces of request A B C for j 0 j m j scanf d p 0 q 0 for j 0 jneed r j p 1 if p printf nThe resouces of request have been beyond the max number needed else for j 0 javailable j q 1 if q printf nThere are not enough available resouces else for j 0 j m j available1 j available j allocation1 r j allocation r j need1 r j need r j available j available j req requ j allocation r j allocation r j req requ j need r j need r j req requ j print allocation available need check allocation available need if t 0 for j 0 j m j allocation r j allocation1 r j need r j need1 r j available j available1 j printf return n print allocation

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论