2013.06.25《操作系统-内存分配》

本文介绍了一个使用双向链表实现的动态内存分配模拟系统。该系统包括首次适应算法和最佳适应算法来分配内存,并能回收内存及展示当前内存的分配情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include
#include
#define Free 0 //空闲状态
#define Busy 1 //已用状态
#define OK 1    //完成
#define ERROR 0 //出错
#define MAX_length 1280 //最大内存空间为1280KB
typedef int Status;
typedef struct freearea//定义一个空闲区说明表结构

 int ID;   //分区号
 long size;   //分区大小
 long address; //分区地址
 int state;   //状态
}ElemType;
//----------  线性表的双向链表存储结构  ------------
typedef struct DuLNode //double linked list
 
 ElemType data;
 struct DuLNode *prior; //前趋指针
 struct DuLNode *next;  //后继指针
}DuLNode,*DuLinkList;
DuLinkList block_first; //头结点
DuLinkList block_last;  //尾结点
Status alloc(int);//内存分配
Status free(int); //内存回收
Status First_fit(int,int);//首次适应算法
Status Best_fit(int,int); //最佳适应算法
void show();//查看分配
Status Initblock();//开创空间表
Status Initblock()//开创带头结点的内存空间链表
{
 block_first=(DuLinkList)malloc(sizeof(DuLNode));
 block_last=(DuLinkList)malloc(sizeof(DuLNode));
 block_first->prior=NULL;
 block_first->next=block_last;
 block_last->prior=block_first;
 block_last->next=NULL;
 block_last->data.address=0;
 block_last->data.size=MAX_length;
 block_last->data.ID=0;
 block_last->data.state=Free;
 return OK;
}
//----------------------- 分 配 主 存 -------------------------
Status alloc(int ch)
{
 int ID,request;
 printf("请输入作业(分区号):");
 scanf("%d",&ID);
 printf("请输入需要分配的主存大小(单位:KB):");
 scanf("%d",&request);
 
    return 0;
}
//首次适应算法
Status First_fit(int ID,int request)//传入作业名及申请量
{
 DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode));
 temp->data.ID=ID;
 temp->data.size=request;
 temp->data.state=Busy;
 DuLNode *p=block_first->next;
 
    return 0;
}
//最佳适应算法
Status Best_fit(int ID,int request)
{
 int ch; //记录最小剩余空间
 DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode));
 temp->data.ID=ID;
 temp->data.size=request;
 temp->data.state=Busy;
 DuLNode *p=block_first->next;
 DuLNode *q=NULL; //记录最佳插入位置
 
 return 0;
}
//主存回收
Status free(int ID)
{
 DuLNode *p=block_first;
 
 
    return 0;
}
//显示主存分配情况
void show()
    
 printf("+++++++++++++++++++++++++++++++++++++++\n");
 printf("+++        主 存 分 配 情 况        +++\n");
 printf("+++++++++++++++++++++++++++++++++++++++\n");
 DuLNode *p=block_first->next;
 while(p)
     
  printf("分 区 号:");
  if(p->data.ID==Free) printf("Free\n");
  else printf("%d\n",p->data.ID);
  printf("起始地址:%d\n",p->data.address);
  printf("分区大小:%d KB\n",p->data.size);
  printf("状    态:");
  if(p->data.state==Free) printf("空  闲\n");
  else printf("已分配\n");
  printf("——————————————\n");
  p=p->next;    
 }
}
//主函数
void main()
{
 int ch;//算法选择标记
 printf("       动态分区分配方式的模拟       \n");
 printf("************************************\n");
 printf("** 1)首次适应算法  2)最佳适应算法 **\n");
 printf("************************************\n");
 printf("请选择分配算法:");
 scanf("%d",&ch);
 Initblock(); //开创空间表
 int choice;  //操作选择标记
 while(1)
 {
  printf("********************************************\n");
  printf("**    1: 分配内存        2: 回收内存      **\n");
  printf("**    3: 查看分配        0: 退    出      **\n");
  printf("********************************************\n");
  printf("请输入您的操作 :");
  scanf("%d",&choice);
  if(choice==1) alloc(ch); // 分配内存                
  else if(choice==2)  // 内存回收
  {
   int ID;
   printf("请输入您要释放的分区号:");
   printf("%d",&ID);
   free(ID);
  }
  else if(choice==3) show();//显示主存
  else if(choice==0) break; //退出
  else //输入操作有误
   
   printf("输入有误,请重试!\n");
   continue;
  }
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值