操作系統對內存申請與釋放(對連續的區域合並)的模擬
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 }