ag旗舰厅官网_ag旗舰厅下载客户端

热门关键词: ag旗舰厅官网,ag旗舰厅下载客户端

操作系统

当前位置:ag旗舰厅官网 > 操作系统 > 操作系统实验报告,主存空间的分配和回收模拟

操作系统实验报告,主存空间的分配和回收模拟

来源:http://www.pedaLyourcycLe.com 作者:ag旗舰厅官网 时间:2019-10-06 08:40

动态分区存款和储蓄处理格局主存的分配与回收

16网络工程二班 孙书魁

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

 

                13物联网工程    刘烨(英文名:liú yè)   201206104146

目的:

           1,通晓动态分区分配中,使用的数据结会谈算法

          2,深切摸底动态分区存款和储蓄管理方式,主存分配与回收的完成

          3,进一步加深动态分区存款和储蓄管理方式及其完成进程的询问

一、 实验目标

现实贯彻:

            显著主存分配表,然后采纳最好适应算法,完毕到位主存分配和回收,最终编写主函数,举办主函数举办测量检验。

    为了创立地分配和选用这么些囤积空间,当顾客建议申请主存款和储蓄器空间时,存款和储蓄管理必得依照申请者的需求,按一定的安插剖析主存空间和行使状态,搜索足够的闲暇区域给申请者。当作业撤离归还主存财富时,则存款和储蓄管理要吊销占用的主存空间。主存的分红和回收的落到实处是与主存款和储蓄器的田间管理方法有关的,通过本实验支持大家领略在差异的存款和储蓄管理格局下应什么达成主存空间的分配和回收。

