[操作系统作业]os

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 }
posted @ 2012-06-05 21:44  wanpp590  阅读(238)  评论(0编辑  收藏  举报