版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
淮阴工学院实验报告___-____年第__1__学期学院___计算机工程学院__课程名称_____操作系统__班级_____软件1101_____学号_________姓名_______王祥______指导教师_______严云洋______实验一:进程调度1.实验目的:通过这次实验,加深对进程概念的理解,进一步掌握进程状态的转变、进程调度的方略及对系统性能的评价办法。2.实验内容:设计程序模拟进程的轮转法调度过程。假设初始状态为:有n个进程处在就绪状态,有m个进程处在阻塞状态。采用轮转法进程调度算法进行调度(调度过程中,假设处在执行状态的进程不会阻塞),且每过t个时间片系统释放资源,唤醒处在阻塞队列队首的进程。程序规定以下:1).输出系统中进程的调度次序;2).计算CPU运用率。3.实验环境:硬件环境:GhostXPSP3纯净版Y6.0Pentium(R)Dual-CoreCPUE6700@3.20GHz3.19GHz,1.96GB的内存物理地址扩展软件环境:MicrosoftWindowsXP,VisualStudio4.源代码:#include<iostream>#include<algorithm>#include<queue>usingnamespacestd;onstintMaxNum=100;structNode{intindex;intarriveTime;intrest;};boolNodeCmp(constNode&a,constNode&b){returna.arriveTime<b.arriveTime;}intn;//进程数intArrivalTime[MaxNum];intServiceTime[MaxNum];intPServiceTime[MaxNum];intFinishTime[MaxNum];intWholeTime[MaxNum];doubleWeightWholeTime[MaxNum];boolFinished[MaxNum];doubleAverageWT,AverageWWT;boolisEnterQue[MaxNum];intcntTimes[MaxNum];voidinit(){memset(PServiceTime,0,sizeof(PServiceTime));memset(Finished,0,sizeof(Finished));memset(FinishTime,0,sizeof(FinishTime));memset(WholeTime,0,sizeof(WholeTime));memset(WeightWholeTime,0,sizeof(WeightWholeTime));}intsum(intarray[],intn){intsum=0;inti;for(i=0;i<n;i++){sum+=array[i];}returnsum;}doublesum(doublearray[],intn){doublesum=0;inti;for(i=0;i<n;i++){sum+=array[i];}returnsum;}voidprint(){inti=0;cout<<"进程完毕时间:";for(i=0;i<n;i++){cout<<FinishTime[i]<<'';}cout<<endl;cout<<"周转时间:";for(i=0;i<n;i++){cout<<WholeTime[i]<<'';}cout<<endl;cout<<"带权周转时间:";for(i=0;i<n;i++){printf("%.2f",WeightWholeTime[i]);}cout<<endl;}voidSearchToEnterQue(queue<Node>&que,Node*pArr,intmaxArrivalTime){inti;for(i=0;i<n;i++){if(pArr[i].arriveTime>maxArrivalTime)break;if(isEnterQue[pArr[i].index]==false){que.push(pArr[i]);isEnterQue[pArr[i].index]=true;}}}voidWork(intq){init();memset(isEnterQue,0,sizeof(isEnterQue));memset(cntTimes,0,sizeof(cntTimes));Node*pNodeArr=newNode[n];inti;for(i=0;i<n;i++){pNodeArr[i].index=i;pNodeArr[i].arriveTime=ArrivalTime[i];pNodeArr[i].rest=ServiceTime[i];}sort(pNodeArr,pNodeArr+n,NodeCmp);inttotalTime=sum(ServiceTime,n);inttime=pNodeArr[0].arriveTime;queue<Node>que;que.push(pNodeArr[0]);isEnterQue[pNodeArr[0].index]=true;Nodecur;cout<<"================================================="<<endl;while(!que.empty()) {cur=que.front();que.pop();cntTimes[cur.index]++;if(cntTimes[cur.index]==1)printf("在%d时刻,进程%d开始执行。。。\n",time,cur.index);if(cur.rest>q){time+=q;cur.rest-=q;}else{time+=cur.rest;Finished[cur.index]=true;FinishTime[cur.index]=time;cur.rest=0;printf("在%d时刻,进程%d执行结束。\n",time,cur.index);}SearchToEnterQue(que,pNodeArr,time);if(cur.rest!=0)que.push(cur);if(que.empty())//若队列为空,则在time之后才达成的进程找最早达成的进程入队列{for(i=0;i<n;i++){if(isEnterQue[i]==false)//找到了{que.push(pNodeArr[i]);//入队列time=pNodeArr[i].arriveTime; break;}}}}for(i=0;i<n;i++){WholeTime[i]=FinishTime[i]-ArrivalTime[i];WeightWholeTime[i]=(double)WholeTime[i]/(double)ServiceTime[i];}AverageWT=(double)sum(WholeTime,n)/(double)n;AverageWWT=(double)sum(WeightWholeTime,n)/(double)n; cout<<"================================================="<<endl;print();cout<<endl<<endl; cout<<"================================================="<<endl;printf("平均周转时间:%.2f,平均带权周转时间:%.2f\n",AverageWT,AverageWWT);delete[]pNodeArr;}intmain(){// freopen("test.txt","rw",stdin);intq;//时间片大小inti;cout<<"输入进程数:";cin>>n;;cout<<"输入每个进程的达成时间:"<<endl;for(i=0;i<n;i++)cin>>ArrivalTime[i];cout<<"输入每个进程的服务时间:"<<endl;for(i=0;i<n;i++)cin>>ServiceTime[i];cout<<"输入时间片大小"<<endl;cin>>q;Work(q);return0;}5.实验成果: 6.实验分析和体会:实验二分区式存储管理1.实验目的:通过这次实验,加深对内存管理的认识,进一步掌握内存的分派、回收算法的思想。2.实验内容:设计程序模拟内存的动态分区法存储管理。内存空闲区使用自由链管理,采用最坏适应算法从自由链中寻找空闲区进行分派,内存回收时假定不做与相邻空闲区的合并。假定系统的内存共640K,初始状态为操作系统本身占用64K。在t1时间之后,有作业A、B、C、D分别请求8K、16K、64K、124K的内存空间;在t2时间之后,作业C完毕;在t3时间之后,作业E请求50K的内存空间;在t4时间之后,作业D完毕。规定编程序分别输出t1、t2、t3、t4时刻内存的空闲区的状态。3.实验环境:硬件环境:GhostXPSP3纯净版Y6.0Pentium(R)Dual-CoreCPUE6700@3.20GHz3.19GHz,1.96GB的内存物理地址扩展软件环境:MicrosoftWindowsXP,VisualStudio4.源代码:#include"stdafx.h"#include<stdio.h>#include<stdlib.h>structfreelink{intlen,address;//len为分区长度;address为分区起始地址structfreelink*next;};//内存占用区用链表描述,其结点类型描述以下:structbusylink{charname;//作业或进程名name='S'表达OS占用intlen,address;structbusylink*next;};//并设全程量:structfreelink*free_head=NULL;//自由链队列带头结点)队首指针?structbusylink*busy_head=NULL,*busy_tail=NULL;//占用区队列队(带头结点)首指针//占用区队列队尾指针//设计子函数:voidstart(void)/*设立系统初始状态*/{structfreelink*p;structbusylink*q;free_head=(structfreelink*)malloc(sizeof(structfreelink));free_head->next=NULL;//创立自由链头结点busy_head=busy_tail=(structbusylink*)malloc(sizeof(structbusylink));busy_head->next=NULL;//创立占用链头结点p=(structfreelink*)malloc(sizeof(structfreelink));p->address=64;p->len=640-64;//(OS占用了K)p->next=NULL;free_head->next=p;q=(structbusylink*)malloc(sizeof(structbusylink));q->name='S';/*S表达操作系统占用*/q->len=64;q->address=0;q->next=NULL;busy_head->next=q;busy_tail=q;}voidrequireMemo(charname,intrequire)/*模拟内存分派*/{structfreelink*w,*u,*v,*x,*y;structbusylink*p;x=free_head;y=free_head->next;while((y!=NULL)&&(y->len<require))//找到第一种满足条件的空闲区{x=y;y=y->next;}if(y!=NULL){p=(structbusylink*)malloc(sizeof(busylink));p->name=name;p->address=y->address;p->len=require;p->next=NULL;busy_tail->next=p;//把p插入到busy_head的尾部busy_tail=p;w=x->next;x->next=w->next;if(w->len==require){free(w);}else{w->address=w->address+require;w->len=w->len-require;u=free_head;v=free_head->next;while((v!=NULL)&&(v->len<w->len))//如果此结点尚有多出,就此又重新插入到空闲区域链中(按照长度由小到大的次序排列){u=v;v=v->next;}u->next=w;w->next=v;}}elseprintf("can'tallocate!\n");}voidfreeMemo(charname)/*模拟内存回收*/{structbusylink*p,*q;structfreelink*w,*u,*v,*s1=NULL,*s2=NULL;intlen,address;intflag1=1,flag2=1;p=busy_head->next;while((p!=NULL)&&(p->name!=name))//找到要回收的结点{q=p;p=p->next;}if(p==NULL){printf("%cisnotexist\n",name);}else{if(p==busy_tail)busy_tail=q;q->next=p->next;len=p->len;address=p->address;free(p);w=(structfreelink*)malloc(sizeof(freelink));w->len=len;w->address=address;u=free_head;v=free_head->next;while((v!=NULL)&&(flag1==1||flag2==1))//归并算法{if((w->address==(v->address+v->len))&&flag1){s1=v;u->next=s1->next;w->address=v->address;w->len+=v->len;v=v->next;flag1=0;}elseif(((w->address+w->len)==v->address)&&flag2){s2=v;u->next=s2->next;w->len+=v->len;v=v->next;flag2=0;}else{u=v;v=v->next;} }if(s1!=NULL)free(s1);if(s2!=NULL)free(s2);u=free_head;v=free_head->next;if(v!=NULL){while((v!=NULL)&&(v->len<w->len)){u=v;v=v->next;}}u->next=w;w->next=v;}}voidpast(inttime)/*模拟系统过了时间time,用sleep(),或者用个空循环*/{printf("时间%d后:\n",time);}voidprintlink()/*输出内存空闲状况(自由链的结点)*/{structfreelink*p;p=free_head->next;if(p==NULL)printf("无空闲区!\n");else{while(p!=NULL){printf("首地址:%d\t长度:%d\n",p->address,p->len);p=p->next;}}printf("\n");}voidprintlink1()/*输出内存占用的状况*/{structbusylink*p;p=busy_head->next;if(p==NULL)printf("无内存占有区!\n");else{while(p!=NULL){printf("名字:%c\t首地址:%d\t长度:%d\n",p->name,p->address,p->len);p=p->next;}}}// 设计主函数:intmain(){start();past(1);requireMemo('A',8);requireMemo('B',16);requireMemo('C',64);requireMemo('D',124);printf("内存占用区为:\n");printlink1();printf("内存空闲区为:\n");printlink();past(2);freeMemo('C');printf("内存占用区为:\n");printlink1();printf("内存空闲区为:\n");printlink();past(3);requireMemo('E',50);printf("内存占用区为:\n");printlink1();printf("内存空闲区为:\n");printlink();return0;}5.实验成果:6.实验分析和体会:首先,对链表又有进一步的理解,尚有就是加深理解内存的分派与回收,分派与回收的方略,并掌握动态分区这种内存管理的具体实施办法。再者,就是在编程中碰到的困难,在编写归并程序首先是自己考虑问题不全方面,写的程序就只顾及到一种结点,而没有实现有两个结点的状况,于是后来再加了一条else语句,就没有出现问题。尚有一种问题就是将多出的结点free时也出现问题,加了一条if(s==NULL),成立就释放掉。一开始把free语句写在while循环内,一旦把找到的结点释放掉,则找不到下一种结点,也会出错,因此应当把free放到while循环外。实验三虚拟存储管理1.实验目的:存储管理的重要功效之一是合理的分派空间。请求页式管理是一种惯用的虚拟存储管理技术。本实验的目的是请求页式存储管理中页面置换算法模拟设计,理解虚拟存储技术的特点,掌握请求页式存储管理的页面置换办法。2.实验内容:(1)通过随机数产生一种指令序列,共320条指令。指令的地址按下述原则生成:50%的指令是次序执行的;25%的指令是均匀分布在前地址部分;25%的指令是均匀分布在后地址部分。具体的实施办法是:在[0,319]的指令地址之间随机选用一起点m;次序执行一条指令,即执行地址为m+1的指令;在前地址[0,m+1]中随机选用一条指令并执行,该指令的地址为m’;次序执行一条指令,其地址为m’+1;在后地址[m’+2,319]中随机选用一条指令并执行;重复上述环节,直至执行320次指令。将指令序列变换成页地址流设:①页面大小为1K;②顾客内存容量为4页到32页;③顾客虚存容量为32K;在顾客虚存中,按每K寄存10条指令排列虚存地址,即320条指令在虚存中的寄存方式为:第0条~第9条指令为第0页(对应的虚存地址为[0,9]);第10条~第19条指令为第1页(对应的虚存地址为[10,19]);.第310条~第319条指令为第31页(对应的虚存地址为[310,319]);按以上方式,顾客指令可构成32页。计算并输出下述多种算法在不同的内存容量下的命中率。先进先出的算法(FIFO);近来最少使用算法(LRR);最佳裁减法(OPT):先裁减最不惯用的页地址;最少访问页面算法(LFR);近来不经常使用算法(NUR)。其中③和④为选择内容。命中率=1-(页面失效次数)/(页地址流长度)在本实验中,页地址流的长度为320,页面失效次数为每次访问对应指令时,该指令所对应的页不在内存的次数。随机数产生措施有关随机书产生措施,能够使用系统提供函数rand(),分别进行初始化和产生随机数。例如:srand();语句可初始化的一种随机数;a[0]=10*rand()/32767*319+1;a[1]=10*rand()/32767*a[0];语句可用来产生a[0]与a[1]中的随机数。3.实验环境:硬件环境:GhostXPSP3纯净版Y6.0Pentium(R)Dual-CoreCPUE6700@3.20GHz3.19GHz,1.96GB的内存物理地址扩展软件环境:MicrosoftWindowsXP,VisualStudio4.源代码:#defineTRUE1#defineFALSE0#defineINVALID-1#defineNULL0#definetotal_instruction320/*指令流长*/#definetotal_vp32/*虚页长*/#defineclear_period50/*清周期*/typedefstruct/*页面构造*/{intpn,pfn,counter,time;}pl_type;pl_typepl[total_vp];/*页面构造数组*/structpfc_struct{/*页面控制构造*/intpn,pfn;structpfc_struct*next;};typedefstructpfc_structpfc_type;pfc_typepfc[total_vp],*freepf_head,*busypf_head,*busypf_tail;intdiseffect,a[total_instruction];intpage[total_instruction],offset[total_instruction];intinitialize(int);intFIFO(int);/*先进先出法(FisrtInFirstOut)*/intLRU(int);/*近来最久未使用(LeastRecentlyUsed)*/intLFU(int);/*最不经常使使用方法(LeastFrequentlyUsed)*/intNUR(int);/*近来未使使用方法(NoUsedRecently)*/intOPT(int);/*最佳置换算法(Optimal)*//*主函数*/intmain(){ints,i,j;srand(10*getpid());/*由于每次运行时进程号不同,故可用来作为初始化随机数队列的“种子”*/s=(float)319*rand()/32767/32767/2+1;//for(i=0;i<total_instruction;i+=4)/*产生指令队列*/{if(s<0||s>319){printf("Wheni==%d,Error,s==%d\n",i,s);exit(0);}a[i]=s;/*任选一指令访问点m*/a[i+1]=a[i]+1;/*次序执行一条指令*/a[i+2]=(float)a[i]*rand()/32767/32767/2;/*执行前地址指令m'*/a[i+3]=a[i+2]+1;/*次序执行一条指令*/s=(float)(318-a[i+2])*rand()/32767/32767/2+a[i+2]+2;if((a[i+2]>318)||(s>319))printf("a[%d+2],anumberwhichis:%dands==%d\n",i,a[i+2],s);}for(i=0;i<total_instruction;i++)/*将指令序列变换成页地址流*/{page[i]=a[i]/10;offset[i]=a[i]%10;}for(i=4;i<=32;i++)/*顾客内存工作区从个页面到个页面*/{printf("%2dpageframes\n",i);FIFO(i);LRU(i);LFU(i);NUR(i);OPT(i);}return0;}intinitialize(total_pf)/*初始化有关数据构造*/inttotal_pf;/*顾客进程的内存页面数*/{inti;diseffect=0;for(i=0;i<total_vp;i++){pl[i].pn=i;pl[i].pfn=INVALID;/*置页面控制构造中的页号,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学课外活动计划汇编6篇
- 试用期个人工作总结
- 感恩老师+演讲稿范文集锦三篇
- 房产销售主管月工作总结
- DB31-T 1394-2023 塑料制品绿色设计评价导则
- 男性患者自助式清洁间歇导尿
- 《社会保险法》讲座课件
- 吉林省长春市虹麓综合高中2023-2024学年高一上学期期末物理试卷
- 做好安全防范
- 酒店相关职业规划
- 校园天眼平台建设方案
- Excel常用函数公式及技巧
- 期末测试卷(试题)-2024-2025学年人教PEP版(2024)英语三年级上册
- 美妆细分市场机会与策略洞察-任拓-202409
- 2024-2030年中国网络安全行业发展前景及投资战略研究报告
- 《学习与娱乐平衡》主题班会
- 加油站风险清单(隐患排查表)(195项) 2024
- 2024年全省职业院校技能大赛(中职教师组)装备制造类智能制造设备技术赛项竞赛样题1
- 2023.05.06-广东省建筑施工安全生产隐患识别图集(高处作业吊篮工程部分)
- 2024版公共卫生间管理服务承包协议
- 部编人教版六年级语文上册习作《有你真好》精美课件
评论
0/150
提交评论