操作系统——模拟内存回收算法

#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;   
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值