实际完结:

            主存分配在此以前的之态,主存分配进程中的状态,回收后的地方

 

  1 #include <stdio.h>   
  2 #include <string.h>
  3 #define MAX 600  //设置总内存大小为512k
  4 
  5 struct partition {
  6     char    pn[10];//分区名字
  7     int     begin;//起始地址
  8     int     size;//分区大小 
  9     int     end;//结束地址
 10     char    status;//分区状态
 11  };
 12  struct partition    part[MAX];
 13  int    p = 0; //标记上次扫描结束处 
 14  
 15  void Init()//初始化分区地址、大小以及状态
 16 {
 17     int i;
 18     for ( i = 0; i < MAX; i++ )
 19          part[i].status = '-';
 20      strcpy( part[0].pn, "SYSTEM" );
 21      part[0].begin    = 0;
 22      part[0].size    = 100;
 23      part[0].status    = 'u';
 24   
 25      strcpy( part[1].pn, "-----" );
 26      part[1].begin    = 100;
 27      part[1].size    = 100;
 28      part[1].status    = 'f';
 29      strcpy( part[2].pn, "A" );
 30      part[2].begin    = 200;
 31      part[2].size    = 50;
 32      part[2].status    = 'u';
 33      strcpy( part[3].pn, "-----" );
 34      part[3].begin    = 250;
 35      part[3].size    = 50;
 36      part[3].status    = 'f';
 37      strcpy( part[4].pn, "B" );
 38      part[4].begin    = 300;
 39      part[4].size    = 100;
 40      part[4].status    = 'u';
 41      strcpy( part[5].pn, "-----" );
 42      part[5].begin    = 400;
 43      part[5].size    = 200;
 44      part[5].status    = 'f';
 45      for ( i = 0; i < MAX; i++ )
 46          part[i].end = part[i].begin + part[i].size-1;
 47  }
 48   
 49 
 50   void Output( int i ) //以行的形式输出结构体的数据
 51  {
 52      printf( "t%s", part[i].pn );
 53      printf( "t%d", part[i].begin );
 54      printf( "t%d", part[i].size );
 55      printf( "t%d", part[i].end );
 56      printf( "t%c", part[i].status );
 57  }
 58  
 59 
 60  void display() //显示分区 
 61  {
 62      int    i;
 63      int    n; //用n来记录分区的个数
 64      printf("n");
 65      printf( "n        已分配分区表Used:" );
 66      printf( "ntNo.tpronametbegintsizetendtstatus" );
 67      printf("n");
 68      n = 1;
 69      for ( i = 0; i < MAX; i++ )
 70      {
 71          if ( part[i].status == '-' )
 72              break;
 73          if ( part[i].status == 'u' )
 74          {
 75              printf( "ntNo.%d", n );
 76              Output( i );
 77              n++;// 记录已分配使用的分区个数
 78          }
 79      }
 80      printf("n");
 81      printf( "n        空闲分区表Free:" );
 82      printf( "ntNo.tpronametbegintsizetendtstatus" );
 83      printf("n");
 84      n = 1;
 85      for ( i = 0; i < MAX; i++ )
 86      {
 87          if ( part[i].status == '-' )
 88               break;
 89         if ( part[i].status == 'f' )
 90           {
 91               printf( "ntNo.%d", n );
 92            Output( i );
 93               n++;  //记录空闲分区的个数
 94           }
 95     }
 96     // printf( "n" );
 97      printf("n");
 98      printf( "n        内存使用情况,按起始址增长的排:" );
 99      //printf( "n        printf sorted by address:" );
100      printf( "ntNo.tpronametbegintsizetendtstatus" );
101      printf("n");
102      n = 1;
103      for ( i = 0; i < MAX; i++ )
104      {
105          if ( part[i].status == '-' )
106              break;
107          printf( "ntNo.%d", n );
108          Output( i );
109         n++;//记录已分配分区以及空闲分区之和的总个数
110     }
111      getch();
112  }
113  
114  void Fit( int a, char workName[], int workSize ) //新作业把一个分区分配成两个分区:已使用分区和空闲分区 
115  {
116      int i;
117      for ( i = MAX; i > a + 1; i-- )
118      {
119         //通过逆向遍历,把在a地址后的所有分区往后退一个分区,目的在于增加一个分区
120          if ( part[i - 1].status == '-' )
121              continue;
122          part[i]=part[i-1];
123     }
124      strcpy( part[a + 1].pn, "-----" );
125      part[a + 1].begin    = part[a].begin + workSize;
126      part[a + 1].size    = part[a].size - workSize;
127      part[a + 1].end        = part[a].end-1;
128      part[a + 1].status    = 'f';
129     strcpy( part[a].pn, workName );
130      part[a].size    = workSize;
131      part[a].end    = part[a].begin + part[a].size-1;
132      part[a].status    = 'u';
133  }
134  void fenpei() // 分配 
135  {
136      int    i;
137      int    a;
138     int    workSize;
139      char    workName[10];
140      int    pFree;
141      printf( "n请输入作业名称:" );
142      scanf( "%s", &workName );
143      for(i=0;i<MAX;i++)
144     {
145          if(!strcmp(part[i].pn,workName))//判断作业名称是否已经存在
146          {
147              printf("n作业已经存在,不必再次分配!n");
148             return;
149          }
150      }
151      printf( "请输入作业大小(k):" );
152      scanf( "%d", &workSize );
153      for ( i = 0; i < MAX; i++ )//通过循环在空闲区找是否有适合区间存储作业
154      {
155          if ( part[i].status == 'f' && part[i].size >= workSize )
156          {
157              pFree = i;
158              break;
159          }
160     }
161     if ( i == MAX )
162     {
163          printf( "n该作业大小超出最大可分配空间" );
164          getch();
165          return;
166      }
167      
168          for ( i = 0; i < MAX; i++ )//最佳适应算法
169             if ( part[i].status == 'f' && part[i].size >= workSize )
170                  if ( part[pFree].size > part[i].size )
171                      pFree = i;//通过遍历所有区间,每次都找到最小空闲分区进行分配
172          Fit( pFree, workName, workSize );
173     printf( "n分配成功!" );
174     getch();
175  }
176  void hebing() //合并连续的空闲分区 
177  {
178     int i = 0;
179     while ( i != MAX - 1 )
180     {
181         for ( i = 0; i < MAX - 1; i++ )
182         {
183             if ( part[i].status == 'f' )
184                  if ( part[i + 1].status == 'f' )
185                 {
186                      part[i].size    = part[i].size + part[i + 1].size;
187                      part[i].end    = part[i].begin + part[i].size-1;
188                      i++;
189                      for ( i; i < MAX - 1; i++ )
190                     {
191                         if ( part[i + 1].status == '-' )
192                         {
193                             part[i].status = '-';
194                             break;
195   
196                         }
197                         
198                         part[i]=part[i+1];
199                     }
200                      part[MAX - 1].status = '-';
201                      break;
202                  }
203         }
204     }
205  }
206  
207  
208  void huishou() // 回收分区 
209  {
210      int    i;
211      int    number;
212      int    n=0;
213      printf( "n请输入回收的分区号:" );
214      scanf( "%d", &number );
215      if ( number == 1 )
216      {
217          printf( "n系统分区无法回收" );
218          return;
219      }
220      for ( i = 0; i < MAX; i++ )//通过循环查找要回收的已使用分区区号
221      {
222          if ( part[i].status == 'u' )
223          {
224              n++;
225              if ( n == number )
226             {
227                  strcpy( part[i].pn, "-----" );
228                  part[i].status = 'f';
229             }
230          }
231      }
232      if ( i == MAX - 1 )
233      {
234          printf( "n找不到分区" );
235          return;
236      }
237      hebing();//合并连续的空闲分区
238      printf( "n回收成功!" );
239      getch();
240  }
241  
242  
243  void main()
244 {
245      int selection;
246      Init();
247      printf( "初始化完成,设内存容量%dk", MAX );
248      printf( "n系统文件从低址存储,占%dk", part[0].size );
249      while ( 1 )
250      {
251          printf( "n----------选择----------" );
252          printf( "n|  0、退出系统         |" );
253          printf( "n|  1、显示分区         |" );
254          printf( "n|  2、分配分区         |" );
255          printf( "n|  3、回收分区         |" );
256          printf( "n------------------------");
257         printf( "n请选择 > " );
258          while ( 1 )
259          {
260              scanf( "%d", &selection );
261              if ( selection == 0 ||selection == 1 || selection == 2 || selection == 3 )
262                  break;
263              printf( "输入错误,请重新输入:" );
264          }
265          switch ( selection )
266          {
267            case 0:
268            exit(0); //退出系统
269              break;
270          case 1:
271              display(); //显示分区
272              break;
273         case 2:
274              fenpei(); //分配作业
275              break;
276          case 3:
277              huishou();  //回收分区
278              break;
279          default:
280              break;
281          }
282      }
283  }

 

