39,叶慧敏 实验四 主存空间的分配和回收模拟
一、 實驗目的
為了合理地分配和使用這些存儲空間,當用戶提出申請主存儲器空間時,存儲管理必須根據申請者的要求,按一定的策略分析主存空間和使用情況,找出足夠 的空閑區域給申請者。當作業撤離歸還主存資源時,則存儲管理要收回占用的主存空間。主存的分配和回收的實現是與主存儲器的管理方式有關的,通過本實驗幫助 我們理解在不同的存儲管理方式下應怎樣實現主存空間的分配和回收。
用高級語言完成一個主存空間的分配和回收模擬程序,以加深對內存分配方式及其算法的理解。
?
二、實驗內容和要求
2.1? 模擬包括3部分:
1)實現特定的內存分配算法
2)實現內存回收模擬
3)每種內存分配策略對應的碎片數統計
?
2.2? 固定分區存儲管理
假設內存容量為120KB,并且分別劃分成8,16,32,64KB大小的塊各一塊。
一個進程所需要的內存為0到100個KB。同時假設一個進程在運行過程中所需內存的大小不變。
模擬五個進程到達請求分配與運行完回收情況,輸出主存分配表.
?
2.3? 動態分區分配存儲管理
采用連續分配方式之動態分區分配存儲管理,使用首次適應算法、下次適應算法、最佳適應算法和最壞適應算法4種算法完成設計(任選兩種算法)。
(1)在程序運行過程,由用戶指定申請與釋放。
(2)設計一個已占用分區表,以保存某時刻主存空間占用情況。
(3)設計一個空閑分區表,以保存某時刻主存空間剩余情況。
(4)用兩個表的變化情況,反應各進程所需內存的申請與釋放情況。
?
三、實驗方法、步驟及結果測試
3.1 源程序名:1230.c
????? 可執行程序名:1230.exe
3.2 原理分析及流程圖
3.3 主要程序段及其解釋:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 const int CANUSE = 1; 5 const int CANTUSE = 0; 6 //#define MSIZE 128; 7 const int MSIZE = 128; 8 9 10 //內存分區 11 struct MZone 12 { 13 //空閑區起始地址 14 int begin_addr; 15 //一個連續空閑區的長度 16 int length; 17 //狀態 18 int state; 19 //內存中任務名 20 char task_name[32]; 21 //指向下一個空閑分區 22 struct MZone *next; 23 }; 24 25 //內存頭指針 26 struct MZone *Mhead = NULL; 27 28 //showmemory函數,顯示當前內存分配情況 29 void showmemory() 30 { 31 struct MZone *Mpoint = Mhead; 32 33 printf("內存的使用情況\n"); 34 printf("beginaddr\tlength\tstate\ttask\n"); 35 36 while( NULL!=Mpoint) 37 { 38 printf("%dk\t\t",Mpoint->begin_addr); 39 printf("%dk\t",Mpoint->length); 40 Mpoint->state?printf("CANUSE\t"):printf("CANTUSE\t"); 41 printf("%s\n",Mpoint->task_name); 42 Mpoint = Mpoint->next; 43 } 44 45 system("pause"); 46 47 } 48 49 //memoallocate函數,用于分配內存 50 void memoallocate(void) 51 { 52 struct MZone *Mnew = (struct MZone*)malloc(sizeof(struct MZone)); 53 printf("輸入要分配內存大小(kb):\n"); 54 scanf("%d",&Mnew->length); 55 printf("輸入任務名:\n"); 56 scanf("%s",&Mnew->task_name); 57 Minsert(Mnew)?printf("分配內存成功\n"):printf("沒有符合大小的空閑分區,內存分配失敗。\n"); 58 system("pause"); 59 free(Mnew); 60 } 61 62 //Minsert函數,功能插入任務到空閑分區 63 int Minsert(struct MZone* Mnew) 64 { 65 66 struct MZone *Zinsert = Mhead; 67 //flag用于指示是Zinsert到了NULL,既沒有內存可以分配 68 int flag = 1; 69 70 while( Zinsert->length<Mnew->length || !Zinsert->state) 71 { 72 if( NULL!=Zinsert->next ) 73 { 74 Zinsert = Zinsert->next; 75 } 76 else 77 { 78 Zinsert = Zinsert->next; 79 break; 80 } 81 82 } 83 84 if( NULL==Zinsert ) 85 { 86 return 0; 87 } 88 89 if( MSIZE == Zinsert->begin_addr+Mnew->length ) 90 { 91 Zinsert->state = CANTUSE; 92 strcpy(Zinsert->task_name , Mnew->task_name); 93 Zinsert->next = NULL; 94 return 1; 95 } 96 else 97 { 98 struct MZone *Ztail = (struct MZone *)malloc(sizeof(struct MZone)); 99 Zinsert->state = CANTUSE; 100 strcpy(Zinsert->task_name , Mnew->task_name); 101 Zinsert->length = Mnew->length; 102 Zinsert->next = Ztail; 103 104 memset( Ztail, 0, sizeof(char)*32 ); 105 Ztail->begin_addr = Zinsert->begin_addr + Mnew->length; 106 Ztail->state = CANUSE; 107 Ztail->length = MSIZE - Ztail->begin_addr; 108 Ztail->next = NULL; 109 110 return 1; 111 } 112 } 113 114 //memoreturn函數,用于回收內存 115 void memoreturn(void) 116 { 117 char tname[32]; 118 printf("輸入要收回的任務名\n"); 119 scanf("%s",tname); 120 Mreturn(tname); 121 system("pause"); 122 } 123 124 //Mreturn函數,功能回收內存 125 int Mreturn(char taskname[]) 126 { 127 struct MZone *front = NULL; 128 struct MZone *position = Mhead; 129 struct MZone *tail = Mhead->next; 130 131 while( 0!=strcmp(position->task_name,taskname) ) 132 { 133 front = position; 134 if( NULL!=position->next ) 135 { 136 position = position->next; 137 } 138 else 139 { 140 position = NULL; 141 break; 142 } 143 tail = position->next; 144 } 145 146 if( NULL==position ) 147 { 148 printf("內存中沒有此任務!"); 149 } 150 else 151 { 152 //不能用CANTUSE 153 if( NULL!=tail&&NULL!=front ) 154 { 155 156 if( front->state&&tail->state ) 157 { 158 front->length = front->length + position->length + tail->length; 159 front->next = tail->next; 160 free(position); 161 free(tail); 162 } 163 else if( front->state&&!tail->state ) 164 { 165 front->length = front->length + position->length; 166 front->next = position->next; 167 free(position); 168 } 169 else if( !front->state&&tail->state ) 170 { 171 position->length = position->length + tail->length; 172 memset( position->task_name, 0, sizeof(char)*32 ); 173 position->next = tail->next; 174 position->state = CANUSE; 175 free(tail); 176 } 177 else if( !front->state&&!tail->state ) 178 { 179 memset( position->task_name, 0, sizeof(char)*32 ); 180 position->state = CANUSE; 181 } 182 } 183 else if( NULL!=tail&&NULL==front ) 184 { 185 if( !tail->state ) 186 { 187 memset( position->task_name, 0, sizeof(char)*32 ); 188 position->state = CANUSE; 189 } 190 else 191 { 192 position->length = position->length + tail->length; 193 position->next = NULL; 194 free(tail); 195 } 196 } 197 else if( NULL==tail&&NULL!=front ) 198 { 199 if(front->state) 200 { 201 front->length = front->length + position->length; 202 front->next = NULL; 203 free(position); 204 } 205 else 206 { 207 memset( position->task_name, 0, sizeof(char)*32 ); 208 position->state = CANUSE; 209 } 210 } 211 else if( NULL==tail&&NULL==front ) 212 { 213 memset( position->task_name, 0, sizeof(char)*32 ); 214 position->state = CANUSE; 215 } 216 printf("內存回收成功!\n"); 217 } 218 } 219 220 int main(void) 221 { 222 int func_ = 0; 223 224 //初始化Mhead 225 Mhead = (struct MZone*)malloc(sizeof(struct MZone)); 226 Mhead->begin_addr = 0; 227 Mhead->length = MSIZE; 228 Mhead->state = CANUSE; 229 memset(Mhead->task_name, 0, sizeof(char)*32 ); 230 Mhead->next = NULL; 231 232 while( 1 ) 233 { 234 printf("******************首次適應算法實現主存分配和回收系統(內存)***************\n"); 235 printf("1:查看內存分配情況\n"); 236 printf("2:申請分配內存\n"); 237 printf("3:申請回收內存\n"); 238 printf("4:退出程序\n"); 239 printf("~~~~~~~~~~~~~~~~~"); 240 scanf("%d",&func_); 241 switch( func_ ) 242 { 243 case 1 :showmemory();break; 244 case 2 :memoallocate();break; 245 case 3 :memoreturn();break; 246 case 4 :return 1; 247 } 248 system("cls"); 249 } 250 }四、 實驗總結
?
轉載于:https://www.cnblogs.com/1994-ann/p/5089979.html
總結
以上是生活随笔為你收集整理的39,叶慧敏 实验四 主存空间的分配和回收模拟的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 带你飞过PMP—备考上篇•乖乖看书就对了
- 下一篇: 在Prezi中输入简体中文的完美解决方案