實驗一、主存空間的配置設定和回收實驗
專業:商業軟體工程 姓名:楊晶晶 學号: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) 最壞适應算法
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種算法的運用,不過還不是很熟悉