操作系统原理-内存分配与回收
- 格式:docx
- 大小:1.69 MB
- 文档页数:22
操作系统原理-内存分配与回收
给作业。检查空闲区说明表是否有满足作业要求的空闲区,也分为三种情况:大于,等于,小于。若检查到有“等于”的情况,就可以直接分配,若没有,则继续检查是否有“大于”的情况
代码实现如下:
#include
#include
#include
#define n 64 //定义内存的大小
int a[n],count=0;//数组a用来保存内存使用状况
1为已分配0为未分配,count用来记name数组中元素个数
char name[n];//已分配内存的名称(字符类型)typedef struct linknode{
char pid;
int start;
int length;
struct linknode *left,*right;
}de_node; //进程节点结构体定义
//head1表示未分配内存队列头指针,head2便是已分配进程队列头指针
de_node *head1,*head2=NULL;
struct linknode* creat()//创建一个进程节点{
int len,flag1=1;//用于表示进程是否可以创建char id;
struct linknode* p;
p = (de_node *)malloc(sizeof(de_node));//试图在系统内存中开辟空间创建一个进程
if (p==NULL) //p为空,说明系统没有可用内存用于创建此模拟进程
{ printf("系统没有足够的内存可供使用!\n");//输出
return(NULL);//返回空指针
}
printf("请输入进程id(字符类型)和长度:");//为进程输入id和分配的长度
scanf("%c %d",&id,&len);
fflush(stdin);//清除输入缓存
if((id>='a'&&id<='z'||id>='A'&&id<='Z')&&(le n>0)){
for(int i=0;i printf("此名称进程已存在!!"); flag1=0;//标志位为0,表示下面对p指向内容不做修改 free(p); return NULL; } if(len==0) {//如果输入要分配的进程长度为0,释放p,返回空指针 printf("输入长度为0!\n"); free(p); return(NULL); } if(flag1){//标志位1,可以对p指向内容进行修改 p->pid=id; //id p->start=0; //初始开始内存位置,在以后会修改 p->length=len;//长度 p->left=NULL;//左指针 p->right=NULL;//右指针 name[count++]=id;//将id存入数组,count 自加 return(p); }//返回创建的进程的地址 } else {printf("输入进程格式有误\n"); free(p); return (NULL); } } //分配内存空间 void distribute(de_node *p) { de_node *q=head1,*temp; int flag=0; do{//do_while循法 //判断当前指向的内存空间的长度是否满足p所申请的长度,大于就分配 if(q->length>=p->length) { p->start=q->start;//把进程的内存开始地址指向内存的可用开始地址处 q->start+=p->length;//可用地址起始改变 q->length-=p->length;//可用内存长度修改 for(int i=p->start;i a[i]=1; flag=1;//表示内存可分配 //队列不止一个进程,第一个满足条件,并且刚好分配完,修改指针指向 if(q->length==0&&q->right!=q) { if(q==head1)//如果第一个满足,修改头指针指向 head1=q->right; q->left->right=q->right; q->right->left=q->left; free(q);//把这个已分配完的空间指针释放 } } if(flag==1)//已做完处理直接跳出循环 break; if(flag==0)//当前指向的内存不满足,指向下一个,继续判断是否满足 q=q->right; }while(q!=head1);//搜索一遍可用内存序列 if(flag==0){//没有可用的内存 printf("没有满足的内存!\n"); count--;//由于创建时加1,但在分配内存时失败,把1又减掉 free(p);//把这个未分配到内存的进程释放 } if(flag==1){//表示上面已分配好内存,并已修改内存链表,下面修改已分配内存的进程队列