软件学院上机实验报告课程名称:操作系统原理实验项目:实验三虚拟内存页面置换算法实验室:耘慧402姓名:王欣鸿学号:1320010724专业班级:软件13-7班实验时间:2015-12-13实验成绩评阅教师一、实验目的及要求通过这次实验,加深对虚拟内存页面置换概念的理解,进一步掌握先进先出FIFO、最佳置换OPI和最近最久未使用LRU页面置换算法的实现方法。结合Linux的内层的分析方法查看内存的分配过程及linuxkernel的内存管理机制。二、实验性质设计性三、实验学时2学时四、实验环境C与C++程序设计学习与实验系统五、实验内容及步骤通过已知最小物理块数、页面个数、页面访问序列、及采用置换方式可以得出页面置换的缺页次数和缺页率,及每次缺页时物理块中存储。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.详细记录在调试过程中出现的问题及解决方法;在c程序运行过程中,由于我的代码是在windows环境下编译出来的,所以很多函数调用过程是vc++特有的,并不适合于linux,所以又在上机过程中将某些函数进行了修改才得以运行。2.记录实验执行的结果(运行结果截图)。3.结果分析对输入的数据进行比较发现不同的置换算法的运行效率不一样,发现LRU是一种较好的算法,它的性能比先进先出的算法更好,功能更加接近最佳置换算法。七、实验总结本次上机主要是通过c语言实现各种调度算法,这使我懂得了os的一些进程调度的过程,为了使得系统运行的更加高效,我们的前辈们不断地探索和思考,终于一步一步的实现了这些算法,大大的改善了os的运行环境,正是由于他们的努力才使得我们能够享受这么美妙的编程环境,所以我们应该体会他们的辛苦,并且跟随他们的脚步继续探索更加优秀的算法,将os做的更加完善、更加人性化。附录源程序清单d.c#includestdio.h//usingnamespacestd;#defineMAX10structtask_struct{charname[10];/*进程名称*/intnumber;/*进程编号*/floatcome_time;/*到达时间*/floatrun_begin_time;/*开始运行时间*/floatrun_time;/*运行时间*/floatrun_end_time;/*运行结束时间*/intpriority;/*优先级*/intorder;/*运行次序*/intrun_flag;/*调度标志*/}tasks[MAX];intcounter;/*实际进程个数*/intfcfs();/*先来先服务*/intps();/*优先级调度*/intsjf();/*短作业优先*/inthrrn();/*响应比高优先*/intpinput();/*进程参数输入*/intpoutput();/*调度结果输出*/voidmain(){intoption;pinput();printf(请选择调度算法(0~4):\n);printf(1.先来先服务\n);printf(2.优先级调度\n);printf(3.短作业优先\n);printf(4.响应比高优先\n);printf(0.退出\n);scanf(%d,&option);switch(option){case0:printf(运行结束。\n);break;case1:printf(对进程按先来先服务调度。\n\n);fcfs();poutput();break;case2:printf(对进程按优先级调度。\n\n);ps();poutput();break;case3:printf(对进程按短作业优先调度。\n\n);sjf();poutput();break;case4:printf(对进程按响应比高优先调度。\n\n);hrrn();poutput();break;}}intfcfs()/*先来先服务*/{floattime_temp=0;inti;intnumber_schedul;time_temp=tasks[0].come_time;for(i=0;icounter;i++){tasks[i].run_begin_time=time_temp;tasks[i].run_end_time=tasks[i].run_begin_time+tasks[i].run_time;tasks[i].run_flag=1;time_temp=tasks[i].run_end_time;number_schedul=i;tasks[number_schedul].order=i+1;}return0;}intps()/*优先级调度*/{floattemp_time=0;inti=0,j;intnumber_schedul,temp_counter;intmax_priority;max_priority=tasks[i].priority;j=1;while((jcounter)&&(tasks[i].come_time==tasks[j].come_time)){if(tasks[j].prioritytasks[i].priority){max_priority=tasks[j].priority;i=j;}j++;}/*查找第一个被调度的进程*//*对第一个被调度的进程求相应的参数*/number_schedul=i;tasks[number_schedul].run_begin_time=tasks[number_schedul].come_time;tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+tasks[number_schedul].run_time;tasks[number_schedul].run_flag=1;temp_time=tasks[number_schedul].run_end_time;tasks[number_schedul].order=1;temp_counter=1;while(temp_countercounter){max_priority=0;for(j=0;jcounter;j++){if((tasks[j].come_time=temp_time)&&(!tasks[j].run_flag))if(tasks[j].prioritymax_priority){max_priority=tasks[j].priority;number_schedul=j;}}/*查找下一个被调度的进程*//*对找到的下一个被调度的进程求相应的参数*/tasks[number_schedul].run_begin_time=temp_time;tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+tasks[number_schedul].run_time;tasks[number_schedul].run_flag=1;temp_time=tasks[number_schedul].run_end_time;temp_counter++;tasks[number_schedul].order=temp_counter;}return0;}intsjf()/*短作业优先*/{floattemp_time=0;inti=0,j;intnumber_schedul,temp_counter;floatrun_time;run_time=tasks[i].run_time;j=1;while((jcounter)&&(tasks[i].come_time==tasks[j].come_time)){if(tasks[j].run_timetasks[i].run_time){run_time=tasks[j].run_time;i=j;}j++;}/*查找第一个被调度的进程*//*对第一个被调度的进程求相应的参数*/number_schedul=i;tasks[number_schedul].run_begin_time=tasks[number_schedul].come_time;tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+tasks[number_schedul].run_time;tasks[number_schedul].run_flag=1;temp_time=tasks[number_schedul].run_end_time;tasks[number_schedul].order=1;temp_counter=1;while(temp_countercounter){for(j=0;jcounter;j++){if((tasks[j].come_time=temp_time)&&(!tasks[j].run_flag)){run_time=tasks[j].run_time;number_schedul=j;break;}}for(j=0;jcounter;j++){if((tasks[j].come_time=temp_time)&&(!tasks[j].run_flag))if(tasks[j].run_timerun_time){run_time=tasks[j].run_time;number_schedul=j;}}/*查找下一个被调度的进程*//*对找到的下一个被调度的进程求相应的参数*/tasks[number_schedul].run_begin_time=temp_time;tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+tasks[number_schedul].run_time;tasks[number_schedul].run_flag=1;temp_time=tasks[number_schedul].run_end_time;temp_counter++;tasks[number_schedul].order=temp_counter;}return0;}inthrrn()/*响应比高优先*/{intj,number_schedul,temp_counter;floattemp_time,respond_rate,max_respond_rate;/*第一个进程被调度*/tasks[0].run_begin_time=tasks[0].come_time;tasks[0].run