天天看點

【作業系統】主存空間的配置設定和回收

實驗一、主存空間的配置設定和回收實驗

專業:商業軟體工程  姓名:楊晶晶  學号:201406114102

一、        實驗目的

用進階語言完成一個主存空間的配置設定和回收程式,以加深對動态分區配置設定方式及其算法的了解。

二、        實驗内容和要求

實驗内容

根據指定的實驗課題,完成設計、編碼和調試工作,完成實驗報告。

實驗要求

采用連續配置設定方式之動态分區配置設定存儲管理,使用首次适應算法、循環首次适應算法、最佳适應算法和最壞适應算法4種算法完成設計。

(1)**設計一個作業申請隊列以及作業完成後的釋放順序,實作主存的配置設定和回收。采用分區說明表進行。

(2)或在程式運作過程,由使用者指定申請與釋放。

(3)設計一個空閑區說明表,以儲存某時刻主存空間占用情況。

把空閑區說明表的變化情況以及各作業的申請、釋放情況顯示。

三、        實驗方法、步驟及結果測試

1.      源程式名:4.c

可執行程式名:4.exe

2.      原理分析及流程圖

主要總體設計問題。

參考資料結構:

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

完成程式資料結構的建立,初始化記憶體配置設定情況,建立空閑分區表和已配置設定分區表。

【作業系統】主存空間的配置設定和回收

第二步:(第14周完成)

完成為某作業配置設定記憶體空間。

  1. 使用者輸入作業名稱;
  2. 判斷作業名稱是否已經存在,如果存在則要求使用者重新輸入;
  3. 使用者輸入作業所占空間大小;
  4. 判斷是否能夠在剩餘的空閑區域中找到一塊放置該作業,如果不行則要求使用者重新輸入;
  5. 顯示菜單,由使用者選擇使用哪一種配置設定算法:

1)        首次适應算法

2)        循環首次适應算法

3)        最佳适應算法

4)        最壞适應算法

     6.為該作業配置設定記憶體空間,配置設定處理流程圖如下(size的值設定為1K):

【作業系統】主存空間的配置設定和回收

     7.螢幕顯示配置設定後的記憶體分區情況。

3.      主要程式段及其解釋:

