内存管理模拟

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

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

代码如下:

  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 }
原文地址:https://www.cnblogs.com/Karma-wjc/p/4095533.html