操作系统实验报告-27_第1页
操作系统实验报告-27_第2页
操作系统实验报告-27_第3页
操作系统实验报告-27_第4页
操作系统实验报告-27_第5页
已阅读5页,还剩23页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

计算机科学与技术学院实验报告(2010~2011学年度第二学期)课程名称计算机操作系统实验报告姓名学号专业计算机班级地点教师 2011.6.24实验一进程调度(一)实验目的进程是操作系统中最基本、最重要的概念,进程调度又是操作系统的核心模块。本实验要求学生独立地用C或C++语言编写一个简单的进程管理程序,其主要部分是进程调度。调度算法可由学生自行选择,如基于动态优先级的调度算法或多级反馈队列调度算法。通过本实验可加深学生对进程各种状态的转化和各种调度算法的理解,提高系统程序设计能力。(二)实验代码#include<cstdlib>#include<iostream>#include<iomanip>#include<string>usingnamespacestd;structfcfs{//先来先服务算法从这里开始 charname[10]; floatarrivetime; floatservicetime; floatstarttime; floatfinishtime; floatzztime; floatdqzztime;};//定义一个结构体,里面包含的有一个进程相关的信息fcfsa[100];voidinput(fcfs*p,intN){ inti;cout<<endl; printf("请您依次输入:进程的名字,到达时间,服务时间:(例如:a0100)\n\n"); for(i=0;i<=N-1;i++) { printf("请您输入进程%d的信息:\t",i+1); scanf("\t\t\t%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime); }}voidPrint(fcfs*p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,floatzztime,floatdqzztime,intN){ intk;printf("\n\n调用先来先服务算法以后进程运行的顺序是:");printf("%s",p[0].name); for(k=1;k<N;k++) { printf("-->%s",p[k].name); }cout<<endl; printf("\n具体进程调度信息:\n");printf("\t进程名到达时间服务时间开始时间结束时间周转时间带权周转时间\n");for(k=0;k<=N-1;k++){ printf("\t%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\n",p[k].name,p[k].arrivetime, p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime);}getchar();//此处必须要有这个函数,否则就看不到显示器上面的输出,可以看到的结果只是一闪而过的一个框剪}voidsort(fcfs*p,intN)//排序{for(inti=0;i<=N-1;i++)for(intj=0;j<=i;j++)if(p[i].arrivetime<p[j].arrivetime){fcfstemp;temp=p[i];p[i]=p[j];p[j]=temp;}}voiddeal(fcfs*p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,float&zztime,float&dqzztime,intN)//运行阶段{ intk;for(k=0;k<=N-1;k++){if(k==0) { p[k].starttime=p[k].arrivetime; p[k].finishtime=p[k].arrivetime+p[k].servicetime;}else { p[k].starttime=p[k-1].finishtime;p[k].finishtime=p[k-1].finishtime+p[k].servicetime;}}for(k=0;k<=N-1;k++){ p[k].zztime=p[k].finishtime-p[k].arrivetime; p[k].dqzztime=p[k].zztime/p[k].servicetime;}}voidFCFS(fcfs*p,intN){floatarrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;sort(p,N);deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);getchar();}//先来先服务算法到此结束structsjf{ //最短进程优先调度算法从这里开始 charname[10]; floatarrivetime;//到达时间 floatservicetime;//运行时间 floatstarttime;//开始时间 floatfinishtime;//完成时间 floatzztime; floatdqzztime;};sjfa1[100];voidinput(sjf*p,intN1)//进程信息输入{ inti; cout<<endl;printf("请您依次输入进程的名字,到达时间,服务时间:(例如:a0100)\n");for(i=0;i<=N1-1;i++) {printf("请您输入进程%d的信息:\t",i+1);scanf("\t\t\t%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime); }}voidPrint(sjf*p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,intN1)//最终结果输出{intk;printf("\n\t调用最短进程优先调度算法以后进程的调度顺序为:");printf("%s",p[0].name);for(k=1;k<N1;k++) {printf("-->%s",p[k].name);} cout<<endl;printf("\n给个进程具体调度信息如下:\n");printf("\n\t进程名到达时间运行时间开始时间完成时间周转时间带权周转时间\n");for(k=0;k<=N1-1;k++){ p[k].zztime=p[k].finishtime-p[k].arrivetime; p[k].dqzztime=p[k].zztime/p[k].servicetime;}for(k=0;k<=N1-1;k++){printf("\t%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\n",p[k].name,p[k].arrivetime, p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime);} getchar(); }voidsort(sjf*p,intN1)//排序{for(inti=0;i<=N1-1;i++)for(intj=0;j<=i;j++)if(p[i].arrivetime<p[j].arrivetime){sjftemp;temp=p[i];p[i]=p[j];p[j]=temp;}}voiddeal(sjf*p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,intN1)//运行阶段{intk;for(k=0;k<=N1-1;k++){if(k==0){p[k].starttime=p[k].arrivetime;p[k].finishtime=p[k].arrivetime+float(p[k].servicetime);}else{p[k].starttime=p[k-1].finishtime;p[k].finishtime=p[k-1].finishtime+float(p[k].servicetime);}}}voidsjff(sjf*p,intN1){ floatarrivetime=0,servicetime=0,starttime=0,finishtime=0;sort(p,N1);for(intm=0;m<N1-1;m++){if(m==0)p[m].finishtime=p[m].arrivetime+float(p[m].servicetime);elsep[m].finishtime=p[m-1].finishtime+float(p[m].servicetime);inti=0;for(intn=m+1;n<=N1-1;n++) { if(p[n].arrivetime<=p[m].finishtime)i++; }floatmin=p[m+1].servicetime;intnext=m+1;for(intk=m+1;k<m+i;k++){if(p[k+1].servicetime<min){min=p[k+1].servicetime;next=k+1;}}sjftemp;temp=p[m+1];p[m+1]=p[next];p[next]=temp;}deal(p,arrivetime,servicetime,starttime,finishtime,N1);Print(p,arrivetime,servicetime,starttime,finishtime,N1);getchar();}//最短进程优先调度算法到这里结束intmenu()//用来输出相关信息的函数{intcse1;while(1){system("cls");fflush(stdin);cout<<endl;cout<<endl;cout<<"\t"<<"\t实验一处理机调度算法实验"<<"\t\t"<<endl;cout<<endl;cout<<"\t"<<"\t\t1.先来先服务调度算法"<<"\t\t"<<endl;cout<<endl;cout<<"\t"<<"\t\t2.最短进程优先调度算法"<<"\t\t"<<endl;cout<<endl;cout<<endl;cout<<"\t\t请输入您的选择(1或2):"; cin>>cse1;//cse1=getchar();if(cse1<1||cse1>2) cout<<"你的输入有错!"<<endl;elsebreak;}returncse1;}intmain(intargc,char*argv[]){while(1){switch(menu()){case1:intN;cout<<endl;cout<<endl;printf("\t\t先来先服务调度算法\n");cout<<endl;printf("输入进程数目:");scanf("%d",&N);input(a,N);FCFS(a,N);case2:intN1;cout<<endl;cout<<endl;printf("\t\t最短进程优先调度算法\n");cout<<endl;printf("输入进程数目:");scanf("%d",&N1);input(a1,N1);sjf*b=a1;sjf*c=a1;sjff(b,N1);getchar();}}//system("PAUSE");return0;}(三)实验流程图(四)实验结果(五)实验体会实验二可变分区存储管理(一)实验目的1.加深对可变分区的存储管理的理解;2.提高用C语言编制大型系统程序的能力,特别是掌握C语言编程的难点:指针和指针作为函数参数;3.掌握用指针实现链表和在链表上的基本操作。(二)实验代码#include<iostream>#include<string>usingnamespacestd;structBlock//空闲链结构体{stringname;//作业名intaddress;//分区首地址intsize;//分区大小intstate;//分区转态structBlock*next;//前向指针structBlock*front;//后向指针};structUsed//已分配分区结构体{Block*usedArea;Used*next;};Block*freeHead;//带表头附加节点的空闲链头指针Used*usedHead;//带表头附加结点的已分配分区头指针boolInitValue()//初始化函数{cout<<"本程序设立的操作功能:1-申请资源2-释放资源3-打印信息"<<endl;freeHead=newBlock;freeHead->size=0;freeHead->next=NULL;freeHead->state=1;usedHead=newUsed;Block*p=newBlock;p->address=0;usedHead->usedArea=p;usedHead->next=NULL;Block*temp=newBlock;cout<<"请先输入主存大小(k):"<<endl;cin>>temp->size;temp->address=0;temp->state=0;temp->next=freeHead;temp->front=NULL;freeHead->front=temp;returntrue;}voidDisplay(Block*p,Used*q)//打印信息的函数{cout<<"已分配分区信息(作业,始址,大小):"<<endl;while(q!=NULL){cout<<q->usedArea->name<<','<<q->usedArea->address<<','<<q->usedArea->size<<endl;q=q->next;}cout<<"空闲链分区信息(始址,大小):"<<endl;while(p!=NULL){cout<<p->address<<',';cout<<p->size<<endl;p=p->front;}}voidAllocate(stringreqName,intreqSize)//分配函数{Block*p=freeHead->front;Used*r1,*r2;while(p!=NULL){if(reqSize<p->size)//如果请求的分区的大小小于一个空闲分区的大小{Used*temp=newUsed;temp->usedArea=p;Block*q=newBlock;*q=*p;temp->usedArea->name=reqName;temp->usedArea->size=reqSize;temp->usedArea->front=q;temp->usedArea->state=1;q->size=q->size-reqSize;q->address=q->address+reqSize;q->next->front=q;if(q->front!=NULL)q->front->next=q;r1=usedHead;r2=usedHead->next;while(r2!=NULL&&r2->usedArea->address<temp->usedArea->address){r1=r2;r2=r2->next;}r1->next=temp;temp->next=r2;break;}elseif(reqSize==p->size)//如果请求的分区的大小等于一个空闲分区的大小{Used*temp=newUsed;temp->usedArea=p;temp->usedArea->name=reqName;temp->usedArea->state=1;p->next->front=p->front;if(p->front!=NULL)p->front->next=p->next;r1=usedHead;r2=usedHead->next;while(r2!=NULL&&r2->usedArea->address<temp->usedArea->address){r1=r2;r2=r2->next;}r1->next=temp;temp->next=r2;break;}p=p->front;}if(p==NULL)cout<<"资源不足请等待"<<endl;}voidRecycle(stringfreeName)//回收分区的函数{Used*p=usedHead->next,*r=usedHead;Block*q;while(p!=NULL){if(p->usedArea->name==freeName)//找到同名的作业后,再分四种情况讨论{q=p->usedArea;intflag1=1,flag2=1;Block*p1=freeHead->front;Block*pfront,*pnext;while(p1->address<q->address){if(p1->address+p1->size==q->address){flag1=0;pnext=p1;}p1=p1->front;}if(q->address+q->size==p1->address){flag2=0;pfront=p1;}if(flag1==0){if(flag2==0){pnext->front=pfront->front;pnext->size=pnext->size+q->size+pfront->size;if(pfront->front!=NULL)pfront->front->next=pnext;r->next=p->next;}else{pnext->size+=q->size;r->next=p->next;}}else{if(flag2==0){pfront->address-=q->size;pfront->size+=q->size;r->next=p->next;}else{Block*temp=freeHead;while(temp->address<=q->address)temp=temp->front;q->front=temp;q->next=temp->next;q->next->front=q;temp->next=q;q->state=0;r->next=p->next;}}break;}r=p;p=p->next;}}intmain(){InitValue();intoperate;//操作符1-申请资源2-释放资源3-打印信息stringname;intsize;while(1){cout<<"请选择操作功能"<<endl;cin>>operate;if(operate==1){cout<<"请依次输入作业名(字符串),空间大小(正整数)(例如a100)"<<endl;cin>>name>>size;Allocate(name,size);}elseif(operate==2){cout<<"请输入作业名(字符串)(例如abc)"<<endl;cin>>name;Recycle(name);}elseif(operate==3)Display(freeHead->front,usedHead->next);}return0;}(三)实验流程图(四)实验结果(五)实验体会实验四死锁(一)实验目的(二)实验代码#include<iostream.h>#include"stdio.h"constunsignedshortc=3;//资源类数constunsignedshortt=5;//进程数voidPrint();//用于打印输出表格的函数voidInput();//用于输入的函数voidtryfenpei(inti);//试分配函数voidrefenpei(inti);//恢复数据函数voidchecksafe(ints);//安全检测函数//定义初始化数组intAvailable[c],Max[t][c],Allocation[t][c],Need[t][c],Request[c];intin;//用户选择的进程号intmain(intargc,char*argv[]){inti;charch='Y';cout<<"初始化数据"<<endl;Input();//输入相关数据函数Print();//打印输出相关数据表函数cout<<"初始化完成!..."<<endl<<endl<<endl;do{if(ch=='Y'||ch=='y'){cout<<"欢迎进入实验!请稍后..."<<endl;//Sleep(1000);cout<<"已顺利进入实验..."<<endl;cout<<"请输入发起请求的进程号(0-4):";while(cin>>in){if(!(0<=in&&in<=4)){cout<<"不存在该进程,请重新输入"<<endl;}elsebreak;};cout<<"您输入的是"<<"p["<<in<<"]"<<"进程"<<endl;cout<<"该进程需求量为:";for(i=0;i<c;i++)cout<<Need[in][i]<<"";cout<<endl;cout<<"请输入请求资源的数目:";//输入格式为Xfor(i=0;i<c;i++){while(cin>>Request[i]){if(Request[i]<0)cout<<"错误!输入的数字无效."<<endl;elseif(Request[i]>Need[in][i])cout<<"错误!超出进程需求量"<<endl<<endl;if(Request[i]>Available[i])cout<<"错误!系统还没有足够的可用资源量满足进程需要"<<endl<<endl;elsebreak;}}cout<<"输入成功,您输入的是:"<<Request[0]<<""<<Request[1]<<""<<Request[2];cout<<endl;cout<<"开始执行银行家算法,下面进行试分配..."<<endl;tryfenpei(in);//分配函数//Sleep(1000);cout<<"试分配完成!"<<endl;cout<<"进入安全性检测..."<<endl;//Sleep(1000);checksafe(in);//安全性检测函数cout<<"需要继续实验吗?(y-继续n终止)";}elseif(ch=='N'||ch=='n'){cout<<"感谢您的使用,祝您愉快!"<<endl<<"正在退出..."<<endl;break;}elsecout<<"输入无效!请重新输入."<<endl;}while(cin>>ch);return0;}//main函数结束voidPrint()//输出函数{inti,j;cout<<"进程个数:"<<t<<"资源个数:"<<c<<endl;cout<<"正在更新数据..."<<endl;//Sleep(1500);cout<<"|-----|----------|------------|----------|-----------|"<<endl;cout<<"|----|最大需求矩阵|已分配矩阵-|-需求矩阵-可用资源向量|"<<endl;cout<<"|\资源|Max|Allocation|Need|Available|"<<endl;cout<<"|\|ABC|ABC|ABC|ABC|"<<endl;cout<<"|进程\|||||"<<endl;cout<<"|-----|----------|------------|----------|-----------|"<<endl;for(i=0;i<5;i++){cout<<"|p"<<i<<"|";for(j=0;j<3;j++){cout<<Max[i][j]<<"";}cout<<"|";for(j=0;j<3;j++){cout<<""<<Allocation[i][j];}cout<<"|";for(j=0;j<3;j++){cout<<""<<Need[i][j];}cout<<"|";if(i==0){for(j=0;j<3;j++){cout<<""<<Available[j];}cout<<"|";}if(i>0){cout<<"|";}cout<<endl;}cout<<"|-----|----------|------------|----------|-----------|"<<endl;}//输出函数结束///输入函数/voidInput(){for(intj=0;j<c;j++){cout<<"请输入Available["<<j<<"]:";while(cin>>Available[j]){if(Available[j]<0)cout<<"输入数字无效,请重新输入"<<endl;elsebreak;};}for(intk=1;k<4;k++)//其他三个属性和一次打印输出表{for(intl=0;l<t;l++)//五个进程循环输入{for(intm=0;m<c;m++)//三个类资源ABC循环输入{if(k==1&&m<t){cout<<"请输入Max["<<l<<"]["<<m<<"]:";while(cin>>Max[l][m]){if(Max[l][m]<0)cout<<"输入数字无效,请重新输入"<<endl;elsebreak;};}if(k==2&&m<t){cout<<"请输入Allocation["<<l<<"]["<<m<<"]:";while(cin>>Allocation[l][m])if(Allocation[l][m]<0)cout<<"输入数字无效,请重新输入"<<endl;elsebreak;//cout<<"Allocation["<<l<<"]["<<m<<"]="<<Allocation[l][m]<<endl;}if(k==3&&m<t)Need[l][m]=Max[l][m]-Allocation[l][m];}}}}//输入函数结束//试分配函数voidtryfenpei(inti){for(intf=0;f<c;f++){Available[f]=Available[f]-Request[f];Allocation[i][f]=Allocati

温馨提示

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

评论

0/150

提交评论