1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<string.h>
  4 typedef struct process
  5 {
  6     int number;
  7     char name[20];
  8     int begin;
  9     int size;
 10     char status;
 11 }Pro;
 12 main()
 13 {
 14     int sys=1024;
 15     char s;
 16     int i=0;
 17     int choice;
 18     int count1=0;
 19     int count2=0;
 20     int flag=1;
 21     char j[10];
 22     Pro a[10];
 23     strcpy(a[0].name,"system");//a[0]是系統程序
 24     a[0].begin=0;
 25     a[0].size=100;
 26     a[0].status='f';
 27     
 28     printf("初始化,設記憶體總容量為%dK\n",sys);
 29     printf("系統從低位址部分開始使用,占用%dK\n\n",a[0].size);
 30     
 31     printf("空閑區表Free:\n");
 32     printf("\tNO.\t proname\tbegin\t size\t status\n");
 33     printf("\tNO.1\t -----\t\t %d\t %d\t  f\n\n",a[0].size,sys-a[0].size);
 34     
 35     printf("==============================================\n");
 36     printf("已配置設定分區表::\n");
 37     printf("\tNO.\t proname\tbegin\t size\t status\n");
 38     printf("\tNO.1\t %s\t\t %d\t %d\t  %c\n",a[0].name,a[0].begin,a[0].size,a[0].status);
 39     printf("\n\n");
 40     
 41     printf("記憶體使用情況,按起始增長的排序:\n");
 42     printf("printf sorted by address::\n");
 43     printf("\tNO.\t proname\tbegin\t size\t status\n");
 44     printf("\t---------------------------------------------\n");
 45     printf("\tNO.1\t %s\t\t %d\t %d\t  u\n",a[0].name,a[0].begin,a[0].size);
 46     printf("\tNO.2\t -----\t\t %d\t %d\t  f\n\n",a[0].size,sys-a[0].size);
 47     
 48     printf("\n\n");
 49     i=1;
 50     while (1)
 51     {
 52         printf("請選擇:配置設定a 回收r 退出e\n");
 53         scanf("%s",&s);
 54         switch (s)
 55         {
 56         case 'a':
 57             printf("請輸入程序名:");
 58             scanf("%s",&a[i].name);
 59             printf("請輸入程序大小:");
 60             scanf("%d",&a[i].size);
 61             a[1].begin=100;
 62             a[i].status='u';
 63             flag++;   //目前的程序數
 64             
 65             printf("插入完成!\n");
 66             printf("空閑區表Free:\n");
 67             printf("\tNO.\t proname\tbegin\t size\t status\n");
 68             for (i=0;i<flag;i++)
 69             { 
 70                 a[i+1].begin=a[i].begin+a[i].size;
 71                 count1=a[i+1].begin;
 72                 count2=sys-count1;
 73             }
 74             printf("\tNO.1\t -----\t\t %d\t %d\t  f\n\n",count1,count2);
 75             a[0].status='u';
 76             printf("==============================================\n");
 77             printf("已配置設定分區表:\n");
 78             printf("\tNO.\t proname\tbegin\t size\t status\n");
 79             for(i=0;i<flag;i++)
 80             {
 81                 a[i+1].begin=a[i].begin+a[i].size;
 82                 printf("\tNO.%d\t %s\t\t %d\t %d\t  %c\n",i+1,a[i].name,a[i].begin,a[i].size,a[i].status);
 83             }
 84             printf("\n\n");
 85             
 86             printf("記憶體使用情況,按起始增長的排序:\n");
 87             printf("printf sorted by address:\n");
 88             printf("\tNO.\t proname\tbegin\t size\t status\n");
 89             printf("\t--------------------------------------------\n");
 90             for (i=0;i<flag;i++)
 91             {
 92                 printf("\tNO.%d\t %s\t\t %d\t %d\t  %c\n",i+1,a[i].name,a[i].begin,a[i].size,a[i].status);
 93             }
 94             printf("\tNO.%d\t -----\t\t %d\t %d\t  f\n\n",flag+1,count1,count2);
 95             break;
 96         case 'r':
 97             printf("輸入程序名:");
 98             scanf("%s",&j);
 99             printf("回收成功!\n");
100             for (i=0;i<flag;i++)
101             {
102                 if (strcmp(j,a[i].name)==0)
103                 {
104                     strcpy(a[i].name,"-----");
105                     a[i].status='f';
106                 }
107             }
108             printf("空閑區表Free:\n");
109             printf("\tNO.\t proname\tbegin\t size\t status\n");
110             for (i=0;i<flag;i++)
111             {
112                 if (a[i].status=='f'){
113                     printf("\tNO.%d\t %s\t\t %d\t %d\t  %c\n",i,a[i].name,a[i].begin,a[i].size,a[i].status);}
114             }
115             printf("\tNO.%d\t -----\t\t %d\t %d\t  f\n\n",flag-1,count1,count2);
116             
117             printf("==============================================\n");
118             printf("已配置設定分區表::\n");
119             printf("\tNO.\t proname\tbegin\t size\t status\n");
120             for(i=0;i<flag;i++)
121             {
122                 if (a[i].status=='u'){
123                     printf("\tNO.%d\t %s\t\t %d\t %d\t  %c\n",i,a[i].name,a[i].begin,a[i].size,a[i].status);}
124             }
125             printf("\n\n");
126             
127             printf("記憶體使用情況,按起始增長的排序:\n");
128             printf("printf sorted by address:\n");
129             printf("\tNO.\t proname\tbegin\t size\t status\n");
130             printf("\t--------------------------------------------\n");
131             for (i=0;i<flag;i++)
132             {
133                 printf("\tNO.%d\t %s\t\t %d\t %d\t  %c\n",i+1,a[i].name,a[i].begin,a[i].size,a[i].status);
134             }
135             printf("\tNO.%d\t -----\t\t %d\t %d\t  f\n\n",flag+1,count1,count2);
136             break;
137         case 'e':
138             exit(0);
139             break;
140         }
141         if(sys-a[0].size<a[i].size)
142         {
143             printf("找不到空閑區域放置該作業,請重新輸入:\n");
144             
145             
146         }
147     }
148     printf("\n\n請選擇以下其中一種配置設定算法:1/2/3/4  \n");
149     printf("1、首次适應算法\n");
150     printf("2、循環首次适應算法\n");
151     printf("3、最佳适應算法\n");
152     printf("4、最壞适應算法\n");
153     scanf("%d",&choice);
154     switch(choice)
155     {
156     case 1:
157         
158         break;
159         
160     }
161     
162 }      

4.      運作結果及分析

【作業系統】主存空間的配置設定和回收
【作業系統】主存空間的配置設定和回收
【作業系統】主存空間的配置設定和回收
【作業系統】主存空間的配置設定和回收

四、        實驗總結

 通過本次實驗,學會了怎麼對作業進行配置設定,了解了首次适應算法、循環首次适應算法、最佳适應算法和最壞适應算法4種算法的運用,不過還不是很熟悉