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

    实验四主存空间的分配和回收

    1.    目的和要求

    1.1.           实验目的

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

    1.2.           实验要求

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

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

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

    (3)设计一个空闲区说明表,以保存某时刻主存空间占用情况。

    把空闲区说明表的变化情况以及各作业的申请、释放情况显示。

    2.    实验内容

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

    3.    实验环境

    可以选用Visual C++作为开发环境。也可以选用Windows下的VB,CB或其他可视化环境,利用各种控件较为方便。自主选择实验环境。

    4.    参考数据结构:

    #include<stdio.h>

    #include<conio.h>

    #include<string.h>

    #define MAX 24

    struct partition{

         

          char pn[10];

          int begin;

          int size;

          int end;   ////////

          char status;  //////////

          };

    typedef struct partition PART;

    第一步:(第13周完成)

    完成程序数据结构的创建,初始化内存分配情况,创建空闲分区表和已分配分区表。

    #include <stdio.h>
    #include<conio.h>
    #include<string.h>
    #define MAX 100
    struct partition{
        char pn[10];
        int begin;
        int size;
        int end;   ////////
        char status;  //////////
        };
    typedef struct partition PART;
    PART p[MAX];
    int n;
    
    int msize = 7;
    
    void init()
    {
        p[0].begin = 0;
        p[0].end = 200;
        strcpy(p[0].pn, "SYSTEM");
        p[0].size = 200;
        p[0].status = 'u';
    
        p[1].begin = 200;
        p[1].end = 1024;
        strcpy(p[1].pn, "-----");
        p[1].size = p[1].end - p[1].begin;
        p[1].status = 'f';
    
        n = 2;
    }
    
    void show()
    {
        int x = 1;
    
        printf("空闲区表Free:
    ");
        printf("	No.	proname	begin	size	status
    ");
        for(int i = 0; i < n; i++)
        {
            if(p[i].status == 'f')
                printf("	No.%d	%s	%4d	%4d	%4c
    ", x++, p[i].pn, p[i].begin, p[i].size, p[i].status);
        }
        printf("
    
    =========================================================
    ");
    
        printf("已分配分区表Used:
    ");
        printf("	No.	proname	begin	size	status
    ");
        for(i = 0, x = 1; i < n; i++)
        {
            if(p[i].status == 'u')
                printf("	No.%d	%s	%4d	%4d	%4c
    ", x++, p[i].pn, p[i].begin, p[i].size, p[i].status);
        }
    
        printf("
    
    =========================================================
    ");
    
        printf("内存使用情况:
    printf sorted by address:
    ");
        printf("	No.	proname	begin	size	status
    ");
        printf("	--------------------------------------
    ");
        for(i = 0, x = 1; i < n; i++)
        {
                printf("	No.%d	%s	%4d	%4d	%4c
    ", x++, p[i].pn, p[i].begin, p[i].size, p[i].status);
        }
    }
    
    void input(char name[], int * size)
    {    
        int x = 1;
    
        while(x)
        {
            printf("
    
    请输入进程名称:");
            scanf("%s", name);
    
            for(int i = 0; i < n; i++)
            {    
                x = 0;
                if(strcmp(name, p[i].pn) == 0)
                {
                    x = 1;
                    printf("进程名称已存在,请重新输入!");                
                    break;
                }
            }
            
        }
        
        x = 1;
        scanf("!!!
    ");
        while(x)
        {
            printf("
    请输入进程需要的空间大小:");
            scanf("%d", size);
    
            for(int i = 0; i < n; i++)
            {
                
                if(p[i].size >= *size)
                {
                    x = 0;    
                    break;
                }
            }
            if(x)
                printf("找不到适合的空间,请重新输入!");
        }
    
    }
    
    int show_menu()
    {
        int x;
        
        printf("
    (1)首次适应算法");
        printf("
    (2)循环首次适应算法");
        printf("
    (3)最佳适应算法");
        printf("
    (4)最坏适应算法");
        printf("
    请选择一种分配方式:");
        scanf("%d", &x);
        while(x < 1 || x > 4)
        {
            printf("
    输入错误!");
            printf("
    请选择一种分配方式:");
            scanf("%d", &x);
        }
    
        return x;
    }
    
    void first_fit(char name[], int size)
    {
        for(int i = 0; i < n; i++)
        {
            if(p[i].status == 'f')
            {    
                if(p[i].size - size < msize)
                {
                    strcpy(p[i].pn, name);
                    p[i].status = 'u';
                    break;
                }
                else
                {
                    strcpy(p[n].pn, p[i].pn);
                    p[n].begin = p[i].begin + size;
                    p[n].end = p[i].end;
                    p[n].size = p[n].end - p[n].begin;
                    p[n].status = 'f';
                    strcpy(p[i].pn, name);
                    p[i].end = p[i].begin + size;
                    p[i].size = size;
                    p[i].status = 'u';
                    n++;
                    break;
                }
            }
        }
        
    }
    
    void next_fit()
    {
        
    }
    
    void best_fit()
    {
    
    }
    
    void worst_fit()
    {
    
    }
    
    void allocation()
    {
        char name[10];
        int size;
    
        input(name, &size);
        int x = show_menu();
        
        switch(x)
        {
        case 1:
            first_fit(name, size);
            break;
        case 2:
            next_fit();
            break;
        case 3:
            best_fit();
            break;
        case 4:
            worst_fit();
            break;
        }
    
        show();
    }
    
    void move(int i, int o)
    {
        while(i != 0 && i < n)
        {
            strcpy(p[i-1].pn, p[i].pn);
            p[i-1].begin = p[i].begin;
            p[i-1].end = p[i].end;
            p[i-1].size = p[i].size;
            p[i-1].status = p[i].status;
        }
        n--;
    }
    
    void recycle()
    {
        char name[10];
        int x = 0;
    
        printf("
    
    请输入进程名称:");
        scanf("%s", name);
    
        for(int i = 0; i < n; i++)
        {    
            if(strcmp(name, p[i].pn) == 0)
            {
                x = 1;    
                break;
            }
        }
        if(x == 0)
            printf("
    
    进程不存在。
    ");
        else if(x == 1)
        {
            if(p[i-1].status == 'u' && p[i+1].status == 'u')
            {
                strcpy(p[i].pn, "-----");
                p[i].status = 'f';
            }
            else if(p[i+1].status == 'f')
            {
                printf("
    !!!
    ");
                strcpy(p[i].pn, "-----");
                p[i].status = 'f';
                p[i].end = p[i+1].end;
                p[i].size += p[i+1].size; 
                move(i+2, 1);
            }
            else if(p[i-1].status == 'f')
            {
                p[i-1].end = p[i].end;
                p[i-1].size += p[i].size;
                move(i+1, 1);
            }
            else if(p[i-1].status == 'f' && p[i+1].status == 'f')
            {
                p[i-1].end = p[i+1].end;
                p[i-1].size = p[i-1].size + p[i].size + p[i+1].size;    
                move(i+1, 2);
            }
        }
    
        show();    
    }
    
    int main(void)
    {
        int x = 0;
    
        printf("初始化:设置内存总容量为 1024k
    系统从低地址部分开始占用 200k
    
    ");
    
        init();
        show();
        
        printf("
    1. 输入进程     2. 回收进程
    ");
        scanf("%d", &x);
        while(1)
        {
            if(x == 1)
                allocation();
            else if(x == 2)
                recycle();
    
            printf("
    1. 输入进程     2. 回收进程
    ");
            scanf("%d", &x);
        }
        
        
    
        return 0;
    }
    

      

  • 相关阅读:
    Python 类中方法的内部变量,命名加'self.'变成 self.xxx 和不加直接 xxx 的区别
    用foreach遍历 datagridView 指定列所有的内容
    treeView1.SelectedNode.Level
    YES NO 上一个 下一个
    正则 单词全字匹配查找 reg 边界查找 精确匹配 只匹配字符 不含连续的字符
    抓取2个字符串中间的字符串
    sqlite 60000行 插入到数据库只用不到2秒
    将多行文本以单行的格式保存起来 读和写 ini
    将秒转换成时间格式
    richtextbox Ctrl+V只粘贴纯文本格式
  • 原文地址:https://www.cnblogs.com/mafu0420/p/5594143.html
Copyright © 2011-2022 走看看