zoukankan      html  css  js  c++  java
  • 内存管理模拟

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

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

    代码如下:

      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
    ");
     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("
    ");
     73     printf("1 - Set memory size (default=%d)
    ", DEFAULT_MEM_SIZE);
     74     printf("2 - Select memory allocation algorithm
    ");
     75     printf("3 - New process 
    ");
     76     printf("4 - Terminate a process 
    ");
     77     printf("5 - Display memory usage 
    ");
     78     printf("0 - Exit
    ");
     79 }
     80 
     81 /*设置内存大小*/
     82 int set_mem_size(){
     83     int size;
     84     if(flag!=0){ /*flag标志防止内存被再次设置*/
     85         printf("Cannot set memory size again
    ");
     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("	1 - First Fit
    ");
    101     printf("	2 - Best Fit 
    ");
    102     printf("	3 - Worst Fit 
    ");
    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
    ");
    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         else
    390             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     else
    415     {
    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("----------------------------------------------------------
    ");
    534 
    535     if(fbt==NULL)
    536     {
    537         printf("Free Memory already used over !
    ");
    538     }
    539     printf("----------------------------------------------------------
    ");
    540 
    541 
    542     if(fbt)
    543     {
    544         printf("Free Memory:
    ");
    545         printf("%20s %20s
    ", " start_addr", " size");
    546         while(fbt!=NULL){
    547             printf("%20d %20d
    ", fbt->start_addr, fbt->size);
    548             fbt=fbt->next;
    549             }
    550     }
    551 
    552     printf("
    Used Memory:
    ");
    553     printf("%10s %20s %10s %10s
    ", "PID", "ProcessName", "start_addr", " size");
    554     while(ab!=NULL){
    555         printf("%10d %20s %10d %10d
    ", ab->pid, ab->process_name, ab->start_addr, ab->size);
    556         ab=ab->next;
    557         }
    558     printf("----------------------------------------------------------
    ");
    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 }
  • 相关阅读:
    第十二章学习笔记
    UVa OJ 107 The Cat in the Hat (戴帽子的猫)
    UVa OJ 123 Searching Quickly (快速查找)
    UVa OJ 119 Greedy Gift Givers (贪婪的送礼者)
    UVa OJ 113 Power of Cryptography (密文的乘方)
    UVa OJ 112 Tree Summing (树的求和)
    UVa OJ 641 Do the Untwist (解密工作)
    UVa OJ 105 The Skyline Problem (地平线问题)
    UVa OJ 100 The 3n + 1 problem (3n + 1问题)
    UVa OJ 121 Pipe Fitters (装管子)
  • 原文地址:https://www.cnblogs.com/Karma-wjc/p/4095533.html
Copyright © 2011-2022 走看看