操作系统pzm.docx
- 文档编号:5646204
- 上传时间:2022-12-30
- 格式:DOCX
- 页数:29
- 大小:248.65KB
操作系统pzm.docx
《操作系统pzm.docx》由会员分享,可在线阅读,更多相关《操作系统pzm.docx(29页珍藏版)》请在冰豆网上搜索。
操作系统pzm
实验报告
实验课程:
操作系统
学生姓名:
刘璐
学号:
6100408116
专业班级:
电气Ⅲ083班
09年12月21日
目录
南昌大学实验报告2
---
(1)编程实现银行家安全算法2
南昌大学实验报告13
---
(2)存储管理的模拟实现13
南昌大学实验报告19
---(3)磁盘调度算法的模拟实现19
南昌大学实验报告
---
(1)编程实现银行家安全算法
学生姓名:
刘璐学号:
6100408116专业班级:
电气Ⅲ类083班
实验类型:
□验证□综合■设计□创新实验日期:
11.5,11.12实验成绩:
一、实验目的
通过实验加强对银行家安全算法的理解和掌握。
二、实验内容
熟悉避免死锁发生的方法,死锁与安全序列的关系,编程实现银行家算法,要求输出进程的安全序列。
三、实验要求
1、需写出设计说明;
2、设计实现代码及说明
3、运行结果;
四、主要实验步骤
设计说明
数据结构
1.可利用资源向量Available
2.最大需求矩阵Max
3.分配矩阵Allocation
4.需求矩阵Need
银行家算法
1.如果Request<=Need,则转向2;否则,出错
2.如果Request<=Available,则转向3,否则等待
3.系统试探分配请求的资源给进程
4.系统执行安全性算法
安全性算法
1.设置两个向量
(1).工作向量:
Work=Available(表示系统可提供给进程继续运行所需要的各类资源数目)
(2).Finish:
表示系统是否有足够资源分配给进程(True:
有;False:
没有).初始化为False
2.若Finish[i]=False&&Need<=Work,则执行3;否则执行4(I为资源类别)
3.进程P获得第i类资源,则顺利执行直至完成!
并释放资源:
Work=Work+Allocation;
Finish[i]=true;
转2
4.若所有进程的Finish[i]=true,则表示系统安全;否则,不安全!
代码及说明
#include
#include
#include
#include
//定义全局变量
constintx=10,y=10;//常量,便于修改
intAvailable[x];//各资源可利用的数量
intAllocation[y][y];//各进程当前已分配的资源数量
intMax[y][y];//各进程对各类资源的最大需求数
intNeed[y][y];//尚需多少资源
intRequest[x];//申请多少资源
intWork[x];//工作向量,表示系统可提供给进程继续运行所需的各类资源数量
intFinish[y];//表示系统是否有足够的资源分配给进程,1为是
intp[y];//存储安全序列
inti,j;//i表示进程,j表示资源
intn,m;//n为进程i的数量,m为资源j种类数
intl=0;//l用来记录有几个进程是Finish[i]=1的,当l=n是说明系统状态是安全的
intcounter=0;
//函数声明
voidchushihua();//初始化函数
voidsafe();//安全性算法
voidshow();//函数show,输出当前状态
voidbank();//银行家算法
voidjieshu();//结束函数
voidchushihua()
{
cout<<"输入进程的数量:
";//从此开始输入有关数据
cin>>n;
cout<<"输入资源种类数:
";
cin>>m;
cout< "< for(j=0;j { cout<<"输入资源"< "; cin>>Available[j];//输入数字的过程... Work[j]=Available[j];//初始化Work[j],它的初始值就是当前可用的资源数 } cout< "< for(i=0;i { for(j=0;j { cout<<"输入进程"< "; cin>>Allocation[i][j]; } cout< Finish[i]=0;//初始化Finish[i] } cout< "< for(i=0;i { for(j=0;j { cout<<"输入进程"< "; cin>>Max[i][j]; if(Max[i][j]>=Allocation[i][j])//若最大需求大于已分配,则计算需求量 Need[i][j]=Max[i][j]-Allocation[i][j]; else Need[i][j]=0;//Max小于已分配的时候,此类资源已足够不需再申请 } cout< } cout< } //安全性算法函数 voidsafe() { l=0; for(i=0;i {//i++ if(Finish[i]==0) {//逐个查找Finish[i]==0的进程条件一 counter=0;//记数器 for(j=0;j { if(Work[j]>=Need[i][j])counter=counter+1;//可用大于需求,记数 } if(counter==m)//i进程的每类资源都符合Work[j]>=Need[i][j]条件二 { p[l]=i;//存储安全序列 Finish[i]=1;//i进程标志为可分配 for(j=0;j Work[j]=Work[j]+Allocation[i][j];//释放资源 l=l+1;//记数,现在有L个进程是安全的,当L=N时说明满足安全序列 i=-1;//从第一个进程开始继续寻找满足条件一二的进程 } } } } //显示当前状态函数 voidshow()//函数show,输出当前资源分配情况 { inti,j;//局部变量 intAll[y];//各种资源的总数量 intL1;//局部变量L1 cout<<"当前的状态为: "< cout<<"各种资源的总数量: "< for(j=0;j { cout<<"资源"< "; All[j]=Available[j];//总数量=可用的+已分配的 for(i=0;i cout< } cout< "< for(j=0;j cout<<"资源"< "< cout< "< for(i=0;i<=m;i++) { for(j=i;j cout< for(L1=0;L1 { cout<<"进程"< "; for(j=i;j cout< } } cout< "< for(i=0;i<=m;i++) { for(j=i;j cout< for(L1=0;L1 { cout<<"进程"< "; for(j=i;j cout< } } } //银行家算法函数 voidbank() { cout< "< intk=0;//用于输入进程编号 boolr=false;//初值为假,输入Y继续申请则置为真 do{//输入请求 cout<<"输入申请资源的进程(0-"< "; cin>>k; cout< while(k>n-1)//输入错误处理 { cout< "< cout< "; cin>>k; cout< } cout< "< for(j=0;j { do{//do……while循环判断申请输入的情况 cout<<"进程"< "; cin>>Request[j]; cout< if(Request[j]>Need[k][j]){//申请大于需求量时出错,提示重新输入(贷款数目不允许超过需求数目) cout<<"申请大于需要量! "< cout<<"申请的资源"< "< cout<<"重新输入! "< } else//先判断是否申请大于需求量,再判断是否申请大于可利用量 if(Request[j]>Available[j]){//申请大于可利用量,应该阻塞等待? ……? ? ? cout<<"\n没有那么多资源,目前可利用资源"< "< Finish[k]=0;//该进程等待 gotoppp;//goto语句跳转,结束本次申请 } }while(Request[j]>Need[k][j]);//Request[j]>Available[j]|| } //改变Avilable、Allocation、Need的值 for(j=0;j Available[j]=Available[j]-Request[j]; Allocation[k][j]=Allocation[k][j]+Request[j]; Need[k][j]=Need[k][j]-Request[j]; Work[j]=Available[j]; } //判断当前状态的安全性 safe();//调用安全性算法函数 if(l { l=0; cout<<"\n试分配后,状态不安全,所以不予分配! 恢复原状态"< //恢复数据 for(j=0;j { Available[j]=Available[j]+Request[j]; Allocation[k][j]=Allocation[k][j]-Request[j]; Need[k][j]=Need[k][j]+Request[j]; Work[j]=Available[j]; } for(i=0;i Finish[i]=0;//进程置为未分配状态 } else { l=0; cout<<"\n申请资源成功! ! ! "< for(j=0;j { if(Need[k][j]==0); else{//有一种资源还没全部申请到,则该进程不可执行,不能释放拥有的资源 l=1;//置l为1,作为判断标志 break; } } if(l! =1){//进程可以执行,则释放该进程的所有资源 for(j=0;j Available[j]=Available[j]+Allocation[k][j]; Allocation[k][j]=0; } cout<<"该进程已得到所有需求资源,执行后将释放其所有拥有资源! "< } l=0;//归零 cout<<"\n安全的状态! "< cout<<"安全序列为: "; cout< Finish[0]=0; for(i=1;i cout<<"==>>"<<"进程"<<"("< Finish[i]=0;//所有进程置为未分配状态 } cout< } show();//显示当前状态 ppp: //申请大于可利用量,应该阻塞等待,结束本次资源申请,GOTO语句跳转至此 cout< "; char*b=newchar;//输入y/n,判断是否继续申请< cin>>b; cout< cout<<"-------------------------------------------"< cout< if(*b=='y'||*b=='Y') r=true; else{ r=false;//输入非Y则令R=false jieshu();//调用结束函数 } }while(r==true); } //结束函数 voidjieshu() { cout< cout<<"\t\t演示计算完毕"< cout< } //主函数 intmain() { cout< chushihua();//初始化函数调用 cout< show();//输出当前状态 safe();//判断当前状态的安全性 if(l { cout<<"\n当前状态不安全,拒绝申请! "< cout< return0; } else { inti;//局部变量 l=0; cout< 安全序列为: "< cout<<"进程"<<"("< for(i=1;i for(i=0;i cout< } bank();//调用银行家算法函数 cout<<"\t\t演示计算完毕"< } 五、实验数据及处理结果 六、实验体会或对改进实验的建议 程序基本实现了银行家算法的功能,并在其基础上考虑了输出显示的格式的美观性、输入错误要求重新输入等几个方面,尽可能的使程序完整一些。 这段程序算是三个试验中最困难最复杂的一个,由于能力有限,所以在紧张的的编写和调试过程中遇到了许多的问题,通过查询资料、翻阅课本、向同学请教、多次调试等方法逐渐解决了大部分问题,编写的过程中也有比较一些算法的优劣性,找出比较好的算法,收获非常大。 7、参考资料 《计算机操作系统》 南昌大学实验报告 --- (2)存储管理的模拟实现 学生姓名: 刘璐学号: 6100408116专业班级: 电气Ⅲ类083班 实验类型: □验证□综合■设计□创新实验日期: 11.19,11.26,12.3实验成绩: 一、实验目的 存储管理的主要功能之一是合理地分配空间。 请求页式管理是一种常用的虚拟存储管理技术。 本实验的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式管理的页面置换算法。 二、实验内容 编程实现页面置换算法,要求输出页面的置换过程,具体可以编程实现OPT、FIFO和LRU算法。 三、实验要求 1、需写出设计说明; 2、设计实现代码及说明 3、运行结果; 四、主要实验步骤 设计说明 (1)为了装入一个页面而必须调出一页时,如果被选中调出的页面在执行中没有修改过,则不必把该页写到磁盘上。 因此,在页表中可以增加是否修改过的标志,当执行“存”指令“写”指令是把对应页的修改标志置“1”表示该页修改过,为“0”表示该页没有修改过。 (2)设计一个地址转换程序来模拟硬件的地址转换和缺页中断。 当访问的页在主存时则形成绝对地址,但不去模拟指令的执行,可用输出转换后的绝对地址来表示一条指令已完成。 当访问的页不在主存时则输出“*该页页号”来表示硬件产生了一次缺页中断。 调用模拟地址转换程序。 (3)编制一个FIFO页面调试程序。 FIFO页面调试算法总是先调出作业中最先进入主存的那一页,因此,可以用一个数组来构成页号队列。 数组中每个元素是该作业已在主存的页面好,假定分配给作业的主存块数为m,且该作业开始的m页已装入主存,则数组可有m个元素组成: P[0],P[1],…,P[m-1]她们的初值为: P[0]: =0,P[1]: =1,…,P[m-1]: =m-1 用一指针k指示当要装入新页时应调出的页在数组的位置,k的初值为0。 当产生缺页中断后,操作系统总是选择P[k]所指出的页面调出,然后执行: P[k]: =要装入的新页页号 K: =(k+1)modm 代码说明 #include #include #include #include #defineN6//实验中假定的页表长度 #defineM4//主存物理块数 struct {intlnumber;//页号 intflag;//表示该页是否在主存,"1"表示在主存,"0"表示不在主存 intpnumber;//该页所在主存块的块号 intwrite;//该页是否被修改过,"1"表示修改过,"0"表示没有修改过 intdnumber;//该页存放在磁盘上的位置,即磁盘块号 }page[N];//页表定义 intp[M];//用数组模拟]FIFO算法中的队列(使用循环队列) inthead; voidinitial(void); intdo_mmap(int);//模拟地址转换 voiddo_page_fault(int);//缺页中断处理程序 voidrun_first_instructon(int);//执行进程的第一条指令 voidrun_a_instruction(int);//CPU执行一条指令 voidprint_page_and_fifoqueue(void);//输出页表和FIFO队列 main() { intladdress,paddress;//逻辑地址,物理地址 intlnumber,ad,pnumber;//页号,页内地址和物理块号 initial(); print_page_and_fifoqueue();//输出页表和FIFO队列 run_first_instructon(0x0000);//运行进程的第一条指令的地址 cout<<"输入下一条指令的逻辑地址(0~32767)(-1toend)"< cin>>laddress; while(laddress>32767){ cout<<"输入错误! 请重新输入下一条指令的逻辑地址(0~32767)(-1toend)"< cin>>laddress; } while(laddress! =-1){ lnumber=laddress>>10;//取逻辑地址的页号lnumber if(page[lnumber].flag==1){//指令所在的页面已装入在内存中 paddress=do_mmap(laddress);//形成物理地址 cout< run_a_instruction(paddress); cout<<"此指令执行是否修改所在页lnumber="< )"; charchange; cin>>change; if(tolower(change)=='y'){ page[lnumber].write=1;print_page_and_fifoqueue(); } } else{//缺页中断 cout< do_page_fault(lnumber);//直接转去缺页中断处理 continue;//本循环结束,重新执行指令 } cout<<"输入下一条指令的逻辑地址((0~32767),-1toend)\n"; cin>>laddress; while(laddress>32767){//输入正确性检测 cout<<"输入错误! 请重新输入下一条指令的逻辑地址(0~32767)(-1toend)"< cin>>laddress;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 pzm
![提示](https://static.bdocx.com/images/bang_tan.gif)