图片 1

图片 2

图片 3

图片 4

二、 实验内容和须要

1)完结特定的内部存款和储蓄器分配算法

2)完成内部存款和储蓄器回收模拟

3)每一个内部存款和储蓄器分配政策对应的零散数计算

2.2  固定分区存款和储蓄管理

    假使内部存款和储蓄器体积为120KB,况且分别划分成8,16,32,64KB大小的块各一块。

二个进度所须要的内部存款和储蓄器为0到玖十四个KB。同期假设一个经过在运作过程中所需内部存款和储蓄器的分寸不改变。

画虎不成反类犬五个进度达到央求分配与运作完回收情形,输出主存分配表。

2.3  动态分区分配存款和储蓄管理

    选择三番五次分配格局之动态分区分配存款和储蓄管理,使用第叁次适应算法、后一次适应算法、最好适应算法和最坏适应算法4种算法实现设计(任选三种算法)。

(1)在程序运营进度,由客商内定申请与释放。

(2)设计叁个已占用分区表,以保留某时刻主存空间占有意况。

(3)设计三个悠闲分区表,以保存某时刻主存空间剩余情形。

(4)用五个表的浮动景况,反应各进度所需内部存款和储蓄器的提请与自由意况。

 

  1. 源程序名:实验二 1.c

可实践程序名:1.exe

  1. 关键程序段及其表达:

 

#include"stdio.h"

#include"stdlib.h"

#define n 10 

#define m 10

#define minisize 100

struct{

 float address; /*已分分区起先地址*/

    float length; /*已分分村长度,单位为字节*/

    int flag; 

}used_table[n]; /*已分配区表*/

 

struct{

 float address; /*空闲区早先地址*/

 float length; /*空闲村长度,单位为字节*/

 int flag; 

}free_table[m]; /*空闲区表*/

 

void main( )

