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

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

 代码:

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         return;107     }108     for( i = MAX; i > a + 1; i-- )109     {110         if ( part[i - 1].status == '-' )111             continue;112         strcpy( part[i].pn, part[i - 1].pn );113         part[i].begin = part[i - 1].begin;114         part[i].size = part[i - 1].size;115         part[i].end = part[i - 1].end;116         part[i].status = part[i - 1].status;117     }118     strcpy( part[a + 1].pn, "-----" );119     part[a + 1].begin = part[a].begin + workSize;120     part[a + 1].size = part[a].size - workSize;121     part[a + 1].end = part[a].end;122     part[a + 1].status = 'f';123     strcpy( part[a].pn, workName );124     part[a].size = workSize;125     part[a].end = part[a].begin + part[a].size;126     part[a].status = 'u';127 }128 129 void Allocation( )130 {131     int i;132     int a;133     int workSize;134     char workName[10];135     int pFree;136     printf( "\n请输入作业名称:" );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             printf( "该作业大小超出最大可分配空间,请重新输入:" );165         else break;166     }167     printf( "\n请选择分配算法:" );168     printf( "\n1、最先适应(first fit)" );169     printf( "\n2、下次适应(next fit)" );170     printf( "\n3、最优适应(best fit)" );171     printf( "\n4、最坏适应(worst fit)" );172     printf( "\n请输入选项:" );173     while ( 1 )174     {175         scanf( "%d", &a );176         if ( a == 1 || a == 2 || a == 3 || a == 4 )177             break;178         printf( "输入错误,请重新输入:" );179     }180     switch ( a )181     {182     case 1:183         for( i = 0; i < MAX; i++ )184             if ( part[i].status == 'f' && part[i].size >= workSize )185                 break;186             Fit( i, workName, workSize );187             break;188     case 2:189         for( p; p < MAX; p++ )190         {191             if ( p == MAX )192                 p = 0;193             if ( part[p].status == 'f' && part[p].size >= workSize )194                 break;195         }196         Fit( p, workName, workSize );197         break;198     case 3:199         for( i = 0; i < MAX; i++ )200             if ( part[i].status == 'f' && part[i].size >= workSize )201                 if ( part[pFree].size > part[i].size )202                     pFree = i;203                 Fit( pFree, workName, workSize );204                 break;205     case 4:206         for( i = 0; i < MAX; i++ )207             if ( part[i].status == 'f' && part[i].size >= workSize )208                 if ( part[pFree].size < part[i].size )209                     pFree = i;210                 Fit( pFree, workName, workSize );211                 break;212     default:213         break;214     }215     printf( "\n分配成功!" );216     getch( );217 }218 219 void Merge( )220 {221     int i = 0;222     while ( i != MAX - 1 )223     {224         for( i = 0; i < MAX - 1; i++ )225         {226             if ( part[i].status == 'f' )227                 if ( part[i + 1].status == 'f' )228                 {229                     part[i].size = part[i].size + part[i + 1].size;230                     part[i].end = part[i].begin + part[i].size;231                     i++;232                     for( i; i < MAX - 1; i++ )233                     {234                         if ( part[i + 1].status == '-' )235                         {236                             part[i].status = '-';237                             break;238                         }239                         strcpy( part[i].pn, part[i + 1].pn );240                         part[i].begin = part[i + 1].begin;241                         part[i].size = part[i + 1].size;242                         part[i].end = part[i + 1].end;243                         part[i].status = part[i + 1].status;244                     }245                     part[MAX - 1].status = '-';246                     break;247                 }248         }249     }250 }251 252 void Recovery( )253 {254     int i;255     char workName[10];256     printf( "\n请输入回收的分区名称:" );257     scanf( "%s", &workName );258     if ( strcmp( workName, "SYSTEM" ) == 0 )259     {260         printf( "\n系统分区无法回收" );261         return;262     }263     for( i = 0; i < MAX; i++ )264     {265         if ( strcmp( workName, part[i].pn ) == 0 )266         {267             strcpy( part[i].pn, "-----" );268             part[i].status = 'f';269             Merge( );270             printf( "\n回收成功!" );271             getch( );272             return;273         }274     }275     if ( i == MAX )276     {277         printf( "\n找不到分区!" );278         return;279     }280 }281 282 void main( )283 {284     int a;285     Init( );286     printf( "201406114131 商软一班 彭一健 实验4" );287     printf( "\n初始化,设内存容量%dk", MAX );288     printf( "\n系统从低地址部分开始使用,占用%dk", part[0].size );289     printf( "\n" );290     while ( 1 )291     {292         printf( "\n" );293         printf( "\n1、显示分区" );294         printf( "\n2、分配作业" );295         printf( "\n3、回收分区" );296         printf( "\n请输入选项:" );297         while ( 1 )298         {299             scanf( "%d", &a );300             if ( a == 1 || a == 2 || a == 3 )301                 break;302             printf( "输入错误,请重新输入:" );303         }304         switch ( a )305         {306         case 1:307             ShowData( );308             break;309         case 2:310             Allocation( );311             break;312         case 3:313             Recovery( );314             break;315         default:316             break;317         }318     }319 }

 

 

 

 

运行截图:

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

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

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

 

转载于:https://www.cnblogs.com/qq1942589447/p/5539297.html

你可能感兴趣的文章
[MicroPython]TurniBit开发板DIY自动窗帘模拟系统
查看>>
浮点数正则表达式
查看>>
Android 通过接口的方式去调用服务里面的方法
查看>>
什么是JavaBean、bean? 什么是POJO、PO、DTO、VO、BO ? 什么是EJB、EntityBean?
查看>>
Java8中list转map
查看>>
jsp页面的html代码显示不出来,提示Uncaught SyntaxError: Unexpected token <
查看>>
linux下修改tomcat使用的jdk版本
查看>>
mac ssh 连接超时
查看>>
Duplicate modifier for the method isExist in type UploadMusicInfoController
查看>>
LightOJ 1277 Looking for a Subsequence(LIS)
查看>>
用C读取json文件
查看>>
IIS负载均衡-Application Request Route详解第四篇:使用ARR实现三层部署架构
查看>>
在ASP.NET非MVC环境中(WebForm中)构造MVC的URL参数,以及如何根据URL解析出匹配到MVC路由的Controller和Action...
查看>>
二叉树的建树,按层遍历,结点总数,页结点,深度以及三序非递归遍历二叉树,建立中序线索二叉树...
查看>>
Linux 内核动态函数调用可视化工具
查看>>
MySQL性能优化
查看>>
log4cplus使用
查看>>
正确的使用枚举(Enum)
查看>>
Web API应用架构设计分析(1)
查看>>
Java时间操作(一):关于UTC格式时间处理
查看>>