软件学院上机实验报告课程名称:计算机操作系统试验实验项目:虚拟内存页面置换算法实验室:耘慧402姓名:学号:专业班级:实验时间:实验成绩评阅教师一、实验目的及要求给出本次实验所涉及并要求掌握的知识点二、实验性质设计性三、实验学时2学时四、实验环境C与C++程序设计学习与实验系统五、实验内容及步骤①实验内容假设有n个进程分别在T1,…,Tn时刻到达系统,它们需要的服务时间分别为S1,…,Sn。分别采用先来先服务FCFS和短作业优先SJF进程调度算法进行调度,计算每个进程的完成时间、周转时间和带权周转时间,并且统计n个进程的平均周转时间和平均带权周转时间。②实验步骤通过已知最小物理块数、页面个数、页面访问序列、及采用置换方式可以得出页面置换的缺页次数和缺页率,及每次缺页时物理块中存储。1.输入的形式intPageOrder[MaxNumber];//页面序列intPageNum,LackNum=0,BlockNum;//页面个数,缺页次数,最小物理块数2.输出的形式doubleLackPageRate//缺页率缺页个数每次缺页时物理块中存储模拟先进先出FIFO、最佳置换OPI和最近最久未使用LRU页面置换算法的工作过程。假设内存中分配给每个进程的最小物理块数为m,在进程运行过程中要访问的页面个数为n,页面访问序列为P1,…,Pn,分别利用不同的页面置换算法调度进程的页面访问序列,给出页面访问序列的置换过程,计算每种算法缺页次数和缺页率。测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。intPageOrder[MaxNumber];//页面序列intPageCount[MaxNumber]={0};//计算内存内数据离下一次出现的距离intPageNum,LackNum=0,BlockNum;//页面个数,缺页次数,最小物理块数doubleLackPageRate=0;boolfound=false;六、实验数据及结果分析1.FCFS算法图1.12.时间片轮换算法图2.1图2.23.优先级调度算法图3.1图3.24.最短作业调度算法图4.1图4.2图4.3图4.45.最短剩余时间优先算法图5.1图5.2图5.3七、实验总结通过二次编程,又一次加深了对先进先出(FIFO)页面置换算法,最佳(OPI)置换算法,最近最久未使用(LRU)置换算法的理解。同时,也掌握了一些使界面输出看起来更工整的办法。还有,在平时做作业的时候,总是默认为物理块数是3,其实只是比较常用而已,并不是每次都是3.这个在编程中有体现,在今后做题中会更注意。附录源程序清单importjava.util.ArrayList;importjava.util.Scanner;classProcess{publicStringProcessName;//进程名字publicintTime;//进程需要时间publicintleval;//进程优先级publicintLeftTime;//进程运行一段时间后还需要的时间}publicclassaa{/**staticvoidCopy(Processproc1,Processproc2);//把proc2赋值给proc1*staticvoidSort(Processpr[],intsize);//此排序后按优先级从大到小排列staticvoid*sort1(Processpr[],intsize);//此排序后按需要的cpu时间从小到大排列staticvoidFcfs(*Processpr[],intnum,intTimepice);//先来先服务算法staticvoidTimeTurn(*Processprocess[],intnum,intTimepice);//时间片轮转算法staticvoid*Priority(Processprocess[],intnum,intTimepice);//优先级算法*/publicstaticvoidcout(Objecta){if(a==null){System.out.println();}else{System.out.println(a);}}publicstaticintcin(){Scannercin=newScanner(System.in);returncin.nextInt();}publicstaticStringcinString(){Scannercin=newScanner(System.in);returncin.next();@SuppressWarnings(null)publicstaticvoidmain(String[]args){inta;cout(null);cout(选择调度算法:);cout(1:FCFS2:时间片轮换3:优先级调度4:最短作业优先5:最短剩余时间优先);a=cin();intSize=30;//ArrayListProcessprocesss=newArrayListProcess();Processprocess[]=newProcess[30];for(inti=0;i30;i++){process[i]=newProcess();}intnum;intTimePice;cout(输入进程个数:);num=cin();cout(输入此进程时间片大小:);TimePice=cin();for(inti=0;inum;i++){Stringname;intCpuTime;intLeval;cout(输入第+(i+1)+个进程的名字,cpu时间和优先级:);name=cinString();process[i].ProcessName=name;CpuTime=cin();process[i].Time=CpuTime;Leval=cin();process[i].leval=Leval;cout(null);}for(intk=0;knum;k++)process[k].LeftTime=process[k].Time;//对进程剩余时间初始化cout((说明:在本程序所列进程信息中,优先级一项是指进程运行后的优先级!!));cout(null);cout(null);cout(进程名字共需占用CPU时间还需要占用时间优先级状态);if(a==1)Fcfs(process,num,TimePice);elseif(a==2)TimeTurn(process,num,TimePice);elseif(a==3){Sort(process,num);Priority(process,num,TimePice);}else//最短作业算法,先按时间从小到大排序,再调用Fcfs算法即可{sort1(process,num);Fcfs(process,num,TimePice);}}publicstaticvoidCopy(Processproc1,Processproc2){proc1.leval=proc2.leval;proc1.ProcessName=proc2.ProcessName;proc1.Time=proc2.Time;}publicstaticvoidSort(Processpr[],intsize)//以进程优先级高低排序{//直接插入排序for(inti=1;isize;i++){Processtemp;temp=pr[i];intj=i;while(j0&&temp.levalpr[j-1].leval){pr[j]=pr[j-1];j--;}pr[j]=temp;}//直接插入排序后进程按优先级从小到大排列for(intd=size-1;dsize/2;d--){Processtemp;temp=pr[d];pr[d]=pr[size-d-1];pr[size-d-1]=temp;}//此排序后按优先级从大到小排列}/*最短作业优先算法的实现*/publicstaticvoidsort1(Processpr[],intsize)//以进程时间从低到高排序{//直接插入排序for(inti=1;isize;i++){Processtemp;temp=pr[i];intj=i;while(j0&&temp.Timepr[j-1].Time){pr[j]=pr[j-1];j--;}pr[j]=temp;}}/*先来先服务算法的实现*/publicstaticvoidFcfs(Processprocess[],intnum,intTimepice){//process[]//是输入的进程,num是进程的数目,Timepice是时间片大小while(true){if(num==0){cout(所有进程都已经执行完毕!);System.exit(1);}if(process[0].LeftTime=0){cout(进程+process[0].ProcessName+已经执行完毕!);for(inti=0;inum;i++)process[i]=process[i+1];num--;}elseif(process[num-1].LeftTime=0){cout(进程+process[num-1].ProcessName+已经执行完毕!);num--;}else{cout(null);//输出正在运行的进程process[0].LeftTime=process[0].LeftTime-Timepice;process[0].leval=process[0].leval-1;cout(+process[0].ProcessName++process[0].Time++process[0].LeftTime++process[0].leval+运行);for(ints=1;snum;s++){cout(+process[s].ProcessName++process[s].Time++process[s].LeftTime++process[s].leval+等待);}}//elsecout(null);//system(pause);cout(null);}//while}/*时间片轮转调度算法实现*/publicstaticvoidTimeTurn(Processprocess[],intnum,intTimepice){while(true){if(num==0){cout(所有进程都已经执行完毕!);System.exit(1);}if(process[0].LeftTime=0){cout(进程+process[0].ProcessName+已经执行完毕!);for(inti=0;inum;i++)process[i]=process[i+1];num--;}if(num!=0){if(process[num-1].LeftTime=0){cout(进程+process[num-1].ProcessName+已经执行完毕!);num--;}elseif(process[0].LeftTime0){cout(null);//输出正在运行的进程process[0].LeftTime=process[0].LeftTime-Timepice;process[0].leval=process[0].leval-1;cout(+process[0].ProcessName++process[0].Time++process[0].LeftTime++process[0].leval+运行);for(ints=1;snum;s++){System.out.print(+process[s].ProcessName++process[s].Time++process[s].LeftTime++process[s].leval);if(s==1)cout(就绪);els