ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:151.84KB ,
资源ID:17335303      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-17335303.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(银行家算法.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

银行家算法.docx

1、银行家算法淮海工学院计算机工程学院实验报告书 课程名: 操作系统原理 题 目: 银行家算法 班 级: 学 号: 姓 名: 实验报告要求1 目的与要求 银行家算法是操作系统中避免死锁的典型算法,本实验可以加深对银行家算法的步骤和相关数据结构用法的更好理解。2 实验内容 用C语言编写一个简单的银行家算法模拟程序,用银行家算法实现资源分配。程序能模拟多个进程共享多种资源的情形。进程可动态地申请资源,系统按各进程的申请动态地分配资源。要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源数量以及为某进程分配资源后的有关资源数据的情况。3 实验步骤1 认真理解好

2、课本中银行家算法的实例。2 根据课本中银行家算法的描述,画出程序流程图。3 按照程序流程图,用C语言编程并实现。流程图:代码:#include#include#include#define MaxResource 10 / 最大系统资源类#define NULL 0struct pcb /定义进程控制块PCB int pid; /进程标号 int MaxMaxResource; / 表示某个进程对某类资源的最大需求 int AllocationMaxResource; / 表示某个进程已分配到某类资源的个数 int NeedMaxResource; / 表示某个进程尚需要某类资源的个数 int

3、 markMaxResource; /在使用FreeRecourse是以确定是否释放资源 pcb *next; ;void Initialize(pcb *&head,int m,int n, int AvailableMaxResource) /初始化进程资源值 int i,j=0; void AddPcb(pcb *&head,pcb node); pcb node; printf(t*请输入%d进程的%d个最大资源数*tn,n,m); do node.pid=j; printf(请输入第 %d个进程最大需求资源数:n,node.pid); for(i=0;im;i+) scanf(%d,

4、&node.Maxi); printf(系统给进程%d随机分配资源数为:n ,node.pid); for(i=0;im;i+) node.Allocationi=rand()%node.Maxi; printf(%10d,node.Allocationi); Availablei=Availablei-node.Allocationi; printf(n); printf(进程%d还所需的资源数为:n,node.pid); for(i=0;im;i+) node.Needi=node.Maxi-node.Allocationi; printf(%10d,node.Needi); for(i=

5、0;im;i+) node.marki=0; printf(n); AddPcb(head,node); j+; while(jnext=NULL; if(head=NULL)head=p; else last=head; while(last-next!=NULL) last=last-next; last-next=p; void ShowPcb(pcb *head,int *avail,int m) /显示进程初始化的资源值 pcb *p=NULL; int j; p=head; if(p=NULL) printf(当前没有进程,请重新输入进程!n); exit(0); else pri

6、ntf(进程号 最大资源值 已分配资源 还需资源 可利用的资源 状态nn); while(p!=NULL) printf(p%d,p-pid); for(j=0;jMaxj,p-Allocationj,p-Needj,availj); if(p-markj)printf( 已执行n); else printf( 等待n); p=p-next; pcb *Seek(pcb *head,int pid) /查找进程在链表中的位置 pcb *p=NULL; p=head; if(p=NULL) printf(没有进程,进程链表空!n); return p; else while(p!=NULL) i

7、f(p-pid=pid)break; else p=p-next; if(NULL=p) printf(没有这个进程!n); return p; else return p; void FreeResource(pcb *&head,int AvailableMaxResource,int m)/若进程所需资源已全部分配,则释放该进程占据的全部系统资源 pcb *p=NULL; int i; p=head; if(!p)printf(没有进程,请先初始化进程!); else for(i=0;iNeedi=NULL)&(p-marki=NULL) printf(进程%d的第%d个已经执行完,释放

8、所占系统资源!n,p-pid,i); Availablei+=p-Allocationi; p-marki=1; pcb *Application(pcb *head,int *request,int *avail,int m) /再次给进程分配资源 int pid,i; pcb *p=NULL; printf(请输入进程pid号: n); printf(p); scanf(%d,&pid); p=Seek(head,pid); if(p=NULL) printf(没有这个进程!n); return p; printf(请输入给该进程再次分配的资源数: n); for(i=0;im;i+) s

9、canf(%d,&requesti); for(i=0;ip-Needi) printf(分配进程的资源数超过最大资源数!n); return NULL; for(i=0;iavaili) printf(分配进程的资源数超过可利用的资源数!n); return NULL; for(i=0;iAllocationi=p-Allocationi + requesti; p-Needi=p-Needi - requesti; FreeResource(p,avail,m);return p;pcb *Reasonable(pcb *head,int *finish,int *work,int m,i

10、nt n) /找到当前安全可执行的进程返回 int i=0,j=0,count=0; pcb *p=NULL; while(1) if(finishi!=-1) p=Seek(head,finishi); if(p!=NULL) for(j=0;jNeedjworkj)break; else continue; if(j=m)return p;/p进程安全 else i+; else i+; if(i=n)return NULL; void Alter(pcb *p,int* work,int* finish,int recordMaxResource,int m) /修改相关进程的资源值 i

11、nt i; for(i=0;ipidi=worki; worki=worki+p-Allocationi; finishp-pid=-1; int SafetyCheck(pcb *head,int *avail,int *safety,int RecordMaxResource,int m,int n) /进程安全性算法 int *work=NULL; int *finish=NULL; pcb *p=NULL; pcb *pro=NULL; int i,count=0; work=(int*)malloc(m*sizeof(int); finish=(int*)malloc(n*sizeo

12、f(int); p=head; for(i=0;ipid; p=p-next; i+; i=0; while(countpid; i+; else printf(当前的系统处于不安全状态!n); break; if(count=n) printf(当前系统处于安全状态,存在一个安全序列 :n); for(i=0;i,safetyi); printf(n); free(finish); free(work); finish=NULL; work=NULL; if(count=n)return 1; else return 0; void ReturnSource(pcb *p,int *requ

13、est,int *avail,int m) /若试分配失败,则恢复试分配前的资源状态 int i; for(i=0;iAllocationi-=requesti; p-Needi+=requesti; availi+=requesti; void main() int n,m; char ch; int i,flag=0; int AvailableMaxResource=0; int RequestMaxResource=0; int RecordMaxResourceMaxResource=0; int SafetyMaxResource=0; /记录安全序列 pcb *head,*pro

14、cess; head=NULL;process=NULL; printf(tt*欢迎使用银行家算法*ttn); printf(请输入进程数:n); scanf(%d,&n); printf(请输入资源数:n); scanf(%d,&m); if(mMaxResource) printf(请输入资源数超过系统最大资源数,请重新输入!n); scanf(%d,&m); printf(请输入系统总共可利用的资源数值:n); for(i=0;im;i+) scanf(%d,&Availablei); Initialize(head,m,n,Available); printf(系统为进程分配资源如下表

15、:n); ShowPcb(head,Available,m); do flag=SafetyCheck(head,Available,Safety,Record,m,n); if(flag) printf(系统是安全的,可以再申请资源n); do process=Application(head,Request,Available,m); if(process!=NULL) printf(系统资源分配如下表:n); ShowPcb(head,Available,m); break; else printf(请求申请资源不能满足!n); printf(是否重新申请:Y 重新申请 N 退出n);

16、getchar(); scanf(%c,&ch); if(ch=N| ch=n)exit(0); while(ch=Y|ch=y); printf(是否还要继续操作,请选择:Y 是 N 否n); getchar(); scanf(%c,&ch); if(!flag) printf(系统处于不安全状态,本次申请分配作废,恢复原来的资源分配状态!n); ReturnSource(process,Request,Available,m); printf(系统原有分配资源如下表:n); ShowPcb(head,Available,m); printf(是否还要继续操作,请选择:Y 是 N 否n); getchar(); scanf(%c,&ch); while(ch=Y| ch=y); printf(*欢迎下次使用银行家算法*n); 截图:图1图2图3图4图54 结果分析与实验体会5.思考题1 要找出某一状态下所有可能的安全序列,程序该如何实现?2 银行家算法的局限性有哪些?

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2