⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test1.cpp

📁 这个是我们课程设计的代码~~页面之置换~~希望对大家有帮助
💻 CPP
字号:
#include <stdio.h> 
#include <stdlib.h> 

#define mSIZE 4 
#define pSIZE 15 
int memery[mSIZE] = {0}; 
int process[pSIZE] = {0}; 
void build();   //生成一个随机数序列 
void LRU();   //最近最久未使用(LRU)置换算法 
void FIFO();  //先进先出(FIFO)页面置换算法
void OPT();  //最佳淘汰(OPT)算法
void LFU();  //最少访问(LFU)页面算法
void NUR();  //最近最不经常使用(NUR)算法

int main() { 
 int core;
    printf("=============================\n");
 printf("产生随机序列如下:"); 
    build();
 do{                   
    printf("\n         主菜单\n\n");
    printf("1.  先进先出(FIFO)页面置换算法\n");
    printf("2.  最近最久未使用(LRU)置换算法\n");
    printf("3.  最佳淘汰(OPT)算法\n");
    printf("4.  最少访问(LFU)页面算法\n");
    printf("5.  最近最不经常使用(NUR)算法 \n");
    printf("6.  退出程序\n");
       printf("请输入你的选择(1,2,3,4,5,6)\n");
    printf("=============================\n");
    scanf("%d",&core);
    switch(core){
    case 1:FIFO();break;
    case 2:LRU(); break;
    case 3:OPT(); break;
    case 4:LFU(); break;
    case 5:NUR();break;
    case 6:exit(0);       
    }
 }while(core<=6);
return 0;
}

void build() { 
int i = 0; 
for(i=0; i<pSIZE; i++) { 
process[i] = (int)(10.0*rand()/(RAND_MAX+1.0) + 1); 
printf("%d ",process[i]); 
 } 
printf("\n"); 
} 

void FIFO() { 
int time[mSIZE] = {0}; 
int i = 0, j = 0; 
int m = -1, n = -1; 
int max = -1,maxtime = 0; 
int count = 0; 

for(i = 0; i<pSIZE; i++) { //找一个空闲的物理块 
  for(j=0; j<mSIZE; j++) { 
    if(memery[j] == 0) { 
      m = j; 
       break; 
  } 
 } 
     for(j = 0; j < mSIZE; j++) { //找与进程相同的标号 
        if(memery[j] == process[i]) { 
  n = j; 
  } 
 } 
 for(j = 0; j < mSIZE;j++) {    //找time值最大的 
  if(time[j]>maxtime) { 
  maxtime = time[j]; 
  max = j; 
  } 
 } 
 if(n == -1){ //不存在相同进程 
  if(m != -1){ //存在空闲物理块 
  memery[m] = process[i]; 
  time[m] = 0; 
  for(j = 0;j <= m; j++) { 
  time[j]++; 
 } 
         m = -1; 
 } 
  else{      //不存在空闲物理块 
  memery[max] = process[i]; 
  time[max] = 0; 
  for(j = 0;j < mSIZE; j++) { 
  time[j]++; 
  } 
  max = -1; 
  maxtime = 0; 
  count++; 
  } 
 } 
 else{   //存在相同的进程 
  memery[n] = process[i]; 
  for(j = 0;j < mSIZE; j++) { 
  time[j]++; 
  } 
  n = -1; 
 } 
 for(j = 0 ;j < mSIZE; j++) 
  printf("[ %d ]",memery[j]); 
 printf("\n"); 
 } 
   for(j = 0 ;j < mSIZE; j++) 
       memery[j]=0;
printf("页面换算次数为:%d\n",count+mSIZE); 
printf("页面命中率:%6f\n",1-(float)(count+mSIZE)/pSIZE); 
} 

