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周完成)

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

     

      1 #include <stdio.h>
      2 #include <conio.h>
      3 #include <string.h>
      4 #define MAX 1024
      5 
      6 struct partition {
      7     char   pn[10];     //分区名称
      8     int    begin;      //起始地址
      9     int    size;       //长度
     10     int    end;        //结束地址
     11     char   status;     //占用标志
     12 };
     13 struct partition    part[MAX];
     14 
     15 int p = 0; /*上次扫描结束处 */
     16 
     17 void Init()
     18 {
     19     int i;
     20     for ( i = 0; i < MAX; i++ )
     21         part[i].status = '-';
     22     strcpy( part[0].pn, "SYSTEM" );
     23     part[0].begin    = 0;
     24     part[0].size    = 250;
     25     part[0].status    = 'u';
     26     strcpy( part[1].pn, "-----" );
     27     part[1].begin    = 250;
     28     part[1].size    = 300;
     29     part[1].status    = 'f';
     30     strcpy( part[2].pn, "a" );
     31     part[2].begin    = 550;
     32     part[2].size    = 150;
     33     part[2].status    = 'u';
     34     strcpy( part[3].pn, "-----" );
     35     part[3].begin    = 700;
     36     part[3].size    = 324;
     37     part[3].status    = 'f';
     38     for ( i = 0; i < MAX; i++ )
     39         part[i].end = part[i].begin + part[i].size;
     40 }
     41 
     42 
     43 void Output( int i ) /* 输出行 */
     44 {
     45     printf( "	%s", part[i].pn );
     46     printf( "	%d", part[i].begin );  
     47     printf( "	%d", part[i].size );
     48     printf( "	%d", part[i].end );
     49     printf( "	%c", part[i].status );
     50 }
     51 
     52 
     53 void ShowData() /* 显示分区 */
     54 {
     55     int    i;
     56     int    n;
     57     
     58     printf( "
                  已分配分区表Used:" );
     59     printf( "
    	No.	proname	begin	size	end	status" );
     60     printf("
    ");
     61     
     62     n = 1;
     63     for ( i = 0; i < MAX; i++ )
     64     {
     65         if ( part[i].status == '-' )
     66             break;
     67         if ( part[i].status == 'u' )
     68         {
     69             printf( "
    	No.%d", n );
     70             Output( i );
     71             n++;
     72         }
     73     }
     74     printf( "
    " );
     75     
     76     printf( "
                   空闲分区表Free:" );
     77     printf( "
    |	No.	proname	begin	size	end	status" );
     78     
     79     n = 1;
     80     for ( i = 0; i < MAX; i++ )
     81     {
     82         if ( part[i].status == '-' )
     83             break;
     84         if ( part[i].status == 'f' )
     85         {
     86             printf( "
    	No.%d", n );
     87             Output( i );
     88             n++;
     89         }
     90     }
     91     printf( "
    " );
     92     printf( "
    " );
     93     
     94     printf( "
              内存使用情况,按起始址增长的排:" );
     95     //printf( "
    |printf sorted by address:" );
     96     printf( "
    |	No.	proname	begin	size	end	status" );
     97     
     98     n = 1;
     99     for ( i = 0; i < MAX; i++ )
    100     {
    101         if ( part[i].status == '-' )
    102             break;
    103         printf( "
    	No.%d", n );
    104         Output( i );
    105         n++;
    106     }
    107     printf("
    回车继续");
    108     getch();
    109 }
    110 
    111 
    112 void Fit( int a, char workName[], int workSize ) /* 分配成'u'+'f' */
    113 {
    114     int i;
    115     for ( i = MAX; i > a + 1; i-- )
    116     {
    117         if ( part[i - 1].status == '-' )
    118             continue;
    119         strcpy( part[i].pn, part[i - 1].pn );
    120         part[i].begin   = part[i - 1].begin;
    121         part[i].size    = part[i - 1].size;
    122         part[i].end     = part[i - 1].end;
    123         part[i].status  = part[i - 1].status;
    124     }
    125     strcpy( part[a + 1].pn, "-----" );
    126     part[a + 1].begin   = part[a].begin + workSize;
    127     part[a + 1].size    = part[a].size - workSize;
    128     part[a + 1].end     = part[a].end;
    129     part[a + 1].status  = 'f';
    130     strcpy( part[a].pn, workName );
    131     part[a].size        = workSize;
    132     part[a].end         = part[a].begin + part[a].size;
    133     part[a].status      = 'u';
    134 }
    135 
    136 
    137 void Allocation() /* 分配 */
    138 {
    139     int    i;
    140     int    a;
    141     int    workSize;
    142     char    workName[10];
    143     int    pFree;
    144     printf( "
    请输入作业名称:" );
    145     scanf( "%s", &workName );
    146     printf( "请输入作业大小(k):" );
    147     scanf( "%d", &workSize );
    148     for ( i = 0; i < MAX; i++ )
    149     {
    150         if ( part[i].status == 'f' && part[i].size >= workSize )
    151         {
    152             pFree = i;
    153             break;
    154         }
    155     }
    156     if ( i == MAX )
    157     {
    158         printf( "
    该作业大小超出最大可分配空间" );
    159         getch();
    160         return;
    161     }
    162     printf( "
    请选择分配算法:" );
    163     printf( "
    1、首次适应" );
    164     printf( "
    2、下次适应" );
    165     printf( "
    3、最优适应" );
    166     printf( "
    4、最坏适应" );
    167     printf( "
    请输入选项:" );
    168     while ( 1 )
    169     {
    170         scanf( "%d", &a );
    171         if ( a == 1 || a == 2 || a == 3|| a == 4 )
    172             break;
    173         printf( "输入错误,请重新输入:" );
    174     }
    175     switch ( a )
    176     {
    177     case 1:
    178         for ( i = 0; i < MAX; i++ )
    179             if ( part[i].status == 'f' && part[i].size >= workSize )
    180                 break;
    181             Fit( i, workName, workSize );
    182             break;
    183     case 2:
    184         for ( p; p < MAX; p++ )
    185         {
    186             if ( p == MAX )
    187                 p = 0;
    188             if ( part[p].status == 'f' && part[p].size >= workSize )
    189                 break;
    190         }
    191         Fit( p, workName, workSize );
    192         break;
    193     case 3:
    194         for ( i = 0; i < MAX; i++ )
    195             if ( part[i].status == 'f' && part[i].size >= workSize )
    196                 if ( part[pFree].size > part[i].size )
    197                     pFree = i;
    198                 Fit( pFree, workName, workSize );
    199                 break;
    200     case 4:
    201         for ( i = 0; i < MAX; i++ )
    202             if ( part[i].status == 'f' && part[i].size >= workSize )
    203                 if ( part[pFree].size < part[i].size )
    204                     pFree = i;
    205                 Fit( pFree, workName, workSize );
    206                 break;
    207     default:
    208         break;
    209     }
    210     printf( "
    分配成功!" );
    211     getch();
    212 }
    213 
    214 
    215 void Merge() /* 合并连续的'f' */
    216 {
    217     int i = 0;
    218     while ( i != MAX - 1 )
    219     {
    220         for ( i = 0; i < MAX - 1; i++ )
    221         {
    222             if ( part[i].status == 'f' )
    223                 if ( part[i + 1].status == 'f' )
    224                 {
    225                     part[i].size    = part[i].size + part[i + 1].size;
    226                     part[i].end    = part[i].begin + part[i].size;
    227                     i++;
    228                     for ( i; i < MAX - 1; i++ )
    229                     {
    230                         if ( part[i + 1].status == '-' )
    231                         {
    232                             part[i].status = '-';
    233                             break;
    234                         }
    235                         strcpy( part[i].pn, part[i + 1].pn );
    236                         part[i].begin    = part[i + 1].begin;
    237                         part[i].size    = part[i + 1].size;
    238                         part[i].end    = part[i + 1].end;
    239                         part[i].status    = part[i + 1].status;
    240                     }
    241                     part[MAX - 1].status = '-';
    242                     break;
    243                 }
    244         }
    245     }
    246 }
    247 /*
    248 void Recovery()
    249 {
    250     int i=0;
    251     char name[10];
    252     printf("输入回收分区的名称:");
    253     scanf("%s",&name);
    254     for(i=1;i<4;i++)
    255     {
    256     
    257         if (strcmp(name,part[i].pn)==0)
    258         {
    259             strcpy( part[i].pn, "-----" );
    260             part[i].begin=part[i-1].end;
    261             part[i]
    262 
    263 
    264         }
    265             char   pn[10];     //分区名称
    266     int    begin;      //起始地址
    267     int    size;       //长度
    268     int    end;        //结束地址
    269     char   status;     //占用标志
    270 
    271 }*/
    272 
    273 
    274 
    275 void main()
    276 {
    277     int a;
    278     Init();
    279     printf( "
    初始化,设内存容量%dk", MAX );
    280     printf( "
    系统从低地址部分开始使用,占用%dk", part[0].size );
    281     printf( "
    " );
    282     while ( 1 )
    283     {
    284         printf( "
    " );
    285         printf("
    *******************");
    286         printf( "
    1、显示分区" );
    287         printf( "
    2、分配作业" );
    288         printf( "
    3、回收分区" );
    289         printf("
    *******************
    ");
    290         printf( "
    请输入选项:" );
    291         while ( 1 )
    292         {
    293             scanf( "%d", &a );
    294             if ( a == 1 || a == 2 || a == 3 )
    295                 break;
    296                 printf( "输入错误,请重新输入:" );
    297         }
    298         switch ( a )
    299         {
    300         case 1:
    301             ShowData();
    302             break;
    303         case 2:
    304             Allocation();
    305             break;
    306         case 3:
    307             //Recovery();
    308             break;
    309         default:
    310             break;
    311         }
    312     }
    313 }

  • 相关阅读:
    syslog远程日志存储/514端口【转】
    干掉僵尸进程
    以太网,IP,TCP,UDP数据包分析【转】
    suricata 的安装编译
    libpcap详解【转】
    蛋疼的经历--wireshark不能启动的问题
    Ubuntu中root用户和user用户的相互切换[转载自93度的饼干]
    OSI七层与TCP/IP五层网络架构详解
    __cplusplus的用法(转)
    IPsec ISAKMP(转)
  • 原文地址:https://www.cnblogs.com/Mrwhite/p/5614429.html
Copyright © 2011-2022 走看看