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


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

    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;

    5、源代码

      1 #include <stdio.h>
      2 #include<conio.h>
      3 #include<string.h>
      4 #define MAX 100
      5 struct partition{
      6     char pn[10];
      7     int begin;
      8     int size;
      9     int end;   
     10     char status;  
     11     };
     12 typedef struct partition PART;
     13 PART p[MAX];
     14 int n;
     15 
     16 void init()
     17 {
     18     p[0].begin = 0;
     19     p[0].end = 150;
     20     strcpy(p[0].pn, "SYSTEM");
     21     p[0].size = 100;
     22     p[0].status = 'u';
     23 
     24     p[1].begin = 150;
     25     p[1].end = 1024;
     26     strcpy(p[1].pn, "-----");
     27     p[1].size = p[1].end - p[1].begin;
     28     p[1].status = 'f';
     29 
     30     n = 2;
     31 }
     32 
     33 void print()
     34 {
     35     int x = 1;
     36 
     37     printf("空闲区表Free:
    ");
     38     printf("	No.	proname	begin	size	status
    ");
     39     for(int i = 0; i < n; i++)
     40     {
     41         if(p[i].status=='f')
     42             printf("	No.%d	%s	%4d	%4d	%4c
    ", x++, p[i].pn, p[i].begin, p[i].size, p[i].status);
     43     }
     44     printf("
    
    =========================================================
    ");
     45 
     46     printf("已分配分区表Used:
    ");
     47     printf("	No.	proname	begin	size	status
    ");
     48     for(i = 0, x = 1; i < n; i++)
     49     {
     50         if(p[i].status=='u')
     51             printf("	No.%d	%s	%4d	%4d	%4c
    ", x++, p[i].pn, p[i].begin, p[i].size, p[i].status);
     52     }
     53 
     54     printf("
    
    =========================================================
    ");
     55 
     56     printf("内存使用情况:
    printf sorted by address:
    ");
     57     printf("	No.	proname	begin	size	status
    ");
     58     printf("	--------------------------------------
    ");
     59     for(i = 0, x = 1; i < n; i++)
     60     {
     61             printf("	No.%d	%s	%4d	%4d	%4c
    ", x++, p[i].pn, p[i].begin, p[i].size, p[i].status);
     62     }
     63 }
     64 
     65 void input()
     66 {
     67     int x = 1;
     68     while(x)
     69     {
     70         printf("
    
    请输入进程名称:");
     71         scanf("%s", &p[n].pn);
     72 
     73         for(int i = 0; i < n; i++)
     74         {    
     75             x = 0;
     76             if(strcmp(p[n].pn, p[i].pn) == 0)
     77             {
     78                 x = 1;
     79                 printf("进程名称已存在,请重新输入!");                
     80                 break;
     81             }
     82         }
     83     }
     84     x = 1;
     85     while(x)
     86     {
     87         printf("
    请输入进程需要的空间大小:");
     88         scanf("%d", &p[n].size);
     89 
     90         for(int i = 0; i < n; i++)
     91         {
     92             
     93             if(p[i].size >=p[n].size)
     94             {
     95                 x = 0;    
     96                 break;
     97             }
     98         }
     99         if(x)
    100             printf("找不到适合的空间,请重新输入!");
    101     }
    102 }
    103 
    104 void fenqu()
    105 {
    106     PART  temp[MAX];
    107     for(int i = 0;i < n; i++)
    108     {
    109         if(p[i].status=='f')
    110         {
    111             if(p[i].size >= p[n].size)
    112             {    
    113                 temp[0]=p[i];
    114                 p[i]=p[n];
    115                 p[n]=temp[0];
    116                 
    117                 p[i].end=p[n].begin+p[i].size;
    118                 p[i].status='u';
    119                 p[i].begin=p[n].begin;
    120                 p[n].begin=p[i].end;
    121                 p[n].end=temp[0].end;
    122                 p[n].status='f';
    123                 p[n].size=p[n].size-p[i].size;
    124                 n++;
    125                 break;
    126             }
    127 
    128         }
    129     }
    130 }
    131 
    132 
    133 void caculate(int i)
    134 {    
    135     int x=0;
    136     p[i].end = p[i].begin+p[i].size;
    137     p[i-1].end=p[i-1].begin+p[i-1].size;
    138     if(p[i+1].status=='f' && p[i].end==p[i+1].begin)
    139     {    x=1;
    140         p[i+1].begin=p[i].begin;
    141         p[i+1].size=p[i].size+p[i+1].size;
    142         for(int j=i;j<n;j++)
    143         {
    144             p[j]=p[j+1];
    145         }
    146             n=n-1;
    147     }
    148     if(p[i-1].status=='f' && p[i-1].end==p[i].begin)
    149     {    x=1;
    150         p[i].begin=p[i-1].begin;
    151         p[i].size=p[i-1].size+p[i].size;
    152         strcpy(p[i].pn, "-----");
    153         p[i].status = 'f';
    154         for(int k=i;k<n;k++)
    155         {
    156             p[k-1]=p[k];
    157         }
    158         n=n-1;
    159     }
    160     if(x==0)
    161     {
    162         strcpy(p[i].pn, "-----");
    163         p[i].status = 'f';
    164     }
    165 }
    166 
    167 void recycle()
    168 {
    169     char name[50];  
    170     int x = 1;
    171     while(x)
    172     {
    173         printf("
    请输入进程名称:");
    174         scanf("%s", &name);
    175         for(int i = 0; i < n; i++)
    176         {    
    177             if(strcmp(name, p[i].pn) == 0)
    178             {
    179                 x = 0;
    180                  caculate(i);                
    181                 break;
    182             }
    183         }
    184         if(x==1)
    185         {
    186             printf("没找到请重新输入
    ");
    187         }
    188         
    189     }
    190 }
    191 int main(void)
    192 {
    193     int choose1,choose2;    
    194     printf("初始化:设置内存总容量为 1024k
    系统从低地址部分开始占用 150k
    
    ");
    195 
    196     init();
    197     print();
    198     
    199     while(1)
    200     {
    201         printf("请选择:1.分配内存        2.回收内存        3.结束
    ");
    202         scanf("%d",&choose1);
    203         if(choose1==1)
    204         {
    205             input();
    206             fenqu();
    207             print();
    208         }
    209         if(choose1==2)
    210         {
    211             recycle();
    212             print();
    213         }
    214         if(choose1==3)
    215             break;        
    216     }        
    217     
    218     return 0;
    219 }

    运行结果:

    6、实验总结:

      今次实验让我学会了首次适应算法、循环首次适应算法、和最坏适应算法3种算法,让我明白了学习编程必须要思路清晰。

  • 相关阅读:
    我国大部分地区今晚将上演红色月全食美景[2007828]
    n阶汉诺塔问题(Hanoi)
    NBear中使用WhereClip表示in查询的问题
    web性能测试分析理论篇
    Net类库一览 转
    使用ASP.Net Forms模式实现WebService身份验证
    2005数据源的相关数据绑定
    单位分级,涵闸和人员绑定到树
    ajax,js文件中中文显示成乱码的问题
    WinFom应用程序数据操作技巧
  • 原文地址:https://www.cnblogs.com/hgf520/p/5534841.html
Copyright © 2020-2023  润新知