void LRU() { 
int flag[mSIZE] = {0}; 
int i = 0, j = 0; 
int m = -1, n = -1; 
int max = -1,maxflag = 0; 
int count = 0; 

for(i = 0; i<pSIZE; i++) { //找第一个空闲的物理块 
  for(j=0; j<mSIZE; j++) { 
    if(memery[j] == 0) { 
     m = j; 
     break; 
 } 
} 
//找与进程相同的标号 
for(j = 0; j < mSIZE; j++) { 
   if(memery[j] == process[i]) { 
     n = j; 
   } 
} 
//找flag值最大的 
for(j = 0; j < mSIZE;j++) { 
  if(flag[j]>maxflag) { 
   maxflag = flag[j]; 
   max = j; 
  } 
} 

if(n == -1){           //不存在相同进程 
    if(m != -1){        //存在空闲物理块  
     memery[m] = process[i]; 
      flag[m] = 0; 
      for(j = 0;j <= m; j++) { 
       flag[j]++; 
   } 
    m = -1; 
 } 
 else{                //不存在空闲物理块 
        memery[max] = process[i]; 
        flag[max] = 0; 
      for(j = 0;j < mSIZE; j++) { 
      flag[j]++; 
   } 
      max = -1; 
      maxflag = 0; 
     count++; 
 } 
} 
else{                          //存在相同的进程 
     memery[n] = process[i]; 
     flag[n] = 0; 
  if(m != -1){       //若存在空闲物理块  
     flag[m] = 0; 
  } 
 for(j = 0;j < mSIZE; j++) { 
     flag[j]++; 
} 
   max = -1; 
   maxflag = 0; 
   n = -1; 
} 
for(j = 0 ;j < mSIZE; j++) { 
   printf("[ %d ]",memery[j]); 
 } 
   printf("\n"); 
} 
 for(j = 0 ;j < mSIZE; j++) 
       memery[j]=0;
printf("页面换算次数为:%d\n",count+mSIZE); 
printf("页面命中率:%6f\n",1-(float)(count+mSIZE)/pSIZE); 
} 

void OPT(){
int Lasttime[mSIZE] = {0}; 
int i = 0, j = 0; 
int m = -1, n = -1; 
int max = -1,maxLasttime = 0; 
int count = 0; 

for(i = 0; i<pSIZE; i++) { //找第一个空闲的物理块 
  for(j=0; j<mSIZE; j++) { 
    if(memery[j] == 0) { 
     m = j; 
     break; 
 } 
} 
  for(j = 0; j < mSIZE; j++) {   //找与进程相同的标号 
   if(memery[j] == process[i]) { 
     n = j; 
   } 
} 
for(j = 0; j < mSIZE;j++) { //找Lasttime值最大的 
  if(Lasttime[j]>maxLasttime) { 
    maxLasttime = Lasttime[j]; 
    max = j; 
  } 
} 
if(n == -1){           //不存在相同进程 
    if(m != -1){        //存在空闲物理块  
     memery[m] = process[i]; 
      Lasttime[m] = 0; 
     for(int a=i;a<pSIZE;a++)
      for(j = 0;j < mSIZE; j++){
      if(memery[j]!=process[a])
       Lasttime[j]++; 
      break;
    }
    m = -1; 
 } 
 else{                //不存在空闲物理块 
        memery[max] = process[i]; 
        Lasttime[max] = 0; 
 for(int a=i;a<pSIZE;a++)
  for(j = 0;j < mSIZE; j++){
    if(memery[j]!=process[a])
     Lasttime[j]++;
    break; 
  }
      max = -1; 
      maxLasttime = 0; 
      count++; 
 } 
} 
else{                          //存在相同的进程 
     memery[n] = process[i]; 
     Lasttime[n] = 0; 
  if(m != -1){             //若存在空闲物理块  
  
        Lasttime[m] = 0;    
 for(int a=i;a<pSIZE;a++)
  for(j = 0;j < mSIZE; j++){
    if(memery[j]!=process[a])
     Lasttime[j]++; 
    break;
  }
      max = -1; 
      maxLasttime = 0; 
  }
   n = -1; 
} 
for(j = 0 ;j < mSIZE; j++) 
   printf("[ %d ]",memery[j]); 
   printf("\n"); 
} 
 for(j = 0 ;j < mSIZE; j++) 
       memery[j]=0;
printf("页面换算次数为:%d\n",count+mSIZE); 
printf("页面命中率:%6f\n",1-(float)(count+mSIZE)/pSIZE); 
} 

