首页 > 代码库 > 内存管理模拟

内存管理模拟

内存管理模拟算法:首次适应算法、最佳适应算法、最坏适应算法

此程序是参考别人的,因此也没有什么好说的,感觉写的不错就贴上来了

代码如下:

  1 #include<stdio.h>  2 #include<malloc.h>  3 #include<stdlib.h>  4   5 #define PROCESS_NAME_LEN 32 //进程名字长度  6 #define MIN_SLICE 10 //最小碎片大小  7 #define DEFAULT_MEM_SIZE 1024 // 默认的内存大小  8 #define DEFAULT_MEM_START 0 //起始地址  9  10 #define MA_FF 1                    //首次适应算法 11 #define MA_BF 2                    //最佳适应算法 12 #define MA_WF 3                    //最坏适应算法 13  14  15 //空闲分区的结构体 16 typedef struct free_block_type{ 17     int size; 18     int start_addr; 19     struct free_block_type *next; 20 }free_block_type; 21  free_block_type *free_block; 22  23  24  //已分配分区的结构体 25 typedef struct allocated_block{ 26     int pid; 27     int size; 28     int start_addr; 29     char process_name[PROCESS_NAME_LEN]; 30     struct allocated_block *next; 31  }allocated_block; 32  33 struct allocated_block *allocated_block_head = NULL; 34  35 int mem_size=DEFAULT_MEM_SIZE; 36 int ma_algorithm = MA_FF; 37 static int pid = 0; 38 int flag = 0; 39  40 //函数声明 41 void display_menu(); 42 int set_mem_size(); 43 void set_algorithm(); 44 void rearrange(int algorithm); 45 int new_process(); 46 int allocate_mem (struct allocated_block *ab); 47 void kill_process(); 48 int free_mem (struct allocated_block *ab); 49 int dispose (struct allocated_block *free_ab); 50 int display_mem_usage(); 51 allocated_block * find_process(int pid); 52 void rearrange_FF(); 53 void rearrange_BF(); 54 void rearrange_WF(); 55  56 //初始化空闲分区 57 free_block_type* init_free_block(int mem_size){ 58     free_block_type *fb; 59     fb=(free_block_type *)malloc(sizeof(free_block_type)); 60     if(fb==NULL){ 61         printf("No mem\n"); 62         return NULL; 63         } 64     fb->size = mem_size; 65     fb->start_addr = DEFAULT_MEM_START; 66     fb->next = NULL; 67     return fb; 68 } 69  70 //显示主菜单 71 void display_menu(){ 72     printf("\n"); 73     printf("1 - Set memory size (default=%d)\n", DEFAULT_MEM_SIZE); 74     printf("2 - Select memory allocation algorithm\n"); 75     printf("3 - New process \n"); 76     printf("4 - Terminate a process \n"); 77     printf("5 - Display memory usage \n"); 78     printf("0 - Exit\n"); 79 } 80  81 /*设置内存大小*/ 82 int set_mem_size(){ 83     int size; 84     if(flag!=0){ /*flag标志防止内存被再次设置*/ 85         printf("Cannot set memory size again\n"); 86         return 0; 87         } 88     printf("Total memory size ="); 89     scanf("%d", &size); 90     if(size>0) { 91         mem_size = size; 92         free_block->size = mem_size;/*设置初始大小为 1024*/ 93         } 94     flag=1; 95     return 1; 96  } 97  /*选择当前算法*/ 98 void set_algorithm(){ 99     int algorithm;100     printf("\t1 - First Fit\n");101     printf("\t2 - Best Fit \n");102     printf("\t3 - Worst Fit \n");103     printf("Please input your choice : ");104     scanf("%d", &algorithm);105     if(algorithm>=1 && algorithm <=3)106               ma_algorithm=algorithm;107 108     rearrange(ma_algorithm);109 }110 111 /*为每一个进程分配完内存以后重新按已选择的算法再次排序*/112 void rearrange(int algorithm){113     switch(algorithm){114         case MA_FF: rearrange_FF(); break;115         case MA_BF: rearrange_BF(); break;116         case MA_WF: rearrange_WF(); break;117         }118 }119 /*首次适应算法,按地址的大小由小到达排序*/120 void rearrange_FF(){121     free_block_type *temp,*p=NULL;122     free_block_type *head=NULL;123     int current_min_addr;124 125     if(free_block){126         temp=free_block;127         current_min_addr=free_block->start_addr;128         while(temp->next!=NULL){129             if(temp->next->start_addr<current_min_addr){130                 current_min_addr=temp->next->start_addr;131                 p=temp;132                 }133             temp=temp->next;134         }135         if(p!=NULL){136             temp=p->next;137             p->next=p->next->next;138             temp->next=free_block;139             free_block=temp;140         }141         head=free_block;142         p=head;143         temp=head->next;144         while(head->next!=NULL){145             current_min_addr=head->next->start_addr;146             while(temp->next!=NULL){147                 if(temp->next->start_addr<current_min_addr){148                     current_min_addr=temp->next->start_addr;149                     p=temp;150                 }151             temp=temp->next;152             }153             if(p->next!=head->next){154                 temp=p->next;155                 p->next=p->next->next;156                 temp->next=head->next;157                 head->next=temp;158             }159         head=head->next;160         temp=head->next;161         p=head;162         }163     }164     return ;165 }166 167 /*最佳适应算法,按内存块的大小由小到大排序*/168 void rearrange_BF(){169     free_block_type *temp,*p=NULL;170     free_block_type *head=NULL;171     int current_min_size=free_block->size;172 173     temp=free_block;174     while(temp->next!=NULL){175         if(temp->next->size<current_min_size){176             current_min_size=temp->next->size;177             p=temp;178         }179         temp=temp->next;180     }181     if(p!=NULL){182         temp=p->next;183         p->next=p->next->next;184         temp->next=free_block;185         free_block=temp;186     }187     head=free_block;188     p=head;189     temp=head->next;190     while(head->next!=NULL){191         current_min_size=head->next->size;192         while(temp->next!=NULL){193             if(temp->next->size<current_min_size){194                 current_min_size=temp->next->size;195                 p=temp;196             }197             temp=temp->next;198         }199     if(p->next!=head->next){200         temp=p;201         p->next=p->next->next;202         temp->next=head->next;203         head->next=temp;204         }205         head=head->next;206         temp=head->next;207         p=head;208     }209 210 }211 212 /*最坏适应算法,按地址块的大小从大到小排序*/213 void rearrange_WF(){214        free_block_type *temp,*p=NULL;215     free_block_type *head=NULL;216     int current_max_size=free_block->size;217     temp=free_block;218     while(temp->next!=NULL){219         if(temp->next->size>current_max_size){220             current_max_size=temp->next->size;221             p=temp;222         }223         temp=temp->next;224     }225     if(p!=NULL){226         temp=p;227         p->next=p->next->next;228         temp->next=free_block;229         free_block=temp;230     }231     head=free_block;232     p=head;233     temp=head->next;234     while(head->next!=NULL){235         current_max_size=head->next->size;236         while(temp->next!=NULL){237             if(temp->next->size>current_max_size){238                 current_max_size=temp->next->size;239                 p=temp;240             }241         temp=temp->next;242         }243         if(p->next!=head->next){244             temp=p->next;245             p->next=p->next->next;246             temp->next=head->next;247             head->next=temp;248         }249         head=head->next;250         temp=head->next;251         p=head;252     }253     return ;254 }255 //创建一个新的进程256 int new_process(){257     struct allocated_block *ab;258     int size;259     int ret;260     ab=(struct allocated_block *)malloc(sizeof(struct allocated_block));261     if(!ab) exit(-5);262     ab->next = NULL;263     pid++;264     sprintf(ab->process_name, "PROCESS-%02d", pid);265     ab->pid = pid;266     printf("Memory for %s:", ab->process_name);267     printf("Please input you want to allocate process‘ size : ");268     scanf("%d", &size);269     if(size>0) {270 271         ab->size=size;272     }273     ret = allocate_mem(ab);274     if((ret==1) &&(allocated_block_head == NULL)){275         allocated_block_head=ab;276         return 1; }277 278     else if (ret==1) {279         ab->next=allocated_block_head;280         allocated_block_head=ab;281         return 2; }282     else if(ret==-1){283         printf("Allocation fail\n");284         pid--;285         free(ab);286         return -1;287      }288     return 3;289     }290 291 //内存分配292 int allocate_mem(struct allocated_block *ab){293     free_block_type *fbt, *pre;294     free_block_type *temp,*p,*p1;295     allocated_block *q;296     int request_size=ab->size;297     int sum=0;298     int max;299     fbt = pre = free_block;300     if(fbt){301         if(ma_algorithm==MA_WF){302             if(fbt==NULL||fbt->size<request_size)303                     return -1;304         }305         else{306             while(fbt!=NULL&&fbt->size<request_size){307                 pre=fbt;308                 fbt=fbt->next;309             }310         }311         if(fbt==NULL||fbt->size<request_size){312             if(free_block->next!=NULL){313                 sum=free_block->size;314                 temp=free_block->next;315                 while(temp!=NULL){316                     sum+=temp->size;317                     if(sum>=request_size)318                         break;319                     temp=temp->next;320                 }321                 if(temp==NULL)322                     return -1;323                 else{324                     pre=free_block;325                     max=free_block->start_addr;326                     fbt=free_block;327                     while(temp->next!=pre){328                         if(max<pre->start_addr){329                             max=pre->start_addr;330                             fbt=pre;331                         }332                         pre=pre->next;333                     }334                     pre=free_block;335 336                     while(pre!=temp->next)337                     {338                         q=allocated_block_head;339                         p=free_block;340 341                             while(q!=NULL)342                             {343                                 if(q->start_addr>pre->start_addr)344                                     q->start_addr=q->start_addr-pre->size;345                                 q=q->next;346                             }347                             while(p!=NULL)348                             {349                                 if(p->start_addr>pre->start_addr)350                                     p->start_addr=p->start_addr-pre->size;351                                 p=p->next;352 353                             }354 355                         pre=pre->next;356                     }357 358                 pre=free_block;359                 while(pre!=temp->next){360 361                     p1=pre->next;362                     if(pre==fbt)363                         break;364                     free(pre);365                     pre=p1;366 367                 }368                 q=allocated_block_head;369                 free_block=fbt;370                 free_block->start_addr=q->start_addr+q->size;371 372                 free_block->size=sum;373                 free_block->next=temp->next;374                 if(free_block->size-request_size<MIN_SLICE){375                     ab->size=free_block->size;376                     ab->start_addr=free_block->start_addr;377                     pre=free_block;378                     free_block=free_block->next;379                     free(pre);380                 }381                 else{382                     ab->start_addr=free_block->start_addr;383                     free_block->start_addr=free_block->start_addr+request_size;384                     free_block->size=free_block->size-request_size;385                 }386 387             }388         }389         else390             return -1;391          }392         else{393             if(fbt->size-request_size<MIN_SLICE){394                 ab->size=fbt->size;395                 ab->start_addr=fbt->start_addr;396                 if(pre->next==free_block){397                     free_block=fbt->next;398                 }399                 else{400                     pre->next=fbt->next;401                 }402                 free_block=fbt->next;403                 free(fbt);404             }405             else{406                 ab->start_addr=fbt->start_addr;407                 fbt->start_addr=fbt->start_addr+request_size;408                 fbt->size=fbt->size-request_size;409             }410         }411         rearrange(ma_algorithm);412         return 1;413     }414     else415     {416         printf("Free Memory already has been allocated over: ");417         return -1;418     }419 420 }421 422 //选择杀死一个进程423 424 void kill_process(){425     struct allocated_block *ab;426     int pid;427     printf("Kill Process, pid=");428     scanf("%d", &pid);429     ab=find_process(pid);430     if(ab!=NULL){431         free_mem(ab);432         dispose(ab);433         }434 }435 //找到要杀死的进程的标号436 allocated_block * find_process(int pid){437     allocated_block *abb;438     abb=allocated_block_head;439     if(abb->pid==pid)440     {441         return abb;442     }443     abb=allocated_block_head->next;444     while(abb->next!=NULL){445         if(abb->pid==pid)446             return abb;447         abb=abb->next;448     }449     return abb;450 }451 452 //释放杀死进程的内存块453 int free_mem(struct allocated_block *ab){454        int algorithm = ma_algorithm;455        struct free_block_type *fbt, *pre;456        fbt=(struct free_block_type*) malloc(sizeof(struct free_block_type));457     pre=(struct free_block_type*) malloc(sizeof(struct free_block_type));458        if(!fbt) return -1;459 460     fbt->start_addr=ab->start_addr;461     fbt->size=ab->size;462     fbt->next=free_block;463     free_block=fbt;464     rearrange_FF();465     pre->next=free_block;466     pre->size=0;467     while(pre->next&&(pre->next->start_addr!=fbt->start_addr))468         pre=pre->next;469     if(pre->size!=0&&fbt->next!=NULL){470         if(((pre->start_addr+pre->size)==fbt->start_addr)&&((fbt->start_addr+fbt->size)==fbt->next->start_addr)){471             pre->size=pre->size+fbt->size+fbt->next->size;472             pre->next=fbt->next->next;473             free(fbt->next);474             free(fbt);475         }476         else if((pre->start_addr+pre->size)==fbt->start_addr){477             pre->size=pre->size+fbt->size;478             pre->next=fbt->next;479             free(fbt);480         }481         else if(fbt->start_addr+fbt->size==fbt->next->start_addr){482             fbt->size=fbt->size+fbt->next->size;483             fbt->next=fbt->next->next;484             free(fbt->next);485         }486     }487     else if((pre->size==0)&&fbt->next){488         if((fbt->start_addr+fbt->size)==fbt->next->start_addr){489             fbt->size=fbt->size+fbt->next->size;490             fbt->next=fbt->next->next;491             free_block=fbt;492             free(fbt->next);493         }494     }495     else if(fbt->next==NULL){496         if((pre->start_addr+pre->size)==fbt->start_addr){497             pre->size=pre->size+fbt->size;498             pre->next=fbt->next;499             free(fbt);500         }501     }502     rearrange(algorithm);503 504     return 1;505 }506 507 //销毁杀死进程的结点508 int dispose(struct allocated_block *free_ab){509     struct allocated_block *pre,*ab;510 511    if(free_ab == allocated_block_head) {512      allocated_block_head = allocated_block_head->next;513         free(free_ab);514         return 1;515         }516     pre = allocated_block_head;517     ab = allocated_block_head->next;518     while(ab!=free_ab)519     {520      pre = ab;521      ab = ab->next;522     }523     pre->next = ab->next;524     free(ab);525     return 2;526  }527 528 //显示内存使用情况529 530 int display_mem_usage(){531     struct free_block_type *fbt=free_block;532     struct allocated_block *ab=allocated_block_head;533     printf("----------------------------------------------------------\n");534 535     if(fbt==NULL)536     {537         printf("Free Memory already used over !\n");538     }539     printf("----------------------------------------------------------\n");540 541 542     if(fbt)543     {544         printf("Free Memory:\n");545         printf("%20s %20s\n", " start_addr", " size");546         while(fbt!=NULL){547             printf("%20d %20d\n", fbt->start_addr, fbt->size);548             fbt=fbt->next;549             }550     }551 552     printf("\nUsed Memory:\n");553     printf("%10s %20s %10s %10s\n", "PID", "ProcessName", "start_addr", " size");554     while(ab!=NULL){555         printf("%10d %20s %10d %10d\n", ab->pid, ab->process_name, ab->start_addr, ab->size);556         ab=ab->next;557         }558     printf("----------------------------------------------------------\n");559     return 0;560 }561 562 //退出,销毁所有链表563 void do_exit()564 {565     free_block_type *temp;566     allocated_block *temp1;567     temp=free_block->next;568     while(temp!=NULL)569     {570         free_block->next=temp->next;571         free(temp);572         temp=free_block->next;573     }574     free(free_block);575     temp1=allocated_block_head->next;576     while(temp1!=NULL)577     {578         allocated_block_head->next=temp1->next;579         free(temp1);580         temp1=allocated_block_head->next;581     }582     free(allocated_block_head->next);583 584 }585 //主函数586 int main(){587     char choice;588     pid=0;589     free_block=init_free_block(mem_size);590     while(1) {591     display_menu();592     fflush(stdin);593 594    choice=getchar();595     switch(choice){596         case 1: set_mem_size(); break;597         case 2: set_algorithm();flag=1; break;598         case 3: new_process(); flag=1; break;599         case 4: kill_process(); flag=1; break;600         case 5: display_mem_usage(); flag=1; break;601         case 0: do_exit();exit(0);602         default: break;603     }604     }605     return 0;606 }

 

内存管理模拟