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

    一,实验目的

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

    二,实验内容和要求

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

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

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

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

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

      1 #include<stdio.h>
      2 #include <stdlib.h>
      3 #include <conio.h>
      4 #define nil -1
      5 #define NULL 0
      6 #define maxisize 600 //用户的空闲区空间最大值
      7 #define minisize 4
      8 #define getspace(type) (type*)malloc(sizeof(type)) //分配空间
      9 struct table{
     10     char job; //作业标号
     11     float address; //分区起始地址
     12     float length; //分区长度,单位为字节
     13     int flag; //分区表的状态位
     14     struct table *FRlink; //前向指针
     15     struct table *RElink; //后向指针
     16 }*free_table=NULL,*place; //已分配分区表,空闲分区表
     17 typedef struct table FRtable;
     18  
     19 FRtable *init(FRtable *tb)
     20 {
     21     tb->FRlink=NULL;
     22     tb->job=nil;
     23     tb->address=0;
     24     tb->length=2048;
     25     tb->flag=0;
     26     tb->RElink=NULL;
     27     return tb;
     28 }
     29 void allocate(char job,float xk,int choice)
     30 {
     31     FRtable *tb,*link;
     32     int k=0;float temp=600;
     33     if (free_table->FRlink==NULL&&free_table->RElink==NULL)
     34     {
     35         free_table->job=job;
     36         free_table->length=xk;
     37         free_table->flag=1;
     38         if (xk<maxisize)
     39         {
     40             tb=getspace(FRtable);
     41             free_table->RElink=tb;
     42             tb->FRlink=free_table;
     43             tb->job=nil;
     44             tb->address=0+xk;
     45             tb->length=maxisize-xk;
     46             tb->flag=0;
     47         }
     48         if (choice==2)
     49         {
     50             free_table->FRlink=tb;
     51             tb->RElink=free_table;
     52             place=tb;
     53         }
     54         else
     55         {
     56             free_table->FRlink=NULL;
     57             if (xk<maxisize) tb->RElink=NULL;
     58         }
     59         k=1;
     60     }
     61     else
     62     {
     63         if (2==choice) tb=place;//采用CFF时将ta定位到上次找到的合适空间分区的下个空间分区
     64         else tb=free_table;
     65         while(tb!=NULL)
     66         {
     67             if (tb->length>=xk&&tb->flag==0)
     68                 if (tb->length-xk<=minisize)
     69                 {//当搜索到的空间大小<=xk+minisize时,将空间全部分配给作业
     70                     tb->job=job;
     71                     tb->flag=1;
     72                     place=tb->RElink;
     73                     k=1;
     74                     break;
     75                 }
     76                 else
     77                 {//当搜索到的空间大小>xk+minisize时,将空间划分,再分配给作业
     78                     link=getspace(FRtable);
     79                     link->length=tb->length-xk;
     80                     tb->job=job;
     81                     tb->length=xk;
     82                     tb->flag=1;
     83                     link->RElink=tb->RElink;
     84                     if (NULL!=tb->RElink) tb->RElink->FRlink=link;
     85                     tb->RElink=link;
     86                     link->FRlink=tb;
     87                     link->job=nil;
     88                     link->address=tb->address+xk;
     89                     link->flag=0;
     90                     place=link;
     91                     k=1;
     92                     break;
     93                 }
     94                 tb=tb->RElink;
     95         }
     96     }
     97     if (0==k)
     98     {
     99         printf(">>空间申请失败! 
    ");
    100         return;
    101     }
    102 }
    103  
    104 //主存回收函数,回收作业job所占用的分区空间
    105 void reclaim(char job,int choice)
    106 {
    107     int bool1=0,bool2=0;
    108     FRtable *tb,*link;
    109     tb=free_table;
    110     if (2==choice) link=tb;
    111     else link=NULL;
    112     do
    113     {
    114         if (job==tb->job&&1==tb->flag) break;
    115         tb=tb->RElink;
    116         if (tb==link)
    117         {
    118             printf("
    >>抱歉,不存在作业%c! 
    ",job);
    119             return;
    120         }
    121     }while(tb!=link);
    122     bool1=(NULL==tb->FRlink||tb->FRlink==tb->RElink)? 1:tb->FRlink->flag;
    123     bool2=(NULL==tb->RElink||tb->FRlink==tb->RElink)? 1:tb->RElink->flag;
    124     if (bool1&&bool2)
    125     {
    126         tb->job=nil;
    127         tb->flag=0;
    128     }
    129     else if ((NULL==tb->FRlink||1==tb->FRlink->flag)&&0==tb->RElink->flag)
    130     {
    131         link=tb->RElink;
    132         tb->job=nil;
    133         tb->length+=link->length;
    134         tb->flag=0;
    135         tb->RElink=link->RElink;
    136         if (NULL!=link->RElink) link->RElink->FRlink=tb;
    137         free(link);
    138     }
    139     else if (0==tb->FRlink->flag&&1==tb->RElink->flag)
    140     {
    141         link=tb->FRlink;
    142         link->length+=tb->length;
    143         link->RElink=tb->RElink;
    144         tb->RElink->FRlink=link;
    145         if (free_table==tb) free_table=link;
    146         free(tb);
    147     }
    148     else if (0==tb->FRlink->flag&&0==tb->RElink->flag)
    149     {
    150         link=tb->FRlink;
    151         link->length=link->length+tb->length+tb->RElink->length;
    152         link->RElink=tb->RElink->RElink;
    153         if (NULL!=tb->RElink->RElink) tb->RElink->RElink->FRlink=link;
    154         if (free_table==tb) free_table=link;
    155         free(tb);
    156         free(tb->RElink);
    157     }
    158 }
    159 //显示空间分区链表
    160 void display(FRtable *tb,int choice)
    161 {
    162     // clrscr();
    163     FRtable *temp;
    164     if (2==choice) temp=tb;
    165     else temp=NULL;
    166     printf("
    	标号	分区首地址	分区大小(KB)	
    ");
    167     do
    168     {
    169         printf("
    	 %c	 %.2f	 %.2f		 %d",tb->job,tb->address,tb->length,tb->flag);
    170         tb=tb->RElink;
    171     }while(temp!=tb);
    172 }
    173 //主函数
    174 int main()
    175 {
    176     int i,a,choice;
    177     float xk;
    178     char job;
    179     FRtable *ta=getspace(FRtable);
    180     free_table=init(ta);
    181     do{
    182         printf("
     分区分配算法:
    	0 - 退出(Exit)
    	1 - 首次适应算法(FF)
    	2 - 循环首次适应算法
    	
    ");
    183         printf(">>请选择相应的算法(0-2):");
    184         scanf("%d",&choice);
    185         if (0==choice) exit(0);
    186     }while(0>choice&&2<choice);
    187     while(1)
    188     {
    189         printf("
     菜单:
    	0 - 退出(Exit)
    	1 - 申请空间(Allocation)
    	2 - 回收空间(Reclaim) 
    ");
    190         printf(">>请选择你的操作(0-2):");
    191         scanf("%d",&a);
    192         switch(a)
    193         {
    194             //a=0,程序结束
    195         case 0:exit(0);
    196             //a=1,分配主存空间
    197         case 1:printf(">>请输入作业标号和所需要申请的空间:");
    198             scanf("%*c%c%f",&job,&xk);
    199             allocate(job,xk,choice);
    200             display(free_table,choice);
    201             break;
    202             //a=2,回收主存空间
    203         case 2:printf(">>请输入你想回收的作业的相应标号:");
    204             scanf("%*c%c",&job);
    205             reclaim(job,choice);
    206             display(free_table,choice);
    207             break;
    208         default:printf(">>ERROR:No thie choose! 
    ");
    209         }
    210     }
    211 }

    实验结果:

    实验总结

     编程学不好,作业总是不能按时提交,自己觉得作业难度大,自己无从下手,感觉很憋屈。不过通过咨询同学,最终能顺利完成该实验。

  • 相关阅读:
    css常用标签
    关于手机端html的学习
    Vue_按键修饰符
    http_http协议简要概括
    nodejs_fs模块相关练习1
    nodejs_fs模块常用方法
    Vue_组件传值_非父子组件间的传值
    Vue_组件传值_子组件通过事件调用向父组件传值
    Vue_组件传值_父组件向子组件传值
    Vue_使用ref获取DOM元素
  • 原文地址:https://www.cnblogs.com/zhushengjie/p/4599122.html
Copyright © 2011-2022 走看看