• [操作系统]实验四


    #include"stdio.h"
    #include"stdlib.h"
    struct{
        char name[8];
        float address; /*已分分区起始地址*/
        float length; /*已分分区长度,*/
        int flag; /*已分配区表登记栏标志,用"0"表示空栏目*/
    }used_table[10]; /*已分配区表*/
    
    struct{
        float address; /*空闲区起始地址*/
        float length; /*空闲区长度*/
        int flag; /*空闲区表登记栏标志,用"0"表示空栏目,用"1"表示未分配*/
    }temp,free_table[10]; /*空闲区表*/
    
    
    
    void allocate(char str[8],float leg);
    void sort();
    
    void reclaim(char str[8]);//回收主存函数
    void input();
    int main()
    {
        int i;
        float length;
        char name[8];
        int caozuo;
        /*空闲分区表初始化:*/
        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;
            strcpy(used_table[i].name,"---");
        }
            
        input();
    
        while(1)
        {
            printf("请选择操作
    1.分配
    2.回收
    ");
            scanf("%d",&caozuo);
            if(caozuo==1)
            {
                printf("输入进程名和作业所需长度: ");
                scanf("%s",&name);
                scanf("%f",&length);
                allocate(name,length);/*分配主存空间*/
            }
            else
            {
                printf("输入要回收分区的进程名");
                scanf("%s",&name);
                reclaim(name);/*回收主存空间*/
            }
            input();
        }
    
        return 0;
    }
    void input()
    {
        int i;
    
        printf("输出空闲区表:
    	起始地址	分区长度	标志
    ");
        
        for(i=0;i<10;i++)
        {
    
            printf("	%.0f	%9.0f	%9d
    ",free_table[i].address,free_table[i].length,free_table[i].flag);
        }
    
        printf("输出已分配区表:
    名称	起始地址	分区长度	标志
    ");
        strcpy(used_table[0].name,"sys");
        used_table[0].address=0;
        used_table[0].length=10240;
        used_table[0].flag=1;
        for(i=0;i<10;i++)
        {
    
            if(used_table[i].flag!=0)
                printf("%s	%.0f	%9.0f	%9d
    ",used_table[i].name,used_table[i].address,used_table[i].length,used_table[i].flag);
            else
                printf("%s	%.0f	%9.0f	%9d
    ",used_table[i].name,used_table[i].address,used_table[i].length,used_table[i].flag);
    
        }
    }
    int uflag;//分配表标志
    int fflag;//空闲表标志
    
    void allocate(char str[8],float leg)
    {
        int k,i;
        fflag=0;
        
        for(k=0;k<10;k++)
        {
            if(!strcmp(str,used_table[k].name))
            {
                printf("
    存在相同名称的作业,请重新输入
    ");
                return; 
            }
        }
    
        for(i=0;i<10;i++)
        {
            if(free_table[i].flag==1 && free_table[i].length>=leg)
            {
                fflag=1;                                                          
                break;
            }
        }
        if(fflag==0)
            printf("没有满足条件的空闲区
    ");
        else
        {
            for(k=1;k<10;k++)
            {
                if(used_table[k].flag==0)
                {
                    strcpy(used_table[k].name,str);
                    used_table[k].length=leg;
                    used_table[k].address=free_table[i].address;
                    used_table[k].flag=1;
                    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 sort()
    {
        int i,j;
        for(i = 0; i < 10; i++)
        {
            for(j = 0; j < 10-i; j++)
            {
                if(free_table[j].address > free_table[j+1].address)
                {
                    if(free_table[j+1].address==0)
                        break;
                    temp=free_table[j]; 
                    free_table[j]=free_table[j+1]; 
                    free_table[j+1]=temp;
                }
            }
        }
    }
    void reclaim(char str[8])
    {
        int k,i;
        float uend_address;
        float fend_address;
        uflag=0;
        fflag=0;
    
        for(k=1;k<10;k++)
        {
            if(!strcmp(str,used_table[k].name))
            {
                uflag=1;
                break;
            }
        }
        if(uflag==0)
            printf("
    找不到该进程!
    ");
        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;
                    strcpy(used_table[k].name,"---");
                    used_table[k].flag=0;
                    used_table[k].length=0;
                    used_table[k].address=0;
                    printf("
    已回收!
    ");
                    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;
                        strcpy(used_table[k].name,"---");
                        used_table[k].flag=0;
                        used_table[k].length=0;
                        used_table[k].address=0;
                        printf("
    已回收!
    ");
                        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;
                        strcpy(used_table[k].name,"---");
                        used_table[k].length=0;
                        used_table[k].flag=0;
                        used_table[k].address=0;
                        break;
                    }
                }
                printf("
    已回收!
    ");
            }
        }
        sort();
    }
  • 相关阅读:
    mysql安装前的系统准备工作(转)
    mysql多实例的配置(转)
    饼干怪兽和APT攻击
    Linux
    android application简要类(一)
    轨道sql谈话 dbms_monitor
    Android有关Volley使用(十)至Request和Reponse意识
    data URI scheme及其应用
    java在string和int相互转化
    ComponentName意思
  • 原文地址:https://www.cnblogs.com/xiseven/p/5593900.html
Copyright © 2020-2023  润新知