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;

    源代码:

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

    结果:

  • 相关阅读:
    DatePickerDialog、AutoCompleteTextView
    GoF23种设计模式之创建型模式之单态模式
    GoF23种设计模式之创建型模式之原型模式
    GoF23种设计模式之结构型模式之适配器模式
    GoF23种设计模式之结构型模式之桥接模式
    GoF23种设计模式之结构型模式之组合模式
    GoF23种设计模式之结构型模式之装饰模式
    GoF23种设计模式之结构型模式之外观模式
    GoF23种设计模式之结构型模式之享元模式
    GoF23种设计模式之结构型模式之代理模式
  • 原文地址:https://www.cnblogs.com/14fzf/p/5614434.html
Copyright © 2011-2022 走看看