操作系统课程设计报告书_第1页
操作系统课程设计报告书_第2页
操作系统课程设计报告书_第3页
操作系统课程设计报告书_第4页
操作系统课程设计报告书_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

./任务一、进程创建、控制与撤消目的:通过进程的创建和控制的设计来达到如下目的:加深对进程概念的理解,明确进程和程序的区别;进一步认识并发执行的概念,区别顺序执行和并发执行;分析进程争用临界资源的现象,学习解决进程互斥的方法;容:在WINDOWS环境下模拟实验:编写一程序,来模拟进程的创建和撤消,要求通过终端键盘输入三、四作业的名称、大小、优先级等。系统为它创建进程,并把进程控制块PCB的容送到终端显示器上输出。同时模拟存空间为作业分配存空间,并把结果用图形形象地表示出来,同样通过终端输出。按进程的优先级的顺序撤消进程,同时通过终端显示PCB的撤消过程和存的释放过程程序流程图:源代码如下:#include<iostream>;usingnamespacestd;structPCB{ intpid; intpriority; intsize; intdetail; intisrun;};PCBrunning[20],ready[20];intsum=0,pid_1;voidchoose<>;voidmenu<>;intcreate<>{ if<sum>=20> { cout<<"存已满,请先结束或换出进程"<<endl; } else {cout<<"请输入第"<<sum+1<<"个进程"<<endl;cout<<"请输入进程的pid"<<endl;cin>>running[sum+1].pid;cout<<"请输入新的进程的优先级"<<endl;cin>>running[sum+1].priority;cout<<"请输入新的进程的大小"<<endl;cin>>running[sum+1].size;cout<<"请输入新的进程的详情"<<endl;cin>>running[sum+1].detail;running[sum+1].isrun=1;sum++; } returnrunning[sum-1].isrun; choose<>;}voiddisplay<>{ intpid; cout<<"请输入进程的pid"<<endl; cin>>pid; if<pid>0&&pid<=20&&running[pid].isrun==1> {cout<<"进程的pid是:"<<running[pid].pid<<endl;cout<<"进程的优先级是:"<<running[pid].priority<<endl;cout<<"进程的大小是:"<<running[pid].size<<endl;cout<<"进程的相关信息:"<<running[pid].detail<<endl; } else {cout<<"所查看运行进程不存在"<<endl; } choose<>;}voidreplace<>{ intpid1,pid2; cout<<"请输入第一个替换进程的pid"<<endl; cin>>pid1; cout<<"请输入第二个替换进程的pid"<<endl; cin>>pid2; if<pid1>0&&pid1<=20&&running[pid1].isrun==1> {if<running[pid1].priority>running[pid2].priority> { ready[20].pid=running[pid1].pid; ready[20].priority=running[pid1].priority; ready[20].size=running[pid1].size; ready[20].detail=running[pid1].detail; running[pid1].pid=running[pid2].pid; running[pid1].priority=running[pid2].priority; running[pid1].size=running[pid2].size; running[pid1].detail=running[pid2].detail; running[pid2].pid=ready[20].pid; running[pid2].priority=ready[20].priority; running[pid2].size=ready[20].size; running[pid2].detail=ready[20].detail;cout<<"替换完成"<<endl;cout<<"被替换进程的pid是:"<<ready[20].pid<<endl;cout<<"被替换进程的优先级是:",ready[20].priority;cout<<"被替换进程的大小是:"<<ready[20].size<<endl;cout<<"被替换进程的详情是:"<<ready[20].detail<<endl;}else{cout<<"进程优先级不够大"<<endl; } } else {cout<<"所查看运行进程不存在"<<endl; } choose<>;}voidkill<>{ intkpid; cout<<"请输入进程的pid:"; cin>>kpid; if<kpid>0&&kpid<20&&running[kpid].isrun==1> { running[kpid].isrun=0; } choose<>;}voidchoose<>{ intchoose; cout<<"是否继续操作?继续,请输入1,退出:按任意键"<<endl; cout<<"请输入你的选择:"; cin>>choose; if<choose=1>{ menu<>; } else{ exit<0>; }}voidmenu<>{ intn,i; n=1; while<n==1> { system<"cls">; cout<<"进程模拟"<<endl; cout<<"1.创建进程2.查看进程信息"<<endl; cout<<"3.撤销进程4.终止进程"<<endl; cout<<"5.退出"<<endl; cout<<"请输入你的选择:"; cin>>i; switch<i> { case1:create<>;break; case2:display<>;break; case3:replace<>;break; case4:kill<>;break; case5:exit<0>; default:n=0; } }}intmain<>{ menu<>; return0;}运行结果如下:任务三、基本存储器管理目的:一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现与主存储器的管理方式有关的,通过本实验帮助学生理解在不同的存储管理方式下怎样实现主存的分配和回收。容:从下两种存储管理方式的主存分配和回收中,选择一种管理方式来实现本次实验任务:1、在可变〔动态分区管理方式下,采用最先适应算法。2、在分页式管理方式下,采用位示图来表示主存的分配情况和回收情况。程序流程图:源代码如下:#include<conio.h>#include<iostream>#definen10//系统最大作业数#definemaxsize20//空闲区最大存#defineminisize100usingnamespacestd;struct{floataddr;//已分配分区起始地址floatsize;//已分配分区长度,单位为字节intflag;}useed[n];//已分配区表struct{floataddr;//空闲区起始地址floatsize;//空闲区大小intflag;//0为空,1未分配}frees[maxsize];voidallo<chara,floatxk>{inti,k;floatad;k=-1;for<i=0;i<maxsize;i++>if<frees[i].size>=xk&&frees[i].flag==1>if<k==-1||frees[i].size<frees[k].size>k=i;if<k==-1>{cout<<"无可用空闲区"<<endl;return;}if<frees[k].size-xk<=minisize>{frees[k].flag=0;ad=frees[k].addr;xk=frees[k].size;}else{frees[k].size=frees[k].size-xk;ad=frees[k].addr+frees[k].size;}i=0;while<useed[i].flag!=0&&i<n>i++;if<i>=n>{cout<<"error,未初始化"<<endl;if<frees[k].flag==0>frees[k].flag=1;else{frees[k].size=frees[k].size+xk;return;}}else{useed[i].addr=ad;useed[i].size=xk;useed[i].flag=a;}return;}voidfindc<charx>{inti,k,a,s,t;floatS,L;s=0;while<<useed[s].flag!=x||useed[s].flag==0>&&s<n>s++;if<s>=n>{cout<<"没有找到该作业"<<endl;return;}useed[s].flag=0;S=useed[s].addr;L=useed[s].size;a=-1;k=-1;i=0;while<i<maxsize&&<a==-1||k==-1>>{if<frees[i].flag==1>{if<frees[i].addr+frees[i].size==S>k=i;if<frees[i].addr==S+L>a=i;}i++;}if<k!=-1>if<a!=-1>{frees[k].size=frees[a].size+frees[k].size+L;frees[a].flag=0;}elsefrees[k].size=frees[k].size+L;elseif<a!=-1>{frees[a].addr=S;frees[a].size=frees[a].size+L;}else{t=0;while<frees[t].flag==1&&t<maxsize>t++;if<t>=maxsize>{cout<<"存空闲表没有空间,回收空间失败"<<endl;useed[s].flag=a;return;}frees[t].addr=S;frees[t].size=L;frees[t].flag=1;}return;}intmain<>{inti,a;floatxk;frees[0].addr=10240;frees[0].size=10240;frees[0].flag=1;for<i=1;i<maxsize;i++>frees[i].flag=0;for<i=0;i<n;i++>useed[i].flag=0;while<1>{cout<<"选择操作:"<<endl<<"0-退出"<<endl<<"1-分配存"<<endl<<"2-回收已分配存"<<endl<<"3-显示存信息"<<endl;cout<<"请输入你的选择:";cin>>a;switch<a>{case0:exit<0>;case1:cout<<"输入作业名:"; cin>>a; cout<<"请输入作业大小:"; cin>>xk;allo<a,xk>;break;case2:cout<<"输入要回收分区的作业名";cin>>a;findc<a>;break;case3:cout<<"输出空闲分区:"<<endl<<"起始地址分区长度标志"<<endl;for<i=0;i<maxsize;i++>cout<<frees[i].addr<<""<<frees[i].size<<""<<frees[i].flag<<endl;cout<<"按任意键,输出已分配信息"<<endl;getch<>;cout<<"查看已分配分区:"<<endl<<"起始地址分区长度标志"<<endl;for<i=0;i<n;i++>if<useed[i].flag!=0>cout<<useed[i].addr<<""<<useed[i].size<<""<<useed[i].flag<<endl;elsecout<<useed[i].addr<<""<<useed[i].size<<""<<useed[i].flag<<endl;break;default:cout<<"输入有误!!!!"<<endl;}}return1;}任务五、死锁的避免一、目的在多道程序系统中,多个进程的并发执行来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险——死锁。所谓死锁<Deadlock>,是指多个进程在运行过程中因争夺资源而造成的一种僵局〔DeadlyEmbrace,当进程处于这种状态时,若无外力作用,他们都无法在向前推进。我们可以在分配资源时加上限制条件就可以预防死锁,但是,在每一种预防死锁的方法之中,都施加了较强的限制条件;而在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。二、容利用银行家算法来避免死锁的发生#include<iostream>#include<iomanip>#definemax_s20#definemax_p100intavailable[max_s];intmax[max_p][max_s];intallocation[max_p][max_s];intneed[max_p][max_s];intrequest[max_s];intrequestPID;intsource;intprocess;usingnamespacestd;//1:表示请求的资源>还分配的资源//2:表示请求的资源>系统剩余的资源//3:表示不存在安全序列//0:成功intbanker<intstSq[]>{inti,j,k;for<i=0;i<source;i++>{if<request[i]>need[requestPID][i]>return1;}for<i=0;i<source;i++>{if<request[i]>available[i]>return2;}for<i=0;i<source;i++>{available[i]-=request[i];allocation[requestPID][i]+=request[i];need[requestPID][i]-=request[i];}intfinish[max_p]={0};intwork[max_s];intcurS;for<i=0;i<source;i++>work[i]=available[i];for<k=0;k<process;k++>{boolflag=false;for<i=0;i<process&&!flag;i++>{if<finish[i]==0>{flag=true;for<j=0;j<source&&flag;j++>{if<need[i][j]>work[j]>flag=false;}}curS=i;}if<!flag>{for<j=0;j<source;j++>{available[j]+=request[j];allocation[requestPID][j]-=request[j];need[requestPID][j]+=request[j];}return3;}finish[curS]=k+1;for<j=0;j<source;j++>{work[j]+=allocation[curS][j];}}for<i=0;i<process;i++>{j=0;while<finish[j]!=i+1>j++;stSq[i]=j;}return0;}voidsetCS<>{source=3;process=5;inta[]={4,5,8};intmax[20][100];intm[][max_s]={{8,5,4},{5,3,3},{10,1,3},{3,3,3},{5,4,4},};intal[][max_s]={{1,2,1},{3,1,1},{4,1,3},{3,2,2},{1,1,3}};intre[]={0,2,2};inti,j;cout<<"当前可用资源数:"<<endl;for<i=0;i<source;i++>{available[i]=a[i];cout<<setw<5><<available[i];}cout<<endl<<endl;cout<<"进程所需资源的最大数量:"<<endl;for<i=0;i<process;i++>{for<j=0;j<source;j++>{max[i][j]=m[i][j];cout<<setw<5><<max[i][j];}cout<<endl;}cout<<endl;cout<<"进程已分配到资源量:"<<endl;for<i=0;i<process;i++>{for<j=0;j<source;j++>{allocation[i][j]=al[i][j];cout<<setw<5><<allocation[i][j];}cout<<endl;}cout<<endl;cout<<"进程还需的资源量:"<<endl;for<i=0;i<process;i++>{for<j=0;j<source;j++>{need[i][j]=max[i][j]-allocation[i][j];cout<<setw<5><<need[i][j];}cout<<endl;}cout<<endl;requestPID=1;cout<<"进程"<<requestPID<<"正在请求的资源:"<<endl;for<i=0;i<source;i++>{request[i]=re[i];cout<<setw<5><<request[i];}cout<<endl<<endl;}voidmain<>{setCS<>;intstSq[max_p]={0};cout<<"银行家算法的演示"<<endl;interror=banker<stSq>;if<!error>{cout<<"可以进行分配"<<endl;for<inti=0;i<process;i++>cout<<setw<5><<stSq[i];cout<<endl;}else{cout<<"剩余资源无法满足要求,拒绝分配资源"<<endl;}}任务六、磁盘空间的分配与回收目的:磁盘初始化时把磁盘存储空间分成许多块〔扇区,这些空间可以被多个用户共享。用户作业在执行期间常常要在磁盘上建立文件或已经建立在磁盘上的文件删去,这就涉及到磁盘存储空间的分配和回收。。一个文件存放到磁盘上,可以组织成顺序文件〔连续文件、文件〔串联文件、索引文件等,因此,磁盘存储空间的分配有两种方式,一种是分配连续的存储空间,另一种是可以分配不连续的存储空间。怎样有效地管理磁盘存储空间是操作系统应解决的一个重要问题,通过本实验使学生掌握磁盘存储空间的分配和收回算法。容:模拟磁盘空闲空间的表示方法,以及模拟实现磁盘空间的分配和回收。从下题目中选择一题来实现设备的管理:连续的磁盘存储空间的分配和回收。用位示图管理磁盘存储空间。〔3模拟UNIX系统的空闲块组法,实现磁盘存储空间的管理。提示:参考教材P231—P234连续的磁盘存储空间的分配和回收:要在磁盘上建立顺序文时,必须把按序排列的逻辑记录依次存放在磁盘的连续存储空间中。可假定磁盘初始化时,已把磁盘存储空间划分成若干个等长的块〔扇区,按柱面号和盘面号的顺序给每一块确定一个编号。随着文件的建立、删除、磁盘存储空间被分成许多区〔每一区包含若干块,有的区存放着文件,而有的区的空闲的。当要建立顺序文件时必须找到一个合适的空闲区来存放文件记录,当一个文件被删除时,则该文件占用的区应成为空闲区。为此可用一空闲区表不记录磁盘存储空间未占用的部分,格式如下:序列起始空闲块号空闲块个数状态156未分配2143未分配32130未分配4空表目┇┇┇┇┇┇┇┇要建立文件时,先查找空闲区表,从状态为"未分配"的登记栏目中找出一个块数能满足要求的区,由起始空闲块号能依次推得可使用的其它块号。若不需要占用该区的所有块时,则剩余的块仍应为未分配的空闲块,这时要修改起空闲块号和空闲块数。若占用了该区的所有块,则相应登记栏中的状态修改成"空表目",删除一个文件时,从空闲区表中找一个状态为"空表目"的登记栏目,把归还的起始块号和块数填入对应的位置。磁盘存储空间的分配和回收算法类似于主存储器的可变分区方式的分配和回收。同学们可参考上一实验的第一题。当找到空块后,必须启动磁盘把信息存放到指定的块中,启动磁盘必须给出由三个参数组成的物理地址:柱面号、磁道号和物理记录号。故必须把找到的空闲块号换算成磁盘的物理地址。为了减少移臂次数,磁盘上的信息按柱面上各磁道顺序存放。现假定一个盘组共有200个柱面,〔编号0—199每个柱面有20个磁道〔0—19,同一柱面上的各磁道分布在各盘面上,故磁道号即盘面号。,每个磁道被分成等长的6个物理记录〔编号0—5,每个盘面被分成若干个扇区,故每个磁道上的物理记录号即为对应的扇区号。。那么,空闲块号与磁盘物理地址的对应关系如下:假设M=[空闲块号/6],m={空闲块号/6}则物理记录号=m磁道号={M/20},柱面号=[M/20]删除一个文件时,从文件目录表中可得到该文件在磁盘上的起始地址和逻辑记录个数,假定每个逻辑记录占磁盘上的一块,则可推算出归还后的起始空闲块号和块数,登记到空闲区表中。换算关系如下:起始空闲块号=〔柱面号*20+磁道号*6+物理记录号空闲块数=逻辑记录数请设计磁盘存储空间的分配和回收程序,要求把分配到空闲块转换成磁盘物理地址,把归还的磁盘空间转换成空闲块号假定空闲区表的初值如提示〔1中指出,现有一文件要占用10块,运行你所设计的分配程序,显示或打印分配后的空闲区表以及分配到的磁盘空间的起始物理地址。然后,有一文件被删除,它占用的磁盘空间为:1号柱面2号磁道,0号物理记录开始的4块,运行你所设计划的回收程序,显示或打印回收后的空闲区表。2、用位示图管理磁盘存储空间的分配和回收:〔1为了提高磁盘存储空间的利用率,可在磁盘上组织成文件、索引文件,这类文件可以把逻辑记录存放在不连续的存储空间。为了表示哪些磁盘空间已被占用,哪些磁盘空间是空闲的,可用位示图来指出。位示图由若干字节构成,每一位与磁盘上的一块对应,"1"状态表示相应块已占用,"0"状态表示该块为空闲。位示图的形式与上一实验中的位示图一样,但要注意,对于主存储空间和磁盘存储空间应该用不同的位示图来管理,绝不可混用。〔2申请一块磁盘空间时,由分配程序查位示图,找出一个为"0"的位,计算出这一位对应块的磁盘物理地址,且把该位置成占用状态"1"。假设现在有一个盘组共80个柱面,每个柱面有两个磁道,每个磁道分成4个物理记录。那么,当在位示图中找到某一字节的某一位为"0"时,这个空闲块对应的磁盘物理地址为:柱面号=字节号磁道号=[位数/4]物理记录号={位数/4}〔3归还一块磁盘空间时,由回收程序根据归还的磁盘物理地址计算出归还块在位示图中的对应位,把该位置成"0"。按照〔2中假设的盘组,归还块在位示图中的位置计算如下:字节号=柱面号位数=磁道号*4+物理记录号〔4设计申请一块磁盘空间和归还一块磁盘空间的程序。要求能显示或打印程序运行前和运行后的位示图;分配时把分配到的磁盘空间物理地址显示或打印出来,归还时把归还块对应于位示图的字节号和位数显示或打印出来。〔5假定已有如表6—1磁盘空间被占用了,现在要申请五块磁盘空间,运行分配程序,按〔4中要求显示或打印运行的结果。然后再归还如表6—2的空间,运行回收程序,按〔4中的要求显示或打印运行结果。柱面号磁道号物理记录号001002010013100112表6—1柱面号磁道号物理记录号002010101表6—23、模拟UNIX系统的空闲块成组法,实现磁盘存储空间的管理:〔1假定磁盘存储空间已被划分成长度n的等长块,共有M块可供使用。UNIX系统中采用空闲块成组的方法来管理磁盘存储空间,将磁盘中的每N个空闲块〔NM分成一组,最后一组可以不足N块,每组的第一块登记了下一组空闲块的块数和块号,第一组的块数和块号登记在专用块中,登记的格式如下:空闲块数K空闲块号1空闲块号2┇┇空闲块号K┇┇当第一项容为"0"时,则第二项起指出的空闲块是最后一组。〔2现模拟UNIX系统的空闲块成组,假定共有8块可供使用,每3块为一组,则空闲块成组的初始状态为:A[0]A[1]A[4]3345630871332专用块A[2]A[5]A[7]A[3]A[6]A[8]开始时,空闲块号是顺序排列的,但经若干次的分配和归还操作后,空闲块的就未必按序排列了。用二维数组A[M][N]来模拟管理磁盘空间,用A[i]表示第i块,第0块A[0]作为专用块。〔3成组的分组情况记录在磁盘物理块中,为了查找情况,必须把它们读入主存,故当磁盘初始化后,系统先将专用块容复到主存中,定义一个数组MA存放专用块容,即MA=A[0]。申请一块磁盘空间时,查MA,从中找出空闲块号,当一组空闲块只剩第一块时,则应把该块中指出的下一组的空闲块数和块号复制到专用块中,然后把该块分配给申请者。当一组的空闲块分配完后则把专用块容〔下一组情况复制到主存,再为申请者分配。分配算法如图6—1。开始开始把A[s]块内容复制到专用块A[0]:=A[s]i:=MA[0]把专用块内容自制到主存MA:=A[0]MA[0]≤1?MA[0]=1?MA[1]=0?S:=MA[i]空闲块数减1MA[0]:=MA[0]-1显示分配的块号sS:=MA[i]显示:系统无空闲块结束否是是否否是图6—1采用成组的分配算法〔4归还一块时给出归还的块号,若当前组不满规定块时,将归还块登记入该组;若当前组已满,则另建一新组,这时归还块作为新一组的第一块,应把主存中登记的一组情况MA复制归还块中,然后在MA重新登记一个新组。归还一块的算法图6—2。开始开始J:=归还块号MA[0]=3?i:=MA[0]MA[i]:=jMA[0]:=MA[0]+1MA[j]:=MAMA[0]:=1MA[1]:=j结束否是图6—2采用成组的回收算法〔5设计分配和归还磁盘空间的程序,能显示或打印分配的磁盘空间的块号,在完成一次分配或归还后能显示或打印各空闲块组的情况〔各组的空闲块数和块号。本实验省去了块号与物理地址之间的转换工作,而在实际的系统中必须进行块号与物理地址的转换工作。〔6运行你所设计的程序,假定空闲块的初始状态如提示〔2,现先分配4块,再依归还第2块和第6块。把执行后分配到的块号依次显示或打印出来,且显示或打印空闲块组的情况。在上次执行的基础上继续分配3块,然后归还第1块,再申请5块,显示或打印依次分配到的块号及空闲块组情况。#include<iostream>usingnamespacestd;voidinit<intdisk[8][8]>{ intcyd,tra,sor;

温馨提示

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

评论

0/150

提交评论