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
    #include<conio.h>

    #define Memory 1024
    struct partition{

    char pn[10];
    int begin;
    int size;
    int end; ////////
    char status; //////////内存状态
    };
    typedef struct partition PART;
    void Freesize();
    void nicefit();
    void restart();

    void firstfit();
    PART Free[MAX],User[MAX],addresses[MAX],t;//t是用于排序最优算法的变量
    int nFree;//空闲内存的数量
    int nUsed;//使用的数量
    int naddresses;//地址数量

    void restart()//初始化
    {int j=0;

    nFree=0,nUsed=0,naddresses=0;

    strcpy(User[0].pn,"SYSTEM");

    User[0].begin=0;
    User[0].size=50;

    nUsed++;



    printf("初始化,设内存总容量为1024k ");
    printf("系统从低地址部分开始使用,占用50k 已初始化");



    strcpy(Free[0].pn,"----");
    Free[0].begin=0;//开始系统占用50K
    Free[0].size=50;
    Free[0].status='n';//n表示再用

    nFree=4;
    naddresses++;
    Free[1].size=40;
    Free[1].status='f';
    Free[2].size=50;
    Free[2].status='f';


    Free[3].size=120;
    Free[3].status='f';

    Free[4].size=70;
    Free[4].status='f';
    Freesize();



    }
    void Freesize(){
    for(int j=1;j<nFree+1;j++)
    {
    Free[j].begin=Free[j-1].begin+Free[j-1].size;

    }
    }


    void PT()//打印
    {
    int i;
    printf("空闲区表Free ");
    printf(" No. proname begin size status ");
    for(i=0;i<=nFree;i++)
    printf(" No.%d %s %d %d %c ",i,Free[i].pn,Free[i].begin,Free[i].size,Free[i].status);

    printf("已分配分区表Used ");
    printf(" No. proname begin size status ");
    for(i=0;i<=nUsed+1;i++)
    printf(" No.%d %s %d %d %c ",i,User[i].pn,User[i].begin,User[i].size,User[i].status);

    }


    void nicefit()
    {int i=1;int j=0;int a=i;int num;int flag=0;int p;
    printf("插入几个进程 ");
    scanf("%d",&num);
    for(i=1;i<num+1;i++){

    printf("名字为 ");
    scanf("%s",&User[i].pn);
    printf("大小 ");
    getchar();
    scanf("%d",&User[i].size);

    }//输入进程

    //排序


    for(p=1;p<5;p++){
    if(Free[p].size>Free[flag].size)
    flag=p;

    }



    for(i=1;i<num+1;i++){

    printf("%d ",flag);
    if(User[i].size<Free[flag].size && Free[flag].status=='f')
    {
    Free[flag].size=Free[flag].size-User[i].size;

    User[i].begin=Free[flag].begin;

    Free[flag].status='n';break;
    }



    }

    PT();
    }

    void Huishou() // 回收分区
    {
    int i;
    int number;
    int n=0;
    printf( " 请输入回收的分区号:" );
    scanf( "%d", &number );
    if ( number == 0)
    {
    printf( " 系统分区无法回收" );
    return;
    }

    for ( i = 1; i <24; i++ )//通过循环查找要回收的已使用分区区号
    {
    if ( Free[i].status == 'n' )
    {
    n++;
    if ( n == number )
    {
    Free[n].size=Free[n].size+User[n].size;
    User[n].size=0;
    User[n].begin=0;
    User[n].status='f';
    strcpy(User[n].pn,"be return");
    Free[n].status = 'f';
    }
    }
    }
    if ( i == MAX - 1 )
    {
    printf( " 找不到分区" );
    return;
    }

    printf( " 回收成功!" ); PT();
    getch();
    }

    void firstfit()
    {int i=1;int j=0;int a=i;int num;
    printf("插入几个进程 ");
    scanf("%d",&num);
    for(i=1;i<num+1;i++){

    printf("名字为 ");
    scanf("%s",&User[i].pn);
    printf("大小 ");
    getchar();
    scanf("%d",&User[i].size);

    }//输入进程
    for(i=1;i<num+1;i++){
    for(j=1;j<24;j++)
    {
    if(User[i].size<Free[j].size&& Free[j].status=='f')
    {
    Free[j].size=Free[j].size-User[i].size;

    User[i].begin=Free[j].begin;

    Free[j].status='n';break;
    }
    }
    }

    PT();
    }

    main(){
    int choice;
    restart();
    PT();

    end1: printf("---------------------请选择算法---------------- ");
    printf("-----------------1.最先适应算法------------------------ ");
    printf("-----------------2.最优适应算法------------------------ ");
    printf("-----------------3.回收分区------------------------ ");
    scanf("%d",&choice);

    switch(choice)
    {

    case 1: firstfit();goto end1;
    case 2: nicefit();break;
    case 3: Huishou();break;
    default:return;
    }
    }

    5.遇到的 问题及思考

    遇到的循环首次适应算法只是在最先适应算法加以改进,记录标志。

    而最优适应算法无法实现是因为排序问题,当排冒泡完序后会使内存空间变量的地址改变,因为无法实现对其回收等操作,一旦排序改变了他的地址,那么他就不再是内存,这和问题条件相违背了。因而在最优适应的方法是遇到了障碍。。

  • 相关阅读:
    C# base64编码、解码
    C#异常重试通用类Retry
    C#操作Control异步工具类
    Notepad++的Json格式化插件
    CG 标准函数库
    Unity 几种优化建议
    基于Unity的Profiler性能分析
    Time.timeScale、游戏暂停
    Lua 中的string库(字符串函数库)总结
    Lua 日志
  • 原文地址:https://www.cnblogs.com/bestmoment/p/5595112.html
Copyright © 2011-2022 走看看