内存的分配与回收实验报告(最先适应法)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

代码实现如下:

#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')&&(len>0)){

for(int i=0;i

if(name[i]==id){

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;istart+p->length;i++)//将已分配的内存空间全部置1 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){//表示上面已分配好内存,并已修改内存链表,下面修改已分配内存的进程队列temp=head2;//把已分配内存的进程队列赋值给临时指针

if(temp==NULL)//如果还还没有存在的任何的进程,说明当前是第一个

{ head2=p;//让头指针指向第一个进程

p->left=p;//双向队列第一个左右指针都指向自己

p->right=p;//双向队列第一个左右指针都指向自己

}

else if(temp!=NULL){//已存在队列,把当前直接链到第一个,与上面的区别是指针指向head2=p;//让头指针指向p指向的进程

p->left=temp->left;//p进程左边为原来第一个的左边

p->right=temp;//p进程右边指向第一个

temp->left->right=p;//原来第一个的左边为p

temp->left=p;//原来第一个的左边的进程为p

}

}

}

相关文档
最新文档