zoukankan      html  css  js  c++  java
  • 实验四

    1.      目的和要求

     1.1.           实验目的

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

    1.2.    实验要求

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

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

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

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

    2.   实验内容

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

    3.   实验环境

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

    4. 程序

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h> 
    const int CANUSE = 1;
    const int CANTUSE = 0;
    //#define MSIZE 128;
    const int MSIZE = 128;
    
    
    //内存分区 
    struct MZone
    {
    //空闲区起始地址 
    int begin_addr; 
    //一个连续空闲区的长度
    int length; 
    //状态 
    int state;
    //内存中任务名
    char task_name[32]; 
    //指向下一个空闲分区
    struct MZone *next; 
    };
    
    //内存头指针 
    struct MZone *Mhead = NULL;
    
    //showmemory函数,显示当前内存分配情况 
    void showmemory()
    {
    struct MZone *Mpoint = Mhead;
    
    printf("内存的使用情况
    ");
    printf("beginaddr	length	state	task
    "); 
    
    while( NULL!=Mpoint)
    {
    printf("%dk		",Mpoint->begin_addr);
    printf("%dk	",Mpoint->length);
    Mpoint->state?printf("CANUSE	"):printf("CANTUSE	");
    printf("%s
    ",Mpoint->task_name);
    Mpoint = Mpoint->next;
    } 
    
    system("pause");
    
    }
    
    //memoallocate函数,用于分配内纯 
    void memoallocate(void)
    {
    struct MZone *Mnew = (struct MZone*)malloc(sizeof(struct MZone));
    printf("输入要分配内存大小(kb):
    ");
    scanf("%d",&Mnew->length);
    printf("输入任务名:
    ");
    scanf("%s",&Mnew->task_name);
    Minsert(Mnew)?printf("分配内存成功
    "):printf("没有符合大小的空闲分区,内存分配失败。
    "); 
    system("pause");
    free(Mnew);
    }
    
    //Minsert函数,功能插入任务到空闲分区 
    int Minsert(struct MZone* Mnew)
    {
    
    struct MZone *Zinsert = Mhead;
    //flag用于指示是Zinsert到了NULL,既没有内存可以分配 
    int flag = 1; 
    
    while( Zinsert->length<Mnew->length || !Zinsert->state)
    {
    if( NULL!=Zinsert->next )
    {
    Zinsert = Zinsert->next;
    }
    else
    { 
    Zinsert = Zinsert->next;
    break;
    }
    
    }
    
    if( NULL==Zinsert ) 
    {
    return 0;
    }
    
    if( MSIZE == Zinsert->begin_addr+Mnew->length )
    {
    Zinsert->state = CANTUSE;
    strcpy(Zinsert->task_name , Mnew->task_name);
    Zinsert->next = NULL;
    return 1;
    }
    else
    {
    struct MZone *Ztail = (struct MZone *)malloc(sizeof(struct MZone));
    Zinsert->state = CANTUSE;
    strcpy(Zinsert->task_name , Mnew->task_name);
    Zinsert->length = Mnew->length;
    Zinsert->next = Ztail;
    
    memset( Ztail, 0, sizeof(char)*32 );
    Ztail->begin_addr = Zinsert->begin_addr + Mnew->length;
    Ztail->state = CANUSE;
    Ztail->length = MSIZE - Ztail->begin_addr;
    Ztail->next = NULL;
    
    return 1;
    }
    }
    
    //memoreturn函数,用于回收内存
    void memoreturn(void)
    {
    char tname[32];
    printf("输入要收回的任务名
    ");
    scanf("%s",tname);
    Mreturn(tname); 
    system("pause"); 
    } 
    
    //Mreturn函数,功能回收内存
    int Mreturn(char taskname[])
    {
    struct MZone *front = NULL;
    struct MZone *position = Mhead;
    struct MZone *tail = Mhead->next;
    
    while( 0!=strcmp(position->task_name,taskname) ) 
    {
    front = position;
    if( NULL!=position->next )
    {
    position = position->next;
    }
    else
    {
    position = NULL;
    break;
    }
    tail = position->next;
    }
    
    if( NULL==position )
    {
    printf("内存中没有此任务!"); 
    }
    else
    {
    //不能用CANTUSE 
    if( NULL!=tail&&NULL!=front )
    {
    
    if( front->state&&tail->state )
    {
    front->length = front->length + position->length + tail->length;
    front->next = tail->next;
    free(position);
    free(tail);
    }
    else if( front->state&&!tail->state )
    {
    front->length = front->length + position->length;
    front->next = position->next;
    free(position);
    }
    else if( !front->state&&tail->state )
    {
    position->length = position->length + tail->length;
    memset( position->task_name, 0, sizeof(char)*32 );
    position->next = tail->next;
    position->state = CANUSE;
    free(tail);
    }
    else if( !front->state&&!tail->state )
    {
    memset( position->task_name, 0, sizeof(char)*32 );
    position->state = CANUSE; 
    }
    }
    else if( NULL!=tail&&NULL==front )
    {
    if( !tail->state )
    {
    memset( position->task_name, 0, sizeof(char)*32 );
    position->state = CANUSE;
    }
    else
    {
    position->length = position->length + tail->length;
    position->next = NULL;
    free(tail);
    }
    } 
    else if( NULL==tail&&NULL!=front )
    {
    if(front->state)
    { 
    front->length = front->length + position->length;
    front->next = NULL;
    free(position);
    }
    else
    {
    memset( position->task_name, 0, sizeof(char)*32 );
    position->state = CANUSE;
    }
    }
    else if( NULL==tail&&NULL==front )
    {
    memset( position->task_name, 0, sizeof(char)*32 );
    position->state = CANUSE; 
    }
    printf("内存回收成功!
    ");
    }
    }
    
    int main(void)
    {
    int func_ = 0;
    
    //初始化Mhead 
    Mhead = (struct MZone*)malloc(sizeof(struct MZone));
    Mhead->begin_addr = 0;
    Mhead->length = MSIZE;
    Mhead->state = CANUSE;
    memset(Mhead->task_name, 0, sizeof(char)*32 );
    Mhead->next = NULL;
    
    while( 1 )
    {
    printf("******************首次适应算法实现主存分配和回收系统(内存MSIZE)***************");
    printf("|1:查看内存分配情况
    ");
    printf("|2:申请分配内存
    ");
    printf("|3:申请回收内存
    ");
    printf("|4:退出程序
    ");
    printf("********************************************************************************");
    scanf("%d",&func_);
    switch( func_ )
    {
    case 1 :showmemory();break;
    case 2 :memoallocate();break;
    case 3 :memoreturn();break; 
    case 4 :return 1;
    }
    system("cls");
    } 
    }
  • 相关阅读:
    noi 2011 noi嘉年华 动态规划
    最小乘积生成树
    noi 2009 二叉查找树 动态规划
    noi 2010 超级钢琴 划分树
    noi 2011 阿狸的打字机 AC自动机
    noi 2009 变换序列 贪心
    poj 3659 Cell Phone Network 动态规划
    noi 2010 航空管制 贪心
    IDEA14下配置SVN
    在SpringMVC框架下建立Web项目时web.xml到底该写些什么呢?
  • 原文地址:https://www.cnblogs.com/luowenq/p/4568035.html
Copyright © 2011-2022 走看看