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 }
  • 相关阅读:
    break和continue
    while循环嵌套
    while循环语句
    SDUT 2766-小明传奇2(母函数)
    那些奇妙的&quot;大师&quot;是怎样炼成的(科学、迷信、心理)
    深入理解Linux字符设备驱动
    [从头学数学] 第162节 锐角三角函数
    iOS将数组中的内容分拼接成字符串
    win10 UWP 全屏
    杂(三)-The type java.lang.Object cannot be resolved It is indirectly referenced ...
  • 原文地址:https://www.cnblogs.com/Karma-wjc/p/4095533.html
Copyright © 2011-2022 走看看