void LFU(){
int less[mSIZE] = {0}; 
int i = 0, j = 0; 
int m = -1, n = -1; 
int min = -1,minless = 32767; 
int count = 0; 

for(i = 0; i<pSIZE; i++) { //找第一个空闲的物理块 
  for(j=0; j<mSIZE; j++) { 
    if(memery[j] == 0) { 
     m = j; 
     break; 
	} 
} 
//找与进程相同的标号 
for(j = 0; j < mSIZE; j++) { 
   if(memery[j] == process[i]) { 
     n = j; 
   } 
} 
//找less值最小的 
for(j = 0; j < mSIZE;j++) { 
  if(less[j]<minless) { 
   minless = less[j]; 
   min = j; 
  } 
} 

if(n == -1){            //不存在相同进程 
    if(m != -1){        //存在空闲物理块  
     memery[m] = process[i]; 
	 less[m] = 1;
      m = -1; 
	} 
	else{                //不存在空闲物理块 
        memery[min] = process[i];
		less[min] = 1;
		min= -1; 
		minless = 32767;
		count++; 
	} 
} 
else{                          //存在相同的进程 
     memery[n] = process[i]; 
	 less[n]++;  	                           
	 min = -1; 
	 minless = 32767;
     n = -1; 
} 
for(j = 0 ;j < mSIZE; j++) { 
   printf("[ %d ]",memery[j]); 
	} 
   printf("\n"); 
} 
 for(j = 0 ;j < mSIZE; j++) 
       memery[j]=0;
printf("页面换算次数为:%d\n",count+mSIZE); 
printf("页面命中率:%6f\n",1-(float)(count+mSIZE)/pSIZE); 
} 

void NUR(){
int nur[mSIZE] = {0}; 
int i = 0, j = 0; 
int m = -1, n = -1; 
int max = -1,maxnur = 0; 
int count = 0; 

for(i = 0; i<pSIZE; i++) { //找第一个空闲的物理块 
  for(j=0; j<mSIZE; j++) { 
    if(memery[j] == 0) { 
     m = j; 
     break; 
	} 
} 
//找与进程相同的标号 
for(j = 0; j < mSIZE; j++) { 
   if(memery[j] == process[i]) { 
     n = j; 
   } 
} 
//找nur值最大的 
for(j = 0; j < mSIZE;j++) { 
  if(nur[j]>maxnur) { 
   maxnur = nur[j]; 
   max = j; 
  } 
} 

if(n == -1){           //不存在相同进程 
    if(m != -1){        //存在空闲物理块  
     memery[m] = process[i]; 
      nur[m] = 0; 
      for(j = 0;j < m; j++) { 
       nur[j]++; 
	  } 
    m = -1; 
	} 
	else{                //不存在空闲物理块 
        memery[max] = process[i]; 
        nur[max] = 0; 
      for(j = 0;j < mSIZE&&j!=max;j++) { 
          nur[j]++; 
	  } 
      max = -1; 
      maxnur = 0; 
     count++; 
	} 
} 
else{                          //存在相同的进程 
     memery[n] = process[i]; 
     nur[n] = 0; 
  if(m != -1){       //若存在空闲物理块  
     nur[m] = 0; 
  } 
 for(j = 0;j < mSIZE&&j!=n; j++) { 
     nur[j]++; 
} 
   max = -1; 
   maxnur = 0; 
   n = -1; 
} 
for(j = 0 ;j < mSIZE; j++) { 

   printf("[ %d ]",memery[j]); 
 } 
   printf("\n"); 
} 
 for(j = 0 ;j < mSIZE; j++) 
       memery[j]=0;
printf("页面换算次数为:%d\n",count+mSIZE); 
printf("页面命中率:%6f\n",1-(float)(count+mSIZE)/pSIZE); 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -