zoukankan      html  css  js  c++  java
  • 实验四 主存空间的分配和回收

     一,实验目的

     用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方式及其算法的理解。

    二,实验内容和要求

    采用连续分配方式之动态分区分配存储管理,使用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法4种算法完成设计(任选两种算法)。

    (1)**设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。采用分区说明表进行。

    (2)或在程序运行过程,由用户指定申请与释放。

    (3)设计一个空闲区说明表,以保存某时刻主存空间占用情况。把空闲区说明表的变化情况以及各作业的申请、释放情况显示。

    根据指定的实验课题,完成设计、编码和调试工作,完成实验报告。

    三、主要程序及其解释

    #include"stdio.h"
    #include"stdlib.h"
    
    //已分配区
    struct{
        float address; //起始地址
        float length; //长度
        int flag; //表登记栏标志,用"0"表示空栏目
    }used_table[10];
    
    //空闲表
    struct{
        float address; //起始地址
        float length; //长度
        int flag; //用"0"表示空栏目,用"1"表示未分配
    }free_table[10];
    
    void input(); 
    int allocate1(char str,float leg,int pre);//分配主存空间函数循环适应
    void allocate2(char str,float leg);//分配主存空间函数首次适应
    void reclaim(char str);//回收主存函数
    
    int main()
    {  
        int i;
        float length;
        char name;/*空闲分区表初始化:*/
        int suanfa;
        int caozuo;
        int pre=0;//循环首次适应算法的前一次扫描空闲表处,初始为0
    
        free_table[0].address=10240;
        free_table[0].length=102400;
        free_table[0].flag=1;
    
        for(i=1;i<10;i++)
            free_table[i].flag=0;/*已分配表初始化:*/
        for(i=0;i<10;i++)
            used_table[i].flag=0;
        
        input();
        printf("please choose
    1.首次适应算法
    2.循环首次适应算法
    ");
        scanf("%d",&suanfa);
        
        if(suanfa==1)
        {
            while(1)
            {
                printf("please choose
    1.分配
    2.回收
    ");
                scanf("%d",&caozuo);
                if(caozuo==1)
                {
                    /*a=1分配主存空间*/
                    printf("input the name and length: ");
                    scanf("%*c%c%f",&name,&length);
                    allocate(name,length);/*分配主存空间*/
                }else{
                    /*a=2回收主存空间*/
                    printf("input the reclaim job:");
                    scanf("%*c%c",&name);reclaim(name);/*回收主存空间*/
                }
                input();
            }
        }
        else{
            while(1)
            {
                printf("please choose
    1.分配
    2.回收
    ");
                scanf("%d",&caozuo);
                if(caozuo==1)
                {
                    /*a=1分配主存空间*/
                    printf("input the name and length: ");
                    scanf("%*c%c%f",&name,&length);
                    pre=allocate1(name,length,pre);/*分配主存空间*/
                }else{
                    /*a=2回收主存空间*/
                    printf("input the reclaim job");
                    scanf("%*c%c",&name);reclaim(name);/*回收主存空间*/              
                }
                input();
            }
        }
        return 0;
    }
    
    void input()
    {
        int i;   
        printf("free table:
       add    length    sign
    ");
       
        for(i=0;i<10;i++)
        {
            printf("%6.0f%9.0f%6d
    ",free_table[i].address,free_table[i].length, free_table[i].flag);
        }
        printf(" enter any key and output used table
    ");
        getchar();
        printf(" used table:
       add    length    sign
    ");
        
        for(i=0;i<10;i++)
        {
            
            if(used_table[i].flag!=0)
                printf("%6.0f%9.0f%6c
    ",used_table[i].address,used_table[i].length, used_table[i].flag);
            else
                printf("%6.0f%9.0f%6d
    ",used_table[i].address,used_table[i].length, used_table[i].flag);
            
            
        }
    }
    
    int uflag;//分配表
    int fflag;//空闲表
    
    int allocate1(char str,float leg,int pre)
    {
        
        fflag=0;
        int k,i;
        
        for(i=pre;i<10;i++)
        {
            if(free_table[i].flag==1 && free_table[i].length>=leg)
            {
                fflag=1;break;
            }
            
        }
        if(fflag==0)
            printf("has no suitable table
    ");
        else
        {
            for(k=0;k<10;k++)
            {
                if(used_table[k].flag==0)
                {                           
                    used_table[k].length=leg;
                    used_table[k].address=free_table[i].address;
                    used_table[k].flag=str;
                    free_table[i].address=free_table[i].address+leg;
                    free_table[i].length=free_table[i].length-leg;
                    free_table[i].flag=1;
                    break;
                }
            }
        }
        return i;
        
    }
    
    void allocate2(char str,float leg)
    {    
        fflag=0;
        int k,i;
        
        for(i=0;i<10;i++)
        {
            if(free_table[i].flag==1 && free_table[i].length>=leg)
            {
                fflag=1;break;
            }
            
        }
        if(fflag==0)
            printf("has no suitable free table
    ");
        else
        {
            
            for(k=0;k<10;k++)
            {
                if(used_table[k].flag==0)
                {                           
                    used_table[k].length=leg;
                    used_table[k].address=free_table[i].address;
                    used_table[k].flag=str;
                    free_table[i].address=free_table[i].address+leg;
                    free_table[i].length=free_table[i].length-leg;
                    free_table[i].flag=1;
                    break;
                }
            }
        }  
    }
    
    void reclaim(char str)
    {
        float uend_address;
        float fend_address;
        uflag=0;fflag=0;
        int k,i;
    
        for(k=0;k<10;k++)
        {
            if(used_table[k].flag==str)
            {
                uflag=1;break;
            }
        }
        if(uflag==0)
            printf("
    can not find!
    ");
        else
        {
            for(i=0;i<10;i++)
            {
                uend_address=used_table[k].address+used_table[k].length;
                fend_address=free_table[i].address+free_table[i].length;
                if(used_table[k].address==fend_address)//上邻
                {
                    fflag=1;
                    free_table[i].length=free_table[i].length+used_table[k].length;
                    free_table[i].flag=1;
                    used_table[k].flag=0;
                    used_table[k].length=0;
                    used_table[k].address=0;
                    printf("
    reclaimed!
    ");
                    break;
                }
                else
                {
                    if(free_table[i].address==uend_address)//下邻
                    {
                        fflag=1;
                        free_table[i].address=used_table[k].address;
                        free_table[i].length=free_table[i].length+used_table[k].length;
                        free_table[i].flag=1;
                        used_table[k].flag=0;
                        used_table[k].length=0;
                        used_table[k].address=0;
                        printf("
    reclaimed!
    ");
                        break;
                    }
                }
            }
    
            if(fflag==0)//上下邻都没有空闲
            {
                i=0;
                for(i=0;i<10;i++)
                {
                    if(free_table[i].flag==0)
                    {
                        free_table[i].address=used_table[k].address;
                        free_table[i].length=used_table[k].length;
                        free_table[i].flag=1;
                        used_table[k].length=0;
                        used_table[k].flag=0;
                        used_table[k].address=0;
                        break;
                    }
                }
                printf("
    reclaimed!
    ");
            }
        }
    }

    运行结果

     

    四,实验总结

    这个实验的原理是书本上的知识,老师也在课堂上讲过,觉得理解并不难,但是不知道怎么觉得实验并不简单。参考了学霸的代码,也理解其中代码。也有看其他同学的代码,发觉各有各的特点,希望自己也有个人特点的代码。

  • 相关阅读:
    轻重搭配
    EF的优缺点
    使用bootstrap-select有时显示“Nothing selected”
    IIS发布 HTTP 错误 500.21
    js添加的元素无法触发click事件
    sql server查看表是否死锁
    sql server把一个库表的某个字段更新到另一张表的相同字段
    SQLSERVER排查CPU占用高的情况
    SQL server中如何按照某一字段中的分割符将记录拆成多条
    LINQ to Entities does not recognize the method 'System.DateTime AddDays(Double)' method, and this method cannot be translated into a store expression.
  • 原文地址:https://www.cnblogs.com/zhengyh/p/4557578.html
Copyright © 2011-2022 走看看