操作系统实验四(内存管理之固定分区分配)
/* 实验四-内存管理之固定分区分配 算法思想: 预先将内存空间划分成若干个空闲分区, 分配过程根据用户需求将某一个满足条件的分区直接分配 (不进行分割),作业完成后回收对应内存。 整个分配过程分区大小和个数不发生变化。 */ #include <bits/stdc++.h> #include <iostream> #include <stdio.h> using namespace std; #define getpch(type) (type*)malloc(sizeof(type)) int SIZE;//内存的大小 struct node//内存分区使用说明表 { int id;//内存块的id; int size;//内存块的大小 int begin_adress;//内存块的起始地址 char status;////F-已分配,T-未分配 struct node *next; }*p,*ready=NULL; typedef struct node SIF; void InitMemory();//初始化固定内存的设置 void showinfo();//打印分配的情况 void recover();//作业完成后回收资源 void allocation();//给作业分配空间 int allocate(int size);//分配内存,返回0代表分配成功 int main() { int command; InitMemory();//初始化内存说明表 printf("\n 请输入命令,给作业分配资源输入1,释放资源输入2,退出请输入任意键:\n"); scanf("%d",&command); while(1){ if(command==1) allocation(); else if(command==2) recover(); else break; printf("\n 请继续输入命令 \n"); scanf("%d",&command); } return 0; } void showinfo()//打印内存分配情况 { printf("\n 当前内存分配情况如下:\n"); printf("\n===id===size===begin_adress===status \n"); p=ready; while(p!=NULL) { printf("\n %d %d %d %c\n",p->id,p->size,p->begin_adress,p->status); p=p->next; } } void InitMemory()//初始化内存表 { int num,i,j,d=0,id=0; SIF *last=ready; printf("\n 请输入现有内存的大小: (起始地址从0开始) \n"); scanf("%d",&SIZE); //初始化内存信息 printf("\n 请输入固定分区内存块的个数: "); scanf("%d",&num); for(i=0; i<num; i++) { int n; printf("\n 请输入内存块%d的大小(KB):",i); scanf("%d",&n); for(j=0; j<n; j++) { p=getpch(SIF);//#define getpch(type) (type*)malloc(sizeof(type)) p->id=id++; p->size=(int)(pow(2,4+i));//size是按照2的指数递增的 p->begin_adress=d; if(p->status==NULL)//是否被分配初始化 p->status='T'; else p->status='F'; p->next=NULL; d+=p->size; if(d>=SIZE) { printf("\n 已超出系统总内存量,%d号分配失败 \n",p->id); break; } if(ready==NULL) { ready=p; last=ready; } else { last->next=p; last=last->next; } } } showinfo(); } void allocation()//给作业分配空间 { int num1; int i,s; //给作业分配内存空间 printf("\n 请输入待分配内存的作业个数:"); scanf("%d",&num1); for(i=0; i<num1; i++){ printf("\n 请输入第%d个作业的大小: ",i); scanf("%d",&s); if(allocate(s)==1){ printf("\n 已为该作业分配内存空间\n"); printf("\n 存储该作业内存空间的详细信息如下:\n"); printf("\n 内存块号:%d, 内存大小:%d \n",p->id,p->size); } else printf("\n 未能该该作业分配内存 \n"); } showinfo(); } void recover()//作业完成后回收资源 { int i,k,num; printf("\n 请输入需要释放的作业个数: "); scanf("%d",&num); for(i=0; i<num; i++){ printf("\n 请输入存储该作业的内存分区说明表的ID \n"); scanf("%d",&k); p=ready; while(p!=NULL){ if(p->id==k){ p->status='T'; printf("\n 已释放该作业所占用的资源 \n"); break; } p=p->next; } } showinfo();//完成作业后回收内存空间 } int allocate(int size)//分配内存,返回0代表分配成功 { p=ready; while(p!=NULL) { if((p->status=='T')&&(p->size>=size)) { p->status='F'; return 1; } p=p->next; } return 0; }
一纸高中万里风,寒窗读破华堂空。
莫道长安花看尽,由来枝叶几相同?