View Code
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <sys/types.h> 4 #include <unistd.h> 5 #include <string.h> 6 #include <sys/stat.h> 7 #include <fcntl.h> 8 #include <error.h> 9 #include <wait.h> 10 #define PSIZE 2 11 #define total_instruction 10 12 #define frame_num 4 13 14 int Acess_Series[total_instruction];//存访问页面序列 15 struct one_frame { 16 int page_no; 17 char flag; 18 }; 19 struct one_frame M_Frame[frame_num]; 20 //这里frame_num是给一个进程分配的最大的内存页面数 21 int isExist(int page){ 22 int i; 23 for(i = 0; i < frame_num; i++){ 24 if(M_Frame[i].page_no==page) 25 return 1; 26 } 27 return 0; 28 }; 29 int getPagePtr(int page){ 30 int i; 31 for(i = 0; i < frame_num; i++){ 32 if(M_Frame[i].page_no==page) 33 return i; 34 } 35 return 0; 36 }; 37 void printMsg(int full_ptr){ 38 int i; 39 for(i = 0; i < full_ptr; i++){ 40 printf("%d ",M_Frame[i].page_no); 41 } 42 printf("\n"); 43 } 44 45 46 int main(){ 47 int i; 48 //随机产生内存访问页面序列,存于数组Acess_Series[total_instruction]中 49 srand(time(NULL)); 50 for(i = 0; i < total_instruction; i++){ 51 Acess_Series[i] = rand()%7 + 1;//1 ~ 7 52 } 53 printf("the pages that will be touch:\n"); 54 for(i = 0; i < total_instruction; i++){ 55 printf("%d ",Acess_Series[i]); 56 } 57 printf(" 最大的内存页面数:%d \n",frame_num); 58 pid_t pid_1,pid_2; 59 if((pid_1=fork()) == -1){ 60 printf("error in fork()!"); 61 exit(1); 62 }else if(pid_1 == 0){ 63 printf("FIFO child pid:%d , my father pid:\n",getpid(),getppid()); 64 int full_ptr = 0; 65 int ming_num = 0,que_num = 0; 66 for(i = 0; i < total_instruction; i++){ 67 if(isExist(Acess_Series[i])){ 68 ming_num++; 69 }else{ 70 que_num++;//看M_Frame[]中有无空闲页面,如果有,装入待访问页,并统计缺页情况,缺页次数加1 71 if(full_ptr < frame_num){//isFull(M_Frame) 72 M_Frame[full_ptr].page_no = Acess_Series[i]; 73 M_Frame[full_ptr].flag = 'y'; 74 full_ptr++; 75 }else{//如果M_Frame[]中的所有页面均被占满,则淘汰M_Frame[0],装入待访问页,重新调整各页面在数组中的位置。并统计缺页情况,缺页次数加1 76 int j; 77 printf("ss\n"); 78 for(j = 1; j < frame_num; j++){ 79 M_Frame[j - 1].page_no = M_Frame[j].page_no; 80 M_Frame[j - 1].flag = M_Frame[j].flag; 81 } 82 M_Frame[j - 1].page_no = Acess_Series[i]; 83 M_Frame[j - 1].flag = 'y'; 84 } 85 } 86 printMsg(full_ptr); 87 } 88 printf("FIFO child end, ming : %d,que : %d.\n",ming_num,que_num); 89 exit(0); 90 }else{ 91 if((pid_2=fork()) == -1){ 92 printf("error in fork()!"); 93 exit(1); 94 }else if(pid_2 == 0){ 95 printf("LRU child pid:%d , my father pid:\n",getpid(),getppid()); 96 int full_ptr = 0; 97 int ming_num = 0,que_num = 0; 98 for(i = 0; i < total_instruction; i++){ 99 if(isExist(Acess_Series[i])){ 100 ming_num++; 101 int page_ptr = getPagePtr(Acess_Series[i]); 102 int j; 103 struct one_frame frame_temp; 104 frame_temp.page_no = M_Frame[page_ptr].page_no; 105 frame_temp.flag = M_Frame[page_ptr].flag; 106 for(j = page_ptr+1; j < full_ptr; j++){ 107 M_Frame[j - 1].page_no = M_Frame[j].page_no; 108 M_Frame[j - 1].flag = M_Frame[j].flag; 109 } 110 M_Frame[j - 1].page_no = frame_temp.page_no; 111 M_Frame[j - 1].flag = frame_temp.flag; 112 }else{ 113 que_num++;//看M_Frame[]中有无空闲页面,如果有,装入待访问页,并统计缺页情况,缺页次数加1 114 if(full_ptr < frame_num){//isFull(M_Frame) 115 M_Frame[full_ptr].page_no = Acess_Series[i]; 116 M_Frame[full_ptr].flag = 'y'; 117 full_ptr++; 118 }else{//如果M_Frame[]中的所有页面均被占满,则淘汰M_Frame[0],装入待访问页,重新调整各页面在数组中的位置。并统计缺页情况,缺页次数加1 119 int j; 120 for(j = 1; j < frame_num; j++){ 121 M_Frame[j - 1].page_no = M_Frame[j].page_no; 122 M_Frame[j - 1].flag = M_Frame[j].flag; 123 } 124 M_Frame[j - 1].page_no = Acess_Series[i]; 125 M_Frame[j - 1].flag = 'y'; 126 } 127 } 128 printMsg(full_ptr); 129 } 130 printf("LRU child end, ming : %d,que : %d.\n",ming_num,que_num); 131 exit(0); 132 }else{//等待子进程执行结束,退出。 133 pid_t pid; 134 while(i < PSIZE){ 135 if((pid = wait(0)) < 0){ 136 printf("error in waitepid.\n"); 137 exit(1); 138 }else{ 139 printf("child process %d is endreturn.\n",pid); 140 } 141 i++; 142 } 143 exit(0); 144 } 145 } 146 }