• 实验四主存空间的分配和回收


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

    结果:

    初始化

    输入作业 

    回收空间

    总结:

       经过这次的实验,我懂得了操作系统分配内存的一些基础知识,操作系统主要是寻找空闲区,然后有作业进来就自动寻找合适的空闲区,然后就插入此区域,释放内存后要观察此作业两边的情况,根据不同的情况,对回收的空间进行不一样的处理

  • 相关阅读:
    过滤的特殊字符
    iOS中正则表达式的基本使用方法
    sqlite3特殊的字符转义
    tableView的设置
    IOS中设置cell的背景view和选中时的背景view 、设置cell最右边的指示器(比如箭头文本标签)
    IOS中(类似于进度条哪种效果)MBProgressHUD的使用
    ISO中AFN的使用步骤
    IOS中用UIFont返回字体的行高、动态改变tableView中Cell的高度
    iso中第三方框架SDWebImage的使用步骤
    iso中自动伸缩属性
  • 原文地址:https://www.cnblogs.com/zzy999/p/5614804.html
Copyright © 2020-2023  润新知