zoukankan      html  css  js  c++  java
  • 主存空间的分配与回收

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

    专业:商业软件工程   姓名:杨晓霞  学号:201406114107

    一、        实验目的

    用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方式及其算法的理解。

    二、        实验内容和要求

    采用连续分配方式之动态分区分配存储管理,使用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法4种算法完成设计。

    (1)**设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。采用分区说明表进行。

    (2)或在程序运行过程,由用户指定申请与释放。

    (3)设计一个空闲区说明表,以保存某时刻主存空间占用情况。

    把空闲区说明表的变化情况以及各作业的申请、释放情况显示。

     

    三、        实验方法、步骤及结果测试

    1.源程序名:Allocation.cpp

    2.      原理分析及流程图

     (1)、存储结构

    1 struct partition 
    2 {   
    3     int end;//结束地址   
    4     char pn;//工作名  
    5     int size;//工作空间  
    6     int begin;//开始地址  
    7     char state;//状态 1 可用 0 已用 
    8 };  //主存表的初始化 
    9 partition PART[100];

    (2)、主要程序

     1 void begin(); 
     2 int kongjian(); 
     3 int pdname(char c);
     4 void print(); 
     5 void fenpei();  
     6 int ShouCi(char c,int i); 
     7 void reclaim();  
     8 int huishou(char c);  
     9 int zuijia(char c,int i); 
    10 int zuihuai(char c,int i); 

    3.主要程序段及其解释:

      1 void print() /* 显示分区 */
      2 {
      3     int i;
      4     int n;
      5     printf("
    ================================================================" );
      6     printf("
    已分配分区表Used:" );
      7     printf("
    	No.	proname	begin	size	end	state");
      8     printf("
    	------------------------------------------------" );
      9     n = 1;
     10     for (i=0;i<MAX;i++)
     11     {
     12         if (PART[i].state=='-')
     13             break;
     14         if (PART[i].state=='u')
     15         {
     16             printf("
    	No.%d",n);
     17             Output(i);
     18             n++;
     19         }
     20     }
     21     printf("
    ");
     22     printf("
    ================================================================");
     23     printf("
    空闲分区表Free:" );
     24     printf("
    	No.	proname	begin	size	end	state" );
     25     printf("
    	------------------------------------------------");
     26     n = 1;
     27     for (i=0; i<MAX; i++)
     28     {
     29         if (PART[i].state=='-')
     30             break;
     31         if (PART[i].state=='f')
     32         {
     33             printf("
    	No.%d",n);
     34             Output(i);
     35             n++;
     36         }
     37     }
     38     printf("
    ");
     39     printf("
    ");
     40     printf("
    ================================================================");
     41     printf("
    内存使用情况,按起始址增长的排:");
     42     printf("
    printf sorted by address:");
     43     printf("
    	No.	proname	begin	size	end	state");
     44     printf("
    	------------------------------------------------
    ");
     45 //    print();
     46      n = 1;
     47     for (i=0;i<MAX;i++)
     48     {
     49         if (PART[i].state=='-')
     50             break;
     51         printf("
    	No.%d",n);
     52         Output(i);
     53         n++;
     54     }
     55     getch();
     56     
     57 }
     58 
     59 //主存分配各函数 
     60 void fenpei() 
     61 {  
     62     char name; 
     63     
     64     int size;  
     65     int c=1;   
     66     printf("请输入工作名:
    ");  
     67     scanf("%s",&name);   
     68     printf("请分配空间:
    ");  
     69     scanf("%d",&size);   
     70     if(pdname(name))  
     71     {    
     72         printf("请选择要选的算法 1:首次适应算法 2:最佳适应算法:3:最坏适应算法
    ");     
     73         scanf("%d",&c);   
     74         if(c!=1&&c!=2&&c!=3&&c!=4)   
     75         {     
     76             c=1;  
     77         }       
     78         switch(c)   
     79         {       
     80         case 1:         
     81             ShouCi(name,size);
     82             break;      
     83         case 2:           
     84             zuijia(name,size);
     85             break;   
     86         case 3:     
     87             zuihuai(name,size);
     88             break;   
     89         }  
     90     } 
     91 }  
     92 //分配主存首次适应  
     93 int ShouCi(char name,int size)
     94 {           
     95     for(int i=0;i<6;i++)   
     96     {         
     97         if(PART[i].size>=size&&PART[i].state=='f')    
     98         {      
     99             int temp=PART[i].size;     
    100             int sum=PART[i+1].begin;         
    101             PART[i].size=size;           
    102             PART[i].pn=name;            
    103             PART[i].begin=PART[i-1].begin+PART[i-1].size;            
    104             PART[i+1].begin=PART[i].begin+PART[i].size;
    105             PART[i].state='u'; 
    106             
    107                 if(temp>size)//将i项分成两项     
    108                 {       
    109                     for(int j=100;j>i+1;j--)      
    110                     {        
    111                         PART[j].begin=PART[j-1].begin;       
    112                         PART[j].state=PART[j-1].state;         
    113                         PART[j].pn=PART[j-1].pn;        
    114                         PART[j].size=PART[j-1].size;       
    115                     }        
    116                     PART[i+2].begin=sum;      
    117                     PART[i+1].state='f';       
    118                     PART[i+1].pn=NULL;       
    119                     PART[i+1].size=temp-size;     
    120                 }  
    121             printf("成功分配!
    ");
    122         
    123             for(int j=i;j<6;j++)          
    124                 if(PART[j].state=='f'&&PART[j+1].state=='f'&&PART[j+2].state =='f')//查找以后表 条件为3个连续空闲的空间 则视为以后都空闲      
    125                 {           
    126                     PART[j].size=kongjian();//将剩余空间放入j中      
    127                 }        
    128                 return 1;
    129         }   
    130     }       
    131     if(i=6)   
    132     {       
    133         printf("主存空间已满!
    ");      
    134         return 0;   
    135     }     
    136     return 0; 
    137 } 
    138 //回收工作各函数 
    139 void reclaim() 
    140 {   
    141     char name;   
    142     printf("请输入需要回收的工作名:
    ");  
    143     scanf("%s",&name);   
    144     huishou(name); 
    145 }  
    146 //回收工作  
    147 int huishou(char name) 
    148 {   
    149     int j; 
    150     //查找要回收的工作  
    151     for(int i=0;i<6;i++)  
    152     {    
    153         if(PART[i].pn ==name)   
    154         {     
    155             printf("你要回收的工作已找到
    ");    
    156             break;   
    157         }  
    158     }   
    159     if(i==6)  
    160     {    
    161         printf("对不起 没有找到你要回收的工作
    ");   
    162         return 0;  
    163     }   
    164     int n=i;//第n个工作需要回收     
    165     //回收工作4种情况   
    166     if(i==0&&PART[1].state =='f')  
    167     {         
    168         PART[0].begin=0;     
    169         PART[0].state='f';      
    170         PART[0].pn=NULL;      
    171         PART[0].size=PART[0].size +PART[1].size;     
    172         for(i=1;i<MAX;i++)     
    173         {        
    174             PART[i].begin=PART[i+1].begin;     
    175             PART[i].state=PART[i+1].state;      
    176             PART[i].pn=PART[i+1].pn;     
    177             PART[i].size=PART[i+1].size;      
    178         }  
    179     }   
    180     else if(PART[n-1].state=='f'&&PART[n+1].state=='u')//上有空  
    181     {   
    182         PART[n-1].size=PART[n-1].size+PART[n].size;   
    183         for(j=n;j<MAX-1;j++)   
    184         {     
    185             PART[j].begin=PART[j+1].begin;     
    186             PART[j].state=PART[j+1].state;      
    187             PART[j].pn=PART[j+1].pn;     
    188             PART[j].size=PART[j+1].size;    
    189         }  
    190     }   
    191     else if(PART[n-1].state=='u'&&PART[n+1].state=='f')//下有空  
    192     {    
    193         PART[n].size=PART[n].size +PART[n+1].size;
    194         PART[n].pn=NULL;   
    195         PART[n].state='f';   
    196         for(j=n+1;j<MAX-1;j++)   
    197         {     
    198             PART[j].begin=PART[j+1].begin;     
    199             PART[j].state=PART[j+1].state;      
    200             PART[j].pn=PART[j+1].pn;     
    201             PART[j].size=PART[j+1].size;    
    202         }  
    203     }   
    204     else if(PART[n-1].state=='f'&&PART[n+1].state=='f')//上下都为空  
    205     {    
    206         PART[n-1].size=PART[n-1].size +PART[n].size +PART[n+1].size;   
    207         for(j=n;j<MAX-2;j++)   
    208         {    
    209             PART[j].begin=PART[j+2].begin;     
    210             PART[j].state=PART[j+2].state;      
    211             PART[j].pn=PART[j+2].pn;     
    212             PART[j].size=PART[j+2].size;    
    213         }  
    214     }   
    215     else //上下不为空 直接回收  
    216     {    
    217         PART[n].state='f';    
    218         PART[n].pn=NULL;  
    219     }      
    220     return 1; 
    221 }  
    222 //最佳适应分配算法  
    223 int zuijia(char name,int size) 
    224 {   
    225     //查找一个大于size的空闲空间,将此空间的end存入id,size存入min     
    226     int min=50;  
    227     int id=-1;      
    228     for(int i=0;i<6;i++)  
    229     {    
    230         if(PART[i].state=='f'&&PART[i].size<min&&PART[i].size>size)   
    231         {     
    232             id=i;     
    233             min=PART[i].size;   
    234         }  
    235     }   
    236     printf("最佳适应空间的id:%d",id+1);
    237         printf("空间大小:%d
    ",min);  
    238     //将作业存入PART[i]项   
    239     int temp=PART[id].size-size;   
    240     if(temp==0)//空闲空间大小恰好等于申请空间大小直接存入  
    241     { 
    242         PART[i].pn=name;   
    243         PART[i].state='u';  
    244     }   
    245     else if(temp>0)//空闲空区大于申请空间,需要将空闲分区分割  
    246     {    
    247         PART[id].pn=name;   
    248         PART[id].size=size;         
    249         PART[id].state='u';    
    250         for(int j=100;j>id+1;j--)   
    251         {     
    252             PART[j].begin=PART[j-1].begin;    
    253             PART[j].state=PART[j-1].state;      
    254             PART[j].pn=PART[j-1].pn;     
    255             PART[j].size=PART[j-1].size;    
    256         }           
    257         PART[id+1].begin=PART[id].begin +PART[id].size;    
    258         PART[id+1].state='f';    
    259         PART[id+1].size=temp;   
    260         PART[id+1].pn=NULL;  
    261     }   
    262     return 0; 
    263 }  
    264 int zuihuai(char name,int size) 
    265 {   //查找一个大于size的空闲空间,将此空间的end存入id,size存入max     
    266     int max=size;  
    267     int id=-1;      
    268     for(int i=0;i<6;i++)  
    269     {    
    270         if(PART[i].state=='f'&&PART[i].size >max)   
    271         {     
    272             id=i;     
    273             max=PART[i].size;   
    274         }  
    275     }   
    276     printf("最坏适应空间的id:%d",id+1);
    277     printf("空间大小:%d
    ",max);  
    278     //将作业存入PART[i]项   
    279     int temp=PART[id].size -size;   
    280     if(temp==0)//空闲空间大小恰好等于申请空间大小直接存入  
    281     {    
    282         PART[i].pn=name;  
    283         PART[i].state='u';  
    284     }   
    285     else if(temp>0)//空闲空区大于申请空间,需要将空闲分区分割 
    286     {    
    287         PART[id].pn=name;   
    288         PART[id].size=size;         
    289         PART[id].state='u';    
    290         for(int j=100;j>id+1;j--)   
    291         {     
    292             PART[j].begin=PART[j-1].begin;    
    293             PART[j].state=PART[j-1].state;      
    294             PART[j].pn=PART[j-1].pn;     
    295             PART[j].size=PART[j-1].size;    
    296         }           
    297         PART[id+1].begin=PART[id].begin+PART[id].size;    
    298         PART[id+1].state='f';    
    299         PART[id+1].size=temp;   
    300         PART[id+1].pn=NULL;  
    301     }   
    302     return 0; 
    303 }

     

    4. 运行结果及分析

     

     

     

    四、实验总结

     算法的主要内容大概还是了解,但是编程能力还是很差,不懂得如何转化编程语言,在这过程中参考过不少代码,也改过不少的代码,但本次算法还是有点缺陷,固定分区,碎片没能解决。通过检查,把初始化的空闲分区合起来

  • 相关阅读:
    利用ganymed-ssh2远程执行其它Linux机器上的shell命令
    ZooKeeper 笔记(4) 实战应用之【消除单点故障】
    ZooKeeper 笔记(3) 实战应用之【统一配置管理】
    ZooKeeper 笔记(2) 监听数据变化
    ZooKeeper 笔记(1) 安装部署及hello world
    intellij idea 高级用法之:集成JIRA、UML类图插件、集成SSH、集成FTP、Database管理
    hadoop: hive 1.2.0 在mac机上的安装与配置
    mac 下卸载mysql的方法
    mac OS X Yosemite 上编译hadoop 2.6.0/2.7.0及TEZ 0.5.2/0.7.0 注意事项
    hadoop: hbase1.0.1.1 伪分布安装
  • 原文地址:https://www.cnblogs.com/xiaochenxi/p/5593946.html
Copyright © 2011-2022 走看看