操作系统课程设计.docx
- 文档编号:8184484
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:16
- 大小:154.64KB
操作系统课程设计.docx
《操作系统课程设计.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计.docx(16页珍藏版)》请在冰豆网上搜索。
操作系统课程设计
安徽农业大学经济技术学院
《操作系统》课程设计
专业:
计算机科学与技术
年级:
08级
(1)班
学号:
08538005
学生姓名:
李明明
指导老师:
邵陆寿
成绩:
2010-12-4
课程设计要求
一、课程设计的目的
操作系统是计算机系统的核心系统软件,它负责控制和管理整个系统的资源并组织用户协调使用这些资源,使计算机高效的工作。
《操作系统课程设计》是《操作系统》理论课的必要补充,是复习和检验所学课程的重要手段,本课程设计的目的是综合应用我们所学知识,通过实验环节,加深对操作系统基本原理和工作过程的理解,提高独立分析问题、解决问题的能力,增强自身的动手能力。
二、课程设计的要求
1.分析设计内容,给出解决方案(要说明设计实现的原理,采用的数据结构)。
2.画出程序的基本结构框图和流程图。
3.对程序的每一部分要有详细的设计分析说明。
4.源代码格式要规范。
5.设计合适的测试用例,对得到的运行结果要有分析。
6.设计中遇到的问题,设计的心得体会。
7.按期提交完整的程序代码、可执行程序和课程设计报告。
银行家算法描述
1.课程设计题目描述
银行家算法是一种最有代表性的避免死锁的算法。
要解释银行家算法,必须先解释操作系统安全状态和不安全状态。
安全状态:
如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。
安全状态一定是没有死锁发生。
不安全状态:
不存在一个安全序列。
不安全状态不一定导致死锁。
那么什么是安全序列呢?
安全序列:
一个进程序列{P1,…,Pn}是安全的,如果对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj(j
2.银行家算法:
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
银行家算法原理
1.银行家算法的思路
先对用户提出的请求进行合法性检查,即检查请求的是不大于需要的,是否不大于可利用的。
若请求合法,则进行试分配。
2.银行家算法中用到的主要数据结构
可利用资源向量intAvailableA
需求总量矩阵intMaxA
资源占有矩阵intprocesses[p].a
需求矩阵intneed_a=MaxA-processes[p].a
申请各类资源数量intRequestp[a]进程p申请a资源的数量
3.银行家算法bank()
进程p发出请求申请k个a资源,Requestp[a]=k
(1)检查申请量是否不大于需求量:
Requestp[a]<=need_a,若条件不符重新输入,不允许申请大于需求量。
(2)检查申请量是否小于系统中的可利用资源数量:
Requestp[aj]<=availableA,若条件不符就申请失败,阻塞该进程,跳转到重新申请资源。
(3)若以上两个条件都满足,则系统试探着将资源分配给申请的进程,并修改下面数据结构中的数值:
AvailableA=AvailableA-Requestp[a];
processes[p].aprocesses[p].a=+Requestp[a];
need_a=need_a-Requestp[a];
(4)试分配后,执行安全性检查,调用safe()函数检查此次资源分配后系统是否处于安全状态。
若安全,才正式将资源分配给进程;否则本次试探分配作废,恢复原来的资源分配状态,让该进程等待。
源程序结构分析及代码实现
1.银行家算法流程图
图1主要流程图
1)新加作业
2)为作业申请资源
2.代码实现:
#include
#include
#include
#include
#include
#include
constintMAX_P=20;//控制作业的个数
constintMAXA=10;//定义A类资源的数量
constintMAXB=5;//定义B类资源的数量
constintMAXC=7;//定义C类资源的数量
typedefstructnode{
inta;
intb;
intc;
intremain_a;//定义剩余A类资源的数量
intremain_b;//定义剩余B类资源的数量
intremain_c;//定义剩余C类资源的数量
}bank;
typedefstructnode1{
charname[20];作业个数最多为20个
inta;
intb;
intc;
intneed_a;//定义所需A类资源
intneed_b;//定义所需B类资源
intneed_c;//定义所需C类资源
}process;
bankbanker;
processprocesses[MAX_P];
intquantity;
//初始化函数
voidinitial()
{
inti;
banker.a=MAXA;//A类资源总数
banker.b=MAXB;//B类资源总数
banker.c=MAXC;//C类资源总数/
banker.remain_a=MAXA;//开始时剩余A类资源总数
banker.remain_b=MAXB;//开始时剩余B类资源总数
banker.remain_c=MAXC;//开始时剩余C类资源总数
for(i=0;i strcpy(processes[i].name,""); processes[i].a=0; processes[i].b=0; processes[i].c=0; processes[i].need_a=0;//作业I所需A类资源的数量 processes[i].need_b=0;//作业I所需B类资源的数量 processes[i].need_c=0;//作业I所需C类资源的数量 } } //新加作业 voidadd() { charname[20];//控制作业的数量 intflag=0; intt; intneed_a,need_b,need_c;//定义需要A,B,以及C类资源的数量 inti; cout< cout<<"新加作业"< cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━"< cout<<"请输入新加作业名: "; cin>>name; for(i=0;i if(! strcmp(processes[i].name,name))//判断新加作业是否与已有作业同名 { flag=1; break; } } if(flag){ cout<<"错误,作业已存在"< } else{ cout<<"本作业所需A类资源: "; cin>>need_a; cout<<"本作业所需B类资源: "; cin>>need_b; cout<<"本作业所需C类资源: "; cin>>need_c; t=1; cout< if(need_a>banker.remain_a){ cout<<"错误,所需A类资源大于银行家所剩A类资源"< t=0; } if(need_b>banker.remain_b){ cout<<"错误,所需B类资源大于银行家所剩B类资源"< t=0; } if(need_c>banker.remain_c){ cout<<"错误,所需C类资源大于银行家所剩C类资源"< t=0; } if(t){ strcpy(processes[quantity].name,name); processes[quantity].need_a=need_a; processes[quantity].need_b=need_b; processes[quantity].need_c=need_c; quantity++; cout<<"新加作业成功"< } else{ cout<<"新加作业失败"< } } } //为作业申请资源 voidbid() { charname[20]; inti,p; inta,b,c; intflag; cout< cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━"< cout<<"要申请资源的作业名: "; cin>>name; p=-1; for(i=0;i if(! strcmp(processes[i].name,name)){ p=i; break; } } if(p! =-1){ cout<<"该作业要申请A类资源数量: "; cin>>a; cout<<"该作业要申请B类资源数量: "; cin>>b; cout<<"该作业要申请C类资源数量: "; cin>>c; flag=1; if((a>banker.remain_a)||(a>processes[p].need_a-processes[p].a)){ cout<<"错误,所申请A类资源大于银行家所剩A类资源或该进程还需数量"< flag=0;} if((b>banker.remain_b)||(b>processes[p].need_b-processes[p].b)){ cout<<"错误,所申请B类资源大于银行家所剩B类资源或该进程还需数量"< flag=0;} if((c>banker.remain_c)||(c>processes[p].need_c-processes[p].c)){ cout<<"错误,所申请C类资源大于银行家所剩C类资源或该进程还需数量"< flag=0; } if(flag){ banker.remain_a-=a;//申请成功所剩A类资源数等于以前剩余A类资源的减去申请的A类资源数 banker.remain_b-=b;//申请成功所剩B类资源数等于以前剩余B类资源的减去申请的B类资源数 banker.remain_c-=c;//申请成功所剩C类资源数等于以前剩余C类资源的减去申请的C类资源数 processes[p].a+=a;//申请成功占有A类资源等于以前占有的A类资源加上申请的A类资源的个数 processes[p].b+=b;//申请成功占有A类资源等于以前占有的B类资源加上申请的A类资源的个数 processes[p].c+=c;//申请成功占有A类资源等于以前占有的C类资源加上申请的A类资源的个数 cout<<"为作业申请资源成功"< } else{ cout<<"为作业申请资源失败"< } } else{ cout<<"该作业不存在"< } } //撤消作业 voidfinished() { charname[20]; inti,p; cout< cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━"< cout<<"要撤消作业名: "; cin>>name; p=-1; for(i=0;i if(! strcmp(processes[i].name,name)){ p=i; break; } } if(p! =-1){ banker.remain_a+=processes[p].a;//撤销后剩余资源的个数等于作业占有的个数加上以前的剩余个数 banker.remain_b+=processes[p].b;//作业撤销后剩余B类资源的个数 banker.remain_c+=processes[p].c;//作业撤销后剩余C类资源的个数 for(i=p;i processes[i]=processes[i+1]; } strcpy(processes[quantity-1].name,""); processes[quantity-1].a=0;//撤销作业后作业占有的资源为0 processes[quantity-1].b=0; processes[quantity-1].c=0; processes[quantity-1].need_a=0;//撤销作业后作业所需资源数也为0 processes[quantity-1].need_b=0; processes[quantity-1].need_c=0; quantity--; cout<<"撤消作业成功"< } else{ cout<<"撤消作业失败"< } } //查看资源情况 voidview() { inti; cout< cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━"< cout<<"银行家所剩资源(剩余资源/总共资源)"< cout<<"A类: "< cout<<"B类: "< cout<<"C类: "< cout< if(quantity>0){ for(i=0;i cout<<"作业名: "< cout<<"A类: "< cout<<"B类: "< cout<<"C类: "< cout< } } else{ cout<<"当前没有作业"< } } //显示版权信息函数 voidversion() { cout< cout<<" 银行家算法 "< } voidmain() { intchioce; intflag=1; initial(); version(); while(flag){ cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━"< cout<<"1.新加作业2.为作业申请资源3.撤消作业"< cout<<"4.查看资源情况0.退出系统"< cout<<"请选择: "; cin>>chioce; switch(chioce)//选择函数 { case1: add(); break; case2: bid(); break; case3: finished(); break; case4: view(); break; case0: flag=0; break; default: cout<<"选择错误"< } } } 3程序调试结果: 1)新加作业运行结果: 2)为作业申请资源运行结果: 3)查看资源情况运行结果: 4)撤销作业运行结果: 课程设计心得 1.对银行家算法的实验原理有更深的理解。 2.对银行家算法在实践中的应用有深刻的理解。 在实践的基础上,把所学过的知识应用于实际应用,更深刻的理解了银行家算法以及操作系统设计原理的实际应用。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)