赞
踩
理解页面置换算法,实现先进先出(FIFO)置换算法和最久未使用(LRU)置换算法,给出任意的输入流,计算置换次数。
给出任意的输入流,计算置换次数。物理块大小可定制,0~9数字任意排序的数字流。
- #include <stdio.h>
-
- void initial(int list[],int number){//初始化队列
- for(int i=0;i<number;i++){
- list[i]=-1;
- }
- }
- void FIFO(int memorylist[],int phynum,int strlist[],int pagenum){
- int replacecount=0;
- int earliest=0;//记录当前最早进入内存的下标
- int isvisited=0;//记录当前页面访问情况
- for(int i=0;i<pagenum;i++){
- isvisited=0;
- //判断是否需要置换(内存已满且需要访问的页面不在内存中)
- for(int j=0;j<phynum;j++){
- if(memorylist[j]==strlist[i]){
- //页面已经再内存中
- isvisited=1;//修改访问情况
- break;
- }
- if(memorylist[j]==-1){
- //页面不在内存中且内存未满(直接存入)
- memorylist[j]=strlist[i];
- isvisited=1;//修改访问情况
- break;
- }
- }
- if(!isvisited){
- //当前页面未被访问(进行页面置换)
- memorylist[earliest]=strlist[i];
- //下标指向下一个
- earliest++;
- //若到了最后一个,下标归零
- if(earliest>phynum-1){
- earliest=0;
- }
- replacecount++;
- }
- }
- printf("置换次数:%d\n",replacecount);
- }
- void LRU(int memorylist[],int phynum,int strlist[],int pagenum){
- int replacecount=0;//置换次数
- //记录内存中最近一次访问至今的时间
- int timerecord[phynum];
- initial(timerecord,phynum);
- //记录当前页面的访问情况
- int isvisited=0;
-
- //记录已经在内存中的页面数量
- int pagecount=0;
- for(int i=0;i<pagenum;i++){
- isvisited=0;
-
- //将已经在内存的页面时间加1
- for(int p=0;p<pagecount;p++){
- if(memorylist[p]!=-1){
- timerecord[p]++;
- }
- }
-
- //是否需要置换
- for(int j=0;j<phynum;j++){
- if(memorylist[j]!=-1){
- timerecord[j]++;
- }
- if(memorylist[j]==strlist[i]){
- //该页面已经在内存中,修改访问情况
- isvisited=1;
- //重置访问时间
- timerecord[j]=-1;
- break;
- }
- if(memorylist[j]==-1){
- //页面不在内存中且内存未满(直接存入)
- memorylist[j]=strlist[i];
- pagecount++;
- //修改访问情况
- isvisited=1;
- //修改访问时间
- timerecord[j]++;
- break;
- }
- }
- if(!isvisited){
- //需要置换,寻找最久未访问的页面所在内存下标
- int max=0;
- //即找数组最大值
- for(int k=0;k<phynum;k++){
- if(timerecord[max]<timerecord[k]){
- max=k;
- }
- }
- //将该位置的页面换出
- memorylist[max]=strlist[i];
- timerecord[max]=-1;
- replacecount++;
- }
- }
- printf("置换次数:%d\n",replacecount);
- }
- int main(){
- //物理块的数量
- int phyblocknum;
- printf("请输入物理块的数量:\n");
- scanf("%d",&phyblocknum);
-
- //内存队列
- int memorylist[phyblocknum];
- //初始化内存状态
- initial(memorylist,phyblocknum);
-
- //页面数量
- int pagenum;
- printf("请输入要访问的页面数量:\n");
- scanf("%d",&pagenum);
-
- int pagenumstrlist[pagenum];
- printf("请输入要访问的页面号:\n");
- for(int i=0;i<pagenum;i++){
- scanf("%d",&pagenumstrlist[i]);
- }
-
- int choose;//需要选择的置换算法
- while(1){
-
- printf("请选择所需的置换算法:\n");
- printf("1:FIFO 2.LRU 3.退出 ");
- scanf("%d",&choose);
-
- switch(choose){
- case 1:
- FIFO(memorylist,phyblocknum,pagenumstrlist,pagenum);
- initial(memorylist,phyblocknum);
- break;
- case 2:
- LRU(memorylist,phyblocknum,pagenumstrlist,pagenum);
- initial(memorylist,phyblocknum);
- break;
- default:
- return 0;
- break;
- }
- }
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。