#include <malloc.h>
#include <stdio.h>
#include <string.h>
#define NULL 0
typedef struct table
{
int address; /*存储分区起始地址*/
int length; /*存储分区长度*/
int flag; /*存储分区标志,0 为空闲,1 为被作业占据*/
char name[10]; /*当flag==1 时存储分区占用标志作业名,否则存储空nil*/
struct table *next;
}node;
node *work; /*设置一个全局变量work:定位需要释放的结点*/
char type; /*设置一个全局变量type:标注回收类型*/
bool success=false; /*设置一个全局变量success:标注回收结点是否在分配分区表中*/
node *insert(node *head, node *p) /*按照“地址递增方式”将p 结点插入链表相应位置*/
{
node *r,*t;
r=head;
while(r&&r->address<=p->address)
{
t=r;
r=r->next;
}
if(r==head)
{
p->next=head;
head=p;
}
else if(r==NULL)
{
t->next=p;
t=p;
}
else
{
p->next = r;
t->next = p;
}
return head;
}
node *creat() /*根据地址递增方式建立分配分区表(flag==1)或空闲分区表(flag==0)*/
{
node *head,*p1;
int n=0;
printf("address length flag(0 or 1)\n");
p1=(node *)malloc(sizeof(node));
scanf("%d%d%d",&p1->address,&p1->length,&p1->flag);
p1->next=NULL;
if(p1->flag==1)
{
printf("\t\tinput job_name:");
scanf("%s",&p1->name);
}
else
strcpy(p1->name,"nil");
head=NULL;
while (p1->length>0)/*输入0表示结束*/
{
n=n+1;
if (n==1) head=p1;
else
head=insert(head,p1);
p1=(node *) malloc (sizeof(node));
scanf("%d%d%d",&p1->address,&p1->length,&p1->flag);
if(p1->flag==1)
{
printf("\t\tinput job_name:");
scanf("%s",&p1->name);
}
else
strcpy(p1->name,"nil");
p1->next=NULL;
}
return head;
}
node *found(node *distributedhead,char workn[10])
/*查找已分配表中要回收的分区位置*/
{
node *r,*s;
s=r=distributedhead;
while(r)
{
if(strcmp(r->name,workn)==0)
{
work=r;
if(r==distributedhead)
distributedhead=distributedhead->next;
else
s->next=r->next;
success=true;
break;
}
s=r;
r=r->next;
return distributedhead;
}
}
node *release(node *freehead,node *work) /*分四种情况完成空闲分区回收过程*/
{
node *r;
work->flag=0;
freehead=insert(freehead,work);
r=freehead;
while(r)
{
if(r->next==NULL&&r->address+r->length==work->address)//带释放结点为尾结点
{
r->length=r->length+work->length;
type='A';
}
else if(work->length+work->address==r->address&&r==freehead)//待释放结点为头结点
{
r->length=work->length+r->length;
r->address=work->address;
type='B';
}
else
{
if(r->next&&r->next->address==work->address+work->length)
{
r->length=r->length+work->length+r->next->length;
type='C';
}
else if(r->next==NULL&&work->length+work->address!=r->address)
{
r->next=work;
type='D';
}
}
r=r->next;
}
return freehead;
}
void print (node *head) /*输出链表*/
{
node *p;
p=head;
if(!p) printf("链表为空!");
else
{
while(p)
{
printf("%d,%d,%d,%s\n",p->address,p->length,p->flag,p->name);
p=p->next;
}
}
}
int main()
{
int i=0,sum;
struct table *dtable,*ftable;
char workn[10];
printf("The distributed table is:\n");
dtable=creat(); /*dtable 输入已分配情况表*/
printf("The free table is:\n");
ftable=creat(); /*ftable 输入未分配情况表*/
/* 以下模拟逐个内存回收过程*/
printf("Input the released work segment sum:");
scanf("%d",&sum);
while(i<=sum)
{
i++;
printf("%d:input the released work segment name:",i);
scanf("%s",&workn);
dtable=found(dtable,workn);
work=(node*)malloc(sizeof(node));
work->next=NULL;
strcpy(work->name,workn);
if(success)
{
printf("\n要回收的分区存在!\n");
ftable=release(ftable,work);
printf("\nThe type of release is:%s\n\n",type);
printf("\nThe distributed table is !\n");
print(dtable);
printf("\n");
printf("\nThe free table is !\n");
print(ftable);
}
else
{
printf("\n要回收的分区不存在!\n");
}
}
return 0;
}
操作系统——模拟内存回收算法
最新推荐文章于 2023-06-03 21:04:38 发布