• 【操作系统】实验四 主存空间的分配和回收


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

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

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

     

    源代码:

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

    运行结果:

  • 相关阅读:
    Generic data structures in C
    ioremap
    Writing LRU Cache in C
    智能logo免费体验|如何让餐饮logo在点评网站上一眼出众?
    web应用主动从服务器推送数据到客户端的方式
    Vue router 导航守位
    css 清除浮动
    html 布局 左右两边是200px 的宽度,中间自适应
    手机端和PC端浏览器兼容
    js 原型链
  • 原文地址:https://www.cnblogs.com/jinyechutao11/p/5614727.html
Copyright © 2020-2023  润新知