{

 int i,a;

 void allocate(char str,float leg);//分配主存空间函数

 void reclaim(char str);//回收主存函数

 float xk;

 char J;/*闲暇分区表起始化:*/

 free_table[0].address=10240; /*开始地址*/

 free_table[0].length=102400; /*地址长度*/

 free_table[0].flag=1;

 for(i=1;i<m;i++)

  free_table[i].flag=0;/*已分配表开首化:*/

    for(i=0;i<n;i++)

  used_table[i].flag=0;

 while(1)

 {

  printf("n选取作用项(0-退出,1-分红主存,2-回收主存,3-展现主存)n");

  printf("选取功项(0~3) :");

  scanf("%d",&a);

  switch(a)

  {

  case 0: exit(0); 

  case 1: 

   printf("输入作业名和作业所需长度: ");

   scanf("%*c%c%f",&J,&xk);

   allocate(J,xk);/*分配主存空间*/

   break;

  case 2: 

printf("输入要回收分区的作业名");

   scanf("%*c%c",&J);reclaim(J);/*回收主存空间*/

   break;

  case 3:

   printf("输出空闲区表:n开首地址 分区长度 标记n");

   for(i=0;i<m;i++)

    printf("%6.0f%9.0f%6dn",free_table[i].address,free_table[i].length, free_table[i].flag);

   printf(" 按任意键,输出已分配区表n");

   getchar();

       printf(" 输出已分配区表:n伊始地址 分区长度 标记n");

   for(i=0;i<n;i++)

 

    if(used_table[i].flag!=0)

     printf("%6.0f%9.0f%6cn",used_table[i].address,used_table[i].length, used_table[i].flag);

    else

     printf("%6.0f%9.0f%6dn",used_table[i].address,used_table[i].length, used_table[i].flag);

    break;

   default:printf("未有该采用n");

  }

 }

}/*主函数结束*/ 

int uflag;//分配表标识

int fflag;//空闲表标记

float uend_address;

float fend_address;

void allocate(char str,float leg)

{

 int k,i;float ressize;

uflag=0;fflag=0;

 

 

 for(i=0;i<m;i++)

 {

  if(free_table[i].flag==1 && free_table[i].length>=leg)

  {

   fflag=1;break;

  }

    

 }

 if(fflag==0)

  printf("未有知足条件的空闲区n");

 else

 {

  ressize=free_table[i].length-leg;

  for(k=0;k<n;k++)

  {

   if(used_table[k].flag==0)

   {

    if(ressize<minisize)//剩余块过小

    {

     used_table[k].length=free_table[i].length;

     used_table[k].address=free_table[i].address;

     used_table[k].flag=str;

     free_table[i].length=0;

     free_table[i].flag=0;

     break;

    }

    else

    {

     used_table[k].address=free_table[i].address+ressize;

     used_table[k].flag=str;

     used_table[k].length=leg;

     free_table[i].length=ressize;

     break;

    }

   }

  }//for结束

 }

}

void reclaim(char str)

{ int k,i;

 uflag=0;fflag=0;

 

 for(k=0;k<n;k++)

 {

  if(used_table[k].flag==str)

  {

   uflag=1;break;

  }

 }

 if(uflag==0)

  printf("n找不到该学业!n");

 else

 {

  for(i=0;i<m;i++)

  {

   uend_address=used_table[k].address+used_table[k].length;

   fend_address=free_table[i].address+free_table[i].length;

   if(used_table[k].address==fend_address)//上邻

   {

    fflag=1;

    free_table[i].length=free_table[i].length+used_table[k].length;

    free_table[i].flag=1;

    used_table[k].flag=0;

    used_table[k].length=0;

    used_table[k].address=0;

    printf("n已回收!n");

    break;

   }

   else

   {

    if(free_table[i].address==uend_address)//下邻

    {

     fflag=1;

     free_table[i].address=used_table[k].address;

     free_table[i].length=free_table[i].length+used_table[k].length;

     free_table[i].flag=1;

     used_table[k].flag=0;

     used_table[k].length=0;

     used_table[k].address=0;

     printf("n已回收!n");

     break;

    }

   }

  }//for结束

  if(fflag==0)

  {

   i=0;

   for(i=0;i<m;i++)

   {

    if(free_table[i].flag==0)

    {

     free_table[i].address=used_table[k].address;

     free_table[i].length=used_table[k].length;

     free_table[i].flag=1;

     used_table[k].length=0;

     used_table[k].flag=0;

     used_table[k].address=0;

     break;

    }

   }

   printf("n已回收!n");

  }

 }

}

图片 5

图片 6

 图片 7

四、实验总计:

主存空间的分红与回收,可变分区方式是按作业须求的主存空间尺寸来划分分区的。当要装入三个功课时,依照作业供给的主存体量查看是或不是有丰硕的空余空间,若有,则按需分配,不然,作业不可能装入。在打开编程时遇见了算法上的难点,后来通过请教同学以及查找网络财富而得出结果。

本文由ag旗舰厅官网发布于操作系统,转载请注明出处:操作系统实验报告,主存空间的分配和回收模拟

关键词:

上一篇:首次打开提示

下一篇:没有了