博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实验四主存空间的分配和回收
阅读量:6515 次
发布时间:2019-06-24

本文共 9317 字,大约阅读时间需要 31 分钟。

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( "\t%s", part[i].pn ); 37     printf( "\t%d", part[i].begin ); 38     printf( "\t%d", part[i].size ); 39     printf( "\t%d", part[i].end ); 40     printf( "\t%c", part[i].status ); 41 } 42  43 void ShowData( ) 44 { 45     int i; 46     int n; 47     printf( "\n================================================================" ); 48     printf( "\n已分配分区表Used:" ); 49     printf( "\n\tNo.\tproname\tbegin\tsize\tend\tstatus" ); 50     printf( "\n\t------------------------------------------------" ); 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( "\n\tNo.%d", n ); 59             Output( i ); 60             n++; 61         } 62     } 63     printf( "\n" ); 64     printf( "\n================================================================" ); 65     printf( "\n空闲分区表Free:" ); 66     printf( "\n\tNo.\tproname\tbegin\tsize\tend\tstatus" ); 67     printf( "\n\t------------------------------------------------" ); 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( "\n\tNo.%d", n ); 76             Output( i ); 77             n++; 78         } 79     } 80     printf( "\n" ); 81     printf( "\n" ); 82     printf( "\n================================================================" ); 83     printf( "\n内存使用情况,按起始址增长的排:" ); 84     printf( "\nprintf sorted by address:" ); 85     printf( "\n\tNo.\tproname\tbegin\tsize\tend\tstatus" ); 86     printf( "\n\t------------------------------------------------" ); 87     n = 1; 88     for( i = 0; i < MAX; i++ ) 89     { 90         if ( part[i].status == '-' ) 91             break; 92         printf( "\n\tNo.%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( "\n请输入作业名称:" );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( "\n请选择分配算法:" );168     printf( "\n1、最先适应" );169     printf( "\n2、最优适应" );170     printf( "\n3、最坏适应" );171     printf( "\n请输入选项:" );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( "\n分配成功!" );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( "\n请输入回收的分区名称:" );246     scanf( "%s", &workName );247     if ( strcmp( workName, "SYSTEM" ) == 0 )248     {249         printf( "\n系统分区无法回收" );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( "\n回收成功!" );260             getch( );261             return;262         }263     }264     if ( i == MAX )265     {266         printf( "\n找不到分区!" );267         return;268     }269 }270 271 void main( )272 {273     int a;274     Init( );275     printf( "初始化,设内存容量%dk", MAX );276     printf( "\n系统从低地址部分开始使用,占用%dk", part[0].size );277     printf( "\n" );278     while ( 1 )279     {280         printf( "\n" );281         printf( "\n1、显示分区" );282         printf( "\n2、分配作业" );283         printf( "\n3、回收分区" );284         printf( "\n请输入选项:" );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 }

结果:

初始化

输入作业 

回收空间

总结:

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

转载于:https://www.cnblogs.com/zzy999/p/5614804.html

你可能感兴趣的文章
在 CentOS 和 RHEL 上安装 Puppet 服务器和客户端
查看>>
Android性能优化Google课程翻译一:Render----OverDraw实战
查看>>
用Camshift算法对指定目标进行跟踪
查看>>
Tiny4412 开发板 编译环境搭建【转】
查看>>
为你的网站加上SSL,可以使用HTTPS进行访问
查看>>
软件project--谈项目开发
查看>>
Android studio及eclipse中的junit单元測试
查看>>
几个英文网站
查看>>
在Android中创建文件
查看>>
爬虫基础
查看>>
JS组件系列——再推荐一款好用的bootstrap-select组件,亲测还不错
查看>>
CNN网络--AlexNet
查看>>
getopt--parse command line options
查看>>
闭包和OC的block的本质
查看>>
每天一个linux命令(34):du 命令
查看>>
MySQL出现Waiting for table metadata lock的场景浅析
查看>>
C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新)
查看>>
什么是数据埋点?
查看>>
git回滚
查看>>
vue2.0 引用qrcode.js实现获取改变二维码的样式
查看>>