资源简介

操作系统内存分配与回收C语言模拟。包含源代码和.exe可执行文件

资源截图

代码片段和文件信息

#define minisize 50      /*空闲区_申请空间≤minisize 时,分配整个空闲区*/
#define m 20              /*假定系统允许的空闲区表最大为m*/
#include “stdio.h“

/*系统中主要数据结构*/
struct
 {float address;     /*空闲区起始地址*/
  float length;      /*空闲区长度,单位为字节*/
  int flag;          /*空闲区表登记栏标记,用0表示空栏目,用1表示未分配*/
 }free_table[m];     /*空闲区表*/

struct
{
    float address;
    float length;
    int flag;
}used_table[m];


void init_free_table()        //采用最佳适应算法初始化内存分区
{
    int i;
    free_table[0].address=0;
    free_table[0].length=200;
    free_table[0].flag=1;
    for(i=1;i    {
        free_table[i].address=free_table[i-1].address+free_table[i-1].length;
        free_table[i].length=free_table[i-1].length+300;
        free_table[i].flag=1;
    }
}

void init_used_table()
{
    int i;
    for(i=0;i    {
        used_table[i].address=0;
        used_table[i].length=0;
        used_table[i].flag=0;
    }
}
float xk0=0;//定义一个全局变量存储实际分配长度
float input()
{
    float a;
    while(1)
    {
        fflush(stdin);
        printf(“请输入要装入的程序的大小:“);
        scanf(“%f“&a);
        if(a<=0)
            printf(“输入数值不合法!“);
        else
            break;
    }
    return a;
}


float allocate(float xk)
{
 int ik;
 float ad;
 k=-1;

 for(i=0;i    if((free_table[i].flag==1) && (free_table[i].length>=xk))
        {k=i;
        break;}
if(k==-1)        /* 无可用空闲区返回 */
     {printf(“no free space\n“);
         return(-1);
     }
    if(free_table[k].length-xk<=minisize)        /* 找到可用空闲区开始分配 */
     {free_table[k].flag=0;
     ad=free_table[k].address;
     xk=free_table[k].length;
     }
    else
     {free_table[k].length=free_table[k].length-xk;
     ad=free_table[k].address+free_table[k].length;
      }
    xk0=xk;
    return(ad);
}

void record(float xk1)     //记录已分配内存
{
    static int used_i=0;      //只初始化一次
    float ad1;
    ad1=allocate(xk1);

    if(ad1==-1)
    {
        printf(“无法装入该程序!“);
        return;
    }
    used_table[used_i].address=ad1;
    used_table[used_i].length=xk0;
    used_table[used_i].flag=1;
    used_i++;
    }

void display_free()
{
    int i;
    printf(“未分配内存:\n“);
    printf(“编号       开始地址       结束地址       长度       状态\n“);
    for(i=0;i    {
        if(free_table[i].flag==1)
        {
            printf(“ %2d          %5g       %5g         %5g       未分配\n“i+1free_table[i].addressfree_table[i].address+free_table[i].lengthfree_table[i].length);
         }
    }
    printf(“\n\n“);
}
void display_used()
{
    int i;
    printf(“已分配内存:\n“);
    printf(“编号       开始地址       结束地址       长度       状态\n“);
    for(i=0;i    {
        if(used_table[i].flag==1)
        {
            printf(“ %2d          %5g       %5g         %5g       已分配\n“i+1used_table[i].addressused_table[i].address+used_table[i].lengthused_table[i].length);
         }
    }
    printf(“\n\n“);
}



void re

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        6656  2014-06-22 15:19  collect.exe
     文件        5484  2014-06-22 15:19  main.c

评论

共有 条评论