zoukankan      html  css  js  c++  java
  • 一个简单的内存管理程序

    #include<stdio.h>
    #include<stdlib.h>
    #include<malloc.h>
    #define PROCESS_NAME_LEN 32   /*进程名长度*/
    #define MIN_SLICE    10             /*最小碎片的大小*/
    #define DEFAULT_MEM_SIZE 1024     /*内存大小*/
    #define DEFAULT_MEM_START 0       /*起始位置*/
    /* 内存分配算法 */
    #define MA_FF 1
    #define MA_BF 2
    #define MA_WF 3
    int mem_size=DEFAULT_MEM_SIZE; /*内存大小*/
    int ma_algorithm = MA_FF;           /*当前分配算法*/
    static int pid = 0;                                      /*初始pid*/
    int flag = 0;                                    /*设置内存大小标志*/
    /*描述每一个空闲块的数据结构*/
    struct free_block_type{
        int size;
        int start_addr;
        struct free_block_type *next;
    }; 

    /*指向内存中空闲块链表的首指针*/
    struct free_block_type *free_block;
    /*每个进程分配到的内存块的描述*/
    struct allocated_block{
        int pid;   
     int size;
        int start_addr;
        char process_name[PROCESS_NAME_LEN];
        struct allocated_block *next;
    };
    /*进程分配内存块链表的首指针*/
    struct allocated_block *allocated_block_head = NULL;
    /*初始化空闲块,默认为一块,可以指定大小及起始地址*/
    struct free_block_type* init_free_block(int mem_size){
        struct free_block_type *fb;
     struct allocated_block *p=allocated_block_head;
     
        fb=(struct free_block_type *)malloc(sizeof(struct free_block_type));
        if(fb==NULL){
            printf("No mem\n");
            return NULL;
     }
        fb->size = mem_size;
     while(p)
      p=p->next;
     if(p==allocated_block_head)
      fb->start_addr = mem_size;
     else
      fb->start_addr=mem_size-(p->size+p->start_addr);
     // fb->start_addr = DEFAULT_MEM_START;
        fb->next = NULL;
        return fb;
    }
    display_menu();

    int set_mem_size();

    set_algorithm();

    rearrange(int algorithm);

    rearrange_FF();

    rearrange_BF();

    rearrange_WF();

    new_process();

    kill_process();

    do_exit();

    struct allocated_block *find_process(int pid);

    int allocate_mem(struct allocated_block *ab);

    int free_mem(struct allocated_block *ab);

    int dispose(struct allocated_block *free_ab);

    display_mem_usage();

    display_menu(){
        printf("\n");
        printf("1 - Set memory size (default=%d)\n", DEFAULT_MEM_SIZE);
        printf("2 - Select memory allocation algorithm\n");
        printf("3 - New process \n");
        printf("4 - Terminate a process \n");
        printf("5 - Display memory usage \n");
        printf("0 - Exit\n");
    }
    /*设置内存的大小*/
    int set_mem_size(){
        int size;
        if(flag!=0){  //防止重复设置
            printf("Cannot set memory size again\n");
            return 0;
     }
        printf("Total memory size =");
        scanf("%d", &size);
        if(size>0) {
            mem_size = size;
            free_block->size = mem_size;
      free_block->start_addr=mem_size;
      flag=1; 
      return 1;
     }
     else
     {
      printf("the size is erro!\n");
      return 0;
     }
    }
    /* 设置当前的分配算法 */
    set_algorithm(){
        int algorithm;
        printf("\t1 - First Fit\n");
        printf("\t2 - Best Fit \n");
        printf("\t3 - Worst Fit \n");
        scanf("%d", &algorithm);
        if(algorithm>=1 && algorithm <=3) 
      ma_algorithm=algorithm;
     //按指定算法重新排列空闲区链表
        rearrange(ma_algorithm);
    }
    /*按指定的算法整理内存空闲块链表*/
    rearrange(int algorithm){
        switch(algorithm){
     case MA_FF:  rearrange_FF(); break;
     case MA_BF:  rearrange_BF(); break;
     case MA_WF: rearrange_WF(); break;
     }
    }
    /*按FF算法重新整理内存空闲块链表*/
    rearrange_FF(){
     int size;
        int start_addr;
     struct free_block_type *p, *q; //*free_block
     p=q=free_block;
     while(p)
     {
      while(q)
      {
       if(p->size>q->size)
       {
        size=p->size;
        start_addr=p->start_addr;
        p->size=q->size;
        p->start_addr=q->start_addr;
        q->size=size;
        q->start_addr=start_addr;
       }
       q=q->next;
      }
      p=p->next;
     }
     //请自行补充
    }
    /*按BF算法重新整理内存空闲块链表*/
    rearrange_BF(){
     int size;
        int start_addr;
     struct free_block_type *p, *q; //*free_block
     p=q=free_block;
     while(p)
     {
      while(q)
      {
       if(p->size>q->size)
       {
        size=p->size;
        start_addr=p->start_addr;
        p->size=q->size;
        p->start_addr=q->start_addr;
        q->size=size;
        q->start_addr=start_addr;
       }
       q=q->next;
      }
      p=p->next;
     }
     //请自行补充
     
    }
    /*按WF算法重新整理内存空闲块链表*/
    rearrange_WF(){
     int size;
        int start_addr;
     struct free_block_type *p, *q; //*free_block
     p=q=free_block;
     while(p)
     {
      while(q)
      {
       if(p->size<q->size)
       {
        size=p->size;
        start_addr=p->start_addr;
        p->size=q->size;
        p->start_addr=q->start_addr;
        q->size=size;
        q->start_addr=start_addr;
       }
       q=q->next;
      }
      p=p->next;
     }
     //请自行补充
     
    }
    /*创建新的进程,主要是获取内存的申请数量*/
    new_process(){
        struct allocated_block *ab;
        int size;    int ret;
     int j=0;
        ab=(struct allocated_block *)malloc(sizeof(struct allocated_block));
        if(!ab) exit(-5);
        ab->next = NULL;
        pid++;
        sprintf(ab->process_name, "PROCESS-%02d", pid);
        ab->pid = pid;   
        printf("Memory for %s:", ab->process_name);
        scanf("%d", &size);
        if(size>0) ab->size=size;
        ret = allocate_mem(ab);  /* 从空闲区分配内存,ret==1表示分配ok*/
     
     /*如果此时allocated_block_head尚未赋值,则赋值*/
        if((ret==1) &&(allocated_block_head == NULL)){
            allocated_block_head=ab;
            return 1;        }
        /*分配成功,将该已分配块的描述插入已分配链表*/
        else if (ret==1) {
            ab->next=allocated_block_head;
            allocated_block_head=ab;
            return 2;        }
        else if(ret==-1){ /*分配不成功*/
            printf("Allocation fail\n");
            free(ab);
            return -1;      
     }
     //ab->start_addr=++j;
        return 3;
    }
    /*分配内存模块*/
    int allocate_mem(struct allocated_block *ab){
        struct free_block_type *fbt, *pre;
        int request_size=ab->size;
     struct allocated_block *p,*q;
     p=q=allocated_block_head;
     fbt = pre = free_block;

     while(q)
     {
      q=q->next;
     }
     
     while(fbt)
     {  
      pre=fbt->next;
      if(fbt->size-request_size<10&&fbt->size-request_size>0)
      {
       if(fbt==free_block)
       {
        ab->size=request_size;
        if(q==allocated_block_head)
         ab->start_addr=0;
        else
         ab->start_addr=p->start_addr+p->size;
        free_block=free_block->next;
        free(fbt);
        return 1;
       }
       else
       {
        ab->size=request_size;
        if(q==allocated_block_head)
         ab->start_addr=0;
        else
         ab->start_addr=p->start_addr+p->size;
        pre->next=fbt->next;
        free(fbt);
        return 1;
        break;
       }
      }
      else if(fbt->size-request_size>10)
      {
       ab->size=request_size;
       if(q==allocated_block_head)
        ab->start_addr=0;
       else
        ab->start_addr=p->start_addr+p->size;
       fbt->size-=request_size;
       switch(ma_algorithm)
       {
       case 1:
        {
         rearrange_FF();
         break;
        }
       case 2:
        {
         rearrange_BF();
         break;
        }
       case 3:
        {
         rearrange_WF();
         break;
        }
       }
       return 1;
      }
      fbt=fbt->next;
     }
     if(!fbt)
     {
      // printf("没有合适的空间!\n");
      return -1;
     }
      return 0;
    }
    /*删除进程,归还分配的存储空间,并删除描述该进程内存分配的节点*/
    struct allocated_block *find_process(int pid)
    {
     struct  allocated_block *p=allocated_block_head;
     // p=allocated_block_head;struct allocated_block *allocated_block_head = NULL
     while(p)          
      //判断条件必须是p是否为空不能是p->next,因为如果只有一个节点时p->next=NULL,此时不能返回要删除的节点
     {
      if(p->pid==pid)
      {
       return p;
      }
      p=p->next;
     }
     return NULL;
    }
    kill_process(){
        struct allocated_block *ab;
        int pid;
        printf("Kill Process, pid=");
        scanf("%d", &pid);
        ab=find_process(pid);
        if(ab!=NULL){
            free_mem(ab); /*释放ab所表示的分配区*/
            dispose(ab);  /*释放ab数据结构节点*/
     }
    }
    /*将ab所表示的已分配区归还,并进行可能的合并*/
    void sort()
    {
     int size;
        int start_addr;
     struct free_block_type *p, *q; //*free_block
     p=q=free_block;
     while(p)
     {
      while(q)
      {
       if(p->start_addr >q->start_addr)
       {
        size=p->size;
        start_addr=p->start_addr;
        p->size=q->size;
        p->start_addr=q->start_addr;
        q->size=size;
        q->start_addr=start_addr;
       }
       q=q->next;
      }
      p=p->next;
     }
     
    }
    int free_mem(struct allocated_block *ab){
        int algorithm = ma_algorithm;
        struct free_block_type *fbt, *pre;//*work;
     fbt=(struct free_block_type*) malloc(sizeof(struct free_block_type));
        if(!fbt) return -1;
     else
     {
      pre=free_block;
      fbt->size=ab->size;
      fbt->start_addr=ab->start_addr;
      while(pre->next)
       pre=pre->next;
      fbt->next=NULL;
      pre->next=fbt;
      switch(algorithm)
      {
      case 1:
       {
        sort();
        rearrange_FF();
        break;
       }
      case 2:
       {
        sort();
        rearrange_BF();
        break;
       }
      case 3:
       {
        sort();
        rearrange_WF();
        break;
       }
      }
     }
        return 1;
    }
    /*释放ab数据结构节点*/
    int dispose(struct allocated_block *free_ab){
        struct allocated_block *pre, *ab;
     if(free_ab == allocated_block_head) { /*如果要释放第一个节点*/
      allocated_block_head = allocated_block_head->next;
            free(free_ab);
            return 1;
     }
     else
     {
      pre = allocated_block_head; 
      ab = allocated_block_head->next;
      while(ab!=free_ab){ pre = ab;  ab = ab->next; }
      pre->next = ab->next;
      free(ab);
      return 2;
     }
    }

    /* 显示当前内存的使用情况,包括空闲区的情况和已经分配的情况 */
    display_mem_usage(){
        struct free_block_type *fbt=free_block;
        struct allocated_block *ab=allocated_block_head;
        if(fbt==NULL) return(-1);
        printf("----------------------------------------------------------\n");
     
        /* 显示空闲区 */
        printf("Free Memory:\n");
        printf("%20s %20s\n", "      start_addr", "       size");
        while(fbt!=NULL){
            printf("%20d %20d\n", fbt->start_addr, fbt->size);
            fbt=fbt->next;
     }   
     /* 显示已分配区 */
        printf("\nUsed Memory:\n");
        printf("%10s %20s %10s %10s\n", "PID", "ProcessName", "start_addr", " size");
        while(ab!=NULL){
            printf("%10d %20s %10d %10d\n", ab->pid, ab->process_name, ab->start_addr, ab->size);
            ab=ab->next;
     }
        printf("----------------------------------------------------------\n");
        return 0;
    }
    do_exit()
    {
     printf("操作完毕,退出系统!\n");
    }
    main(){
        char choice;      pid=0;
        free_block = init_free_block(mem_size); //初始化空闲区
        while(1) {
      display_menu(); //显示菜单
      fflush(stdin);
      choice=getchar(); //获取用户输入
      switch(choice)
      {
      case '1': {
       set_mem_size();  
       break;  
          }//设置内存大小
            case '2':
       {
        set_algorithm();flag=1;
        break;
       } //设置算法
            case '3':
       {
        new_process();
        flag=1;
        break;
       } //创建新进程
            case '4':
       {
        kill_process();
        flag=1; 
        break;
       }  //删除进程
            case '5':
       {
        display_mem_usage();  
        flag=1;
        break; 
       }    //显示内存使用
            case '0':
       {
        do_exit();
        exit(0);
       }//释放链表并退出
            default: break;    
      }   
     }
    }


     

  • 相关阅读:
    树莓派上跑.NET的segment fault错误
    WiFi、ZigBee、BLE用哪个?
    SQL Server 的字段不为NULL时唯一
    Asp.net 子web application的Session共享
    Gnucash数据库结构
    sql server中的merge
    禁止使用的极限用语
    Git 操作指南
    Excel VBA保护工作表
    WPF多语言化的实现
  • 原文地址:https://www.cnblogs.com/276815076/p/1841889.html
Copyright © 2011-2022 走看看