操作系统对内存申请与释放(对连续的区域合并)的模拟

1 #include <stdio.h>
2 #include <stdlib.h>
3 #define N 10 //预设的内碎片的最小值
4 #define M_set 1024//预设的内存大小
5
6 struct mem_block
7 {
8 int num;
9 int addr;
10 int length;
11 mem_block *next;
12 };
13 typedef mem_block* point;
14
15 int numcal_M=1;//内存id
16 int numcal_P=1;//进程id
17
18 void create(point &pHead);
19 void init_get_size(point pHead);
20 void insert_P(point pHead,int addr,int siz);
21 void sort_size(point &pHead);//small to big
22 void sort_addr(point &pHead);
23 void apply(point M_pHead,point P_pHead);
24 void chick_conn(point pHead);
25 void insert_M(point pHead,int addr,int siz);
26 void free(point P_pHead,point M_pHead);
27 void print(point pHead);
28 void destory(point pHead);
29 int main()
30 {
31 printf(" *********************************************\n");
32 printf(" ** 内存管理系统 (最佳适应算法) **\n");
33 printf(" *********************************************\n");
34 point mem;
35 create(mem);
36 init_get_size(mem);
37
38 point prog;
39 create(prog);
40
41 int op=-1;
42 while(1)
43 {
44 printf("\n\n请输入要进行的操作:\n1.申请内存 2.释放内存 3.显示当前内存情况 4.显示被申请走的内存块 0.退出操作\n");
45 scanf("%d",&op);
46 switch(op)
47 {
48 case 1:
49 apply(mem,prog);
50 break;
51 case 2:
52 free(prog,mem);
53 break;
54 case 3:
55 sort_addr(prog);
56 printf("内存号 起始地址 内存大小\n");
57 print(mem);
58 break;
59 case 4:
60 printf("进程号 起始地址 内存大小\n");
61 print(prog);
62 break;
63 case 0:
64 destory(mem);
65 destory(prog);
66 exit(0);
67 default:
68 printf("非法操作\n");
69 break;
70 }
71 }
72 return 0;
73 }
74 void create(point &pHead)
75 {
76 pHead = (point)malloc(sizeof(mem_block));
77 pHead ->num=0;
78 pHead->addr=0;
79 pHead->length = 0;
80 pHead->next=NULL;
81 return;
82 }
83
84 void insert_P(point pHead,int addr,int siz)
85 {
86 point pPro=(point)malloc(sizeof(mem_block));
87 pPro->length=siz;
88 pPro->addr=addr;
89 pPro->next=NULL;
90 pPro->num=numcal_P;
91 numcal_P++;
92
93 point pCur = pHead;
94 while(pCur->next!=NULL)
95 pCur=pCur->next;
96 pCur->next=pPro;
97 return;
98 }
99 void sort_size(point &pHead)//small to big
100 {
101 point pCur_i=pHead,pCur_j;
102 int num,addr,siz;
103 while(pCur_i->next!=NULL)
104 {
105 pCur_i=pCur_i->next;
106 pCur_j=pCur_i;
107 while(pCur_j->next!=NULL)
108 {
109 pCur_j=pCur_j->next;
110 if(pCur_j->length < pCur_i->length)
111 {
112 num=pCur_i->num;
113 addr=pCur_i->addr;
114 siz=pCur_i->length;
115
116 pCur_i->num=pCur_j->num;
117 pCur_i->addr=pCur_j->addr;
118 pCur_i->length=pCur_j->length;
119
120 pCur_j->num=num;
121 pCur_j->addr=addr;
122 pCur_j->length=siz;
123 }
124 }
125 }
126 }
127 void sort_addr(point &pHead)
128 {
129 point pCur_i=pHead,pCur_j;
130 int num,addr,siz;
131 while(pCur_i->next!=NULL)
132 {
133 pCur_i=pCur_i->next;
134 pCur_j=pCur_i;
135 while(pCur_j->next!=NULL)
136 {
137 pCur_j=pCur_j->next;
138 if(pCur_j->addr < pCur_i->addr)
139 {
140 num=pCur_i->num;
141 addr=pCur_i->addr;
142 siz=pCur_i->length;
143
144 pCur_i->num=pCur_j->num;
145 pCur_i->addr=pCur_j->addr;
146 pCur_i->length=pCur_j->length;
147
148 pCur_j->num=num;
149 pCur_j->addr=addr;
150 pCur_j->length=siz;
151 }
152 }
153 }
154 }
155 void apply(point M_pHead,point P_pHead)
156 {
157 sort_size(M_pHead);
158 int siz;
159 printf("请输入要申请内存的大小\n");
160 scanf("%d",&siz);
161 point pCur=M_pHead;
162 int flag=1;
163 while(pCur->next!=NULL)
164 {
165
166 if(pCur->next->length-siz<=N&&pCur->next->length>=siz)
167 {
168 insert_P(P_pHead,pCur->next->addr,pCur->next->length);
169 pCur->next=pCur->next->next;
170
171 flag=0;
172 break;
173 }
174 else if(pCur->next->length-siz>N)
175 {
176
177 insert_P(P_pHead,pCur->next->addr,siz);
178 pCur->next->length-=siz;
179 pCur->next->addr+=siz;
180 flag=0;
181 break;
182 }
183 pCur=pCur->next;
184 }
185 if(flag) printf("哪有那么大的空间呀,插不进去\n");
186 else printf("分配成功\n");
187 return;
188
189 }
190
191 void init_get_size(point pHead)
192 {
193 point pPro=(point)malloc(sizeof(mem_block));
194
195 pPro->length=M_set;
196 pPro->addr=0;
197 pPro->next=NULL;
198 pPro->num=numcal_M;
199
200 numcal_M++;
201 pHead->next=pPro;
202 return;
203 }
204 void chick_conn(point pHead)
205 {
206 point i,j;
207 for(i=pHead;i->next!=NULL;i=i->next)
208 for(j=pHead;j->next!=NULL;j=j->next)
209 {
210 if( (j->next->addr) == (i->next->addr) + (i->next->length) )
211 {
212 i->next->length+=j->next->length;
213 j->next=j->next->next;
214 break;
215 }
216 }
217 return;
218 }
219
220 void insert_M(point pHead,int addr,int siz)
221 {
222
223 point pCur=pHead;
224 int flag=0;
225 while(pCur->next!=NULL)
226 {
227 if(pCur->next->addr+pCur->next->length==addr)
228 {
229 flag=1;
230 pCur->next->length+=siz;
231 break;
232 }
233 pCur=pCur->next;
234 }
235 if(!flag)
236 {
237 point pPro=(point)malloc(sizeof(mem_block));
238 pPro->length=siz;
239 pPro->addr=addr;
240 pPro->next=NULL;
241 pPro->num=numcal_M;
242 numcal_M++;
243
244 pCur->next=pPro;
245
246 }
247
248 chick_conn(pHead);
249 printf("释放成功\n");
250 return;
251 }
252 void free(point P_pHead,point M_pHead)
253 {
254 int prog_num =0;
255 printf("请输入要释放的内存块号\n");
256 scanf("%d",&prog_num);
257 point pCur = P_pHead;
258 int flag=1;
259 while(pCur->next!=NULL)
260 {
261 if(pCur->next->num==prog_num)
262 {
263 flag=0;
264 insert_M(M_pHead,pCur->next->addr,pCur->next->length);
265 pCur->next=pCur->next->next;
266 break;
267 }
268 pCur=pCur->next;
269 }
270 if(flag)
271 printf("亲,这个内存号不存在呀,要不你先按4,看看情况?\n");
272 }
273 void print(point pHead)
274 {
275 int flg=0;
276 point pCur=pHead;
277 while(pCur->next!=NULL)
278 {
279 pCur=pCur->next;
280 printf("%3d%12d%15d\n",pCur->num,pCur->addr,pCur->length);
281 flg=1;
282 }
283 if(!flg)
284 printf("\n\n 空链表,没有数据 \n");
285 printf("\n");
286 return;
287 }
288 void destory(point pHead)
289 {
290 point pNext=pHead->next;
291 while(pHead->next!=NULL)
292 {
293 free(pHead);
294 pHead=pNext;
295 pNext=pHead->next;
296 }
297 free(pHead);
298 pHead = NULL;
299 printf("撤销成功\n");
300 }

本文介绍了一个使用C语言实现的内存管理模拟程序,通过最佳适应算法来处理内存的申请和释放,包括内存块的插入、排序、合并等操作。

被折叠的 条评论
为什么被折叠?



