当前位置:
文档之家› 操作系统原理-内存分配与回收
操作系统原理-内存分配与回收
{
printf("进程id:%c开始地址:%d长度%d\n",q->pid,q->start,q->length);
q=q->right;
}
}while(q!=head2);
}
//主函数
void main()
{ int x;
de_node *point,*p1;
//创建内存的初始状态
point=(struct linknode*)malloc(sizeof(struct linknode));
{ if(p!=NULL)
{ printf("进程id:%c开始地址:%d长度%d\n",p->pid,p->start,p->length);
p=p->right;
}
}while(p!=head1);
printf("\n");
printf("已分配进程队列:\n");
do //已分配进程队列
{
if(q!=NULL)
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);//搜索一遍可用内存序列
free(q);
}
}
}
}
//打印输出
void print()
{ de_node *q=head2,*p=head1;
if(count==0)
printf("没有进程占有内存。\n");
else
{ printf("输出进程id号:\n");
for(int i=0;i<count;i++)
printf("%c\t",name[i]);
}
else {printf("输入进程格式有误\n");
free(p);
return (NULL);
}
}
//分配内存空间
void distribute(de_node *p)
{ de_node *q=head1,*temp;
int flag=0;
do{//do_while循法
//判断当前指向的内存空间的长度是否满足p所申请的长度,大于就分配
struct linknode* creat()//创建一个进程节点
{
int len,flag1=1;//用于表示进程是否可以创建
char id;
struct linknode* p;
p = (de_node *)malloc(sizeof(de_node));//试图在系统内存中开辟空间创建一个进程
do{if(q->pid==id){//如果找到if(q==head2)head2=q->right;q->left->right=q->right;//修改指针指向q->right->left=q->left;
flag=1;
break;
}
else q=q->right;
}while(q!=head2);
flag1=0;//标志位为0,表示下面对p指向内容不做修改
free(p);
return NULL;
}
if(len==0) {//如果输入要分配的进程长度为0,释放p,返回空指针
printf("输入长度为0!\n");
free(p);
return(NULL);
}
if(flag1){//标志位1,可以对p指向内容进行修改
4.要求每次分配和回收后把空闲分区的变化情况以及各进程的申请、释放情况以及各进程的申请、释放情况以图形方式显示、打印出来。
最佳适应算法:
该算法总是把满足要求、又是最小的空闲区分配给作业。检查空闲区说明表是否有满足作业要求的空闲区,也分为三种情况:大于,等于,小于。若检查到有“等于”的情况,就可以直接分配,若没有,则继续检查是否有“大于”的情况
name[j+1]=NULL;//置空
count--;//减一
}
//判断是否总共只有一个进程且是够刚好也满足条件if(q->pid==id&&q->right==q&&head2==q)
{ head2=NULL;//把已分配队列直接置空
flag=1;//表示找到满足条件的进程
}
if(flag==0){//上面的都没找到
内存的动态存储管理
一、实验内容
编写程序实现动态分区存储管理方式的主存分配与回收。具体内容包括:首先确定主存空间分配表;然后采用最先适应算法完成主存空间的分配与回收;最后编写主函数对所做工作进行测试
二、实验原理
模拟存储管理中内存空间的管理和分配内存空间的管理分为固定分区管理方式,可变分区管理方式,页式存储管理,段式存储管理。
printf("2----reclaim(回收)\n");
printf("3----view (浏览)\n");
printf("4----exit(退出)\n");
}
printf("\n");
printf("输出内存当前使用情况:\n");
for(int j=0;j<n;j++)
printf("%d %d\t",j,a[j]);
printf("\n");
printf("内存初始名称为i,回收后可能会变,可以查看回收来自那个进程\n");
do //输出可用内存序列
scanf("%c",&id);
fflush(stdin);
for(int i=0;i<count;i++)//双重循环把要回收的进程找出来,并把记录的id去掉
if(name[i]==id)
{//判断当前的进程是否满足要求
for(int j=i;j<count;j++)
name[j]=name[j+1];//向前覆盖
q->left=p->left;//修改指针的指向
q->right=p;
p->left->right=q;
p->left=q;if(q->start+q->length==p->start)//可以与后面合并的情况{ q->length+=p->length;//修改指针的指向
p->right->left=q;q->right=p->right;
free(p);
}if(q->left->start+q->left->length==q->start)//可以与前面合并的情况{ q->left->length+=q->length;//修改指针的指向q->left->right=q->right;q->right->left=q->left;
}//如果找到或是遍历一遍结束
if(flag==0) printf("没有此进程号!!!\n");//没有找到满足的进程
if(flag==1){//表示找到了
for(int i=q->start;i<q->start+q->length;i++)//释放占有的内存
a[i]=0;
//接下来修改可用内存的队列,
typedef struct linknode{
char pid;
int start;
int length;
struct linknode *left,*right;
}de_node; //进程节点结构体定义
//head1表示未分配内存队列头指针,head2便是已分配进程队列头指针
de_node *head1,*head2=NULL;
if(q->length>=p->length){
p->start=q->start;//把进程的内存开始地址指向内存的可用开始地址处
q->start+=p->length;//可用地址起始改变
q->length-=p->length;//可用内存长度修改
for(int i=p->start;i<p->start+p->length;i++)//将已分配的内存空间全部置1
head2=p;//让头指针指向p指向的进程
p->left=temp->left;//p进程左边为原来第一个的左边
p->right=temp;//p进程右边指向第一个