今天早上做了操作系統實驗:
1、閱讀理解兩個例程,掌握例程的運作流程。
2、連續式分配例程中提供了三種分配算法:首次適應、循環首次適應、最佳適應。例程還缺少分配作業和回收作業的功能。請至少實現一種分配算法并完成分配作業的功能,保證該例程能夠正確實現分配作業的功能
3、回收作業的功能屬于選做部分。
4、分頁管理例程缺少分配作業和回收的功能,請實現這兩個功能,保證該例程能夠正確實現分頁管理的分配與回收功能
5、上述要求2和4,必須完成其中一個。
?
連續式分配代碼貼上:
?
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include < string .h> 4 #include <time.h> 5 6 #define ret printf("\n") 7 #define spa printf(" ") 8 #define hli printf("-") 9 #define vli printf(" |") 10 #define tab printf("\t") 11 #define capacity 1024 // 內存總大小 12 #define max 100 // 數組最大長度 13 #define jobsum 8 // 作業總數量 14 15 16 17 void _sleep( int n){ 18 clock_t goal; 19 goal = (clock_t)n * CLOCKS_PER_SEC + clock(); 20 while (goal > clock()); 21 } 22 23 char _keygo(){ // 按任意鍵繼續 24 char c; 25 printf( " Please touch any key to continue....\n " ); 26 c = getchar(); 27 return c; 28 } 29 30 typedef struct job JOB; 31 struct job { // 作業結構體 32 int jobid; // 作業ID,系統做東分配,無需輸入 33 char name[ 20 ]; // 作業名稱 34 int vol; // 作業大小,即要申請的內存空間大小 35 }; 36 37 JOB jobdata[jobsum] = { // 作業隊列 38 { 8100 , " System " , 50 }, 39 { 8101 , " QianQian " , 32 }, 40 { 8102 , " XunLei " , 128 }, 41 { 8103 , " Dictionary " , 76 }, 42 { 8104 , " NorDun " , 86 }, 43 { 10001 , " QQ " , 168 }, 44 { 10002 , " eMule " , 98 }, 45 { 10003 , " Word " , 43 }, 46 }; 47 48 typedef struct memblock MEM; // 內存分區結構 49 struct memblock{ 50 int head; // 地址 51 int length; // 長度 52 int state; // 狀態,0表示空閑,1表示占用 53 int jobid; // 已分配,記錄作業ID,否則為0 54 }; 55 56 MEM memdata[max] = { // 內存狀態表 57 { 0 , 50 , 1 , 8100 }, 58 { 50 , 50 , 0 , 0 }, 59 { 100 , 32 , 1 , 8101 }, 60 { 132 , 128 , 1 , 8102 }, 61 { 260 , 100 , 0 , 0 }, 62 { 360 , 76 , 1 , 8103 }, 63 { 436 , 200 , 0 , 0 }, 64 { 636 , 88 , 1 , 8104 }, 65 { 724 , 300 , 0 , 0 }, 66 }; 67 68 int memsum = 9 ; // 當前分區總數量,包括已分配分區和空閑分區 69 int curp = 0 ; // curp 是位置指針 70 71 MEM membackup[ 9 ] = { // 內存狀態源數據備份,用于還原 72 { 0 , 50 , 1 , 8100 }, 73 { 50 , 50 , 0 , 0 }, 74 { 100 , 32 , 1 , 8101 }, 75 { 132 , 128 , 1 , 8102 }, 76 { 260 , 100 , 0 , 0 }, 77 { 360 , 76 , 1 , 8103 }, 78 { 436 , 200 , 0 , 0 }, 79 { 636 , 88 , 1 , 8104 }, 80 { 724 , 300 , 0 , 0 }, 81 }; 82 83 int job_locate( int id){ // 根據作業ID,查找作業在數組jobdata的位置 84 int i; 85 for (i= 0 ;i<jobsum;++ i) 86 if (id == jobdata[i].jobid) 87 return i; 88 return - 1 ; 89 } 90 91 void mem_state(){ // 根據memdata數組顯示當前內存狀態 92 int i, j, k; 93 for (i= 0 ;i<memsum;++ i){ 94 tab; 95 printf( " %4ik " , memdata[i].head); 96 for (j= 0 ;j< 20 ;++ j) hli; 97 ret;tab; vli; 98 for (j= 0 ;j< 5 ;++ j) spa; 99 if (memdata[i].jobid == 0 ) 100 printf( " %10s " , " $block$ " ); 101 else { 102 k = job_locate(memdata[i].jobid); 103 printf( " %10s " , jobdata[k].name); 104 } 105 vli;ret; 106 } 107 printf( " \t1024k " ); 108 for (j= 0 ;j< 20 ;++ j) hli; 109 ret; 110 } 111 112 int mem_allocate_ff( int k){ // 首次適應算法 113 int i; 114 int job_size = jobdata[k].vol; 115 116 // for(i=0;i<memsum;++i){ 117 // printf("%d %d %d %d\n", memdata[i].head, memdata[i].length, memdata[i].state, memdata[i].jobid); 118 // } 119 for (i= 0 ;i<memsum;++ i){ 120 if (!memdata[i].state && job_size <= memdata[i].length) 121 return i; 122 } 123 return - 1 ; 124 } 125 126 127 int mem_allocate_cf( int k){ // 循環首次適應算法 128 int i; 129 int job_size = jobdata[k].vol; 130 int t = memsum; 131 printf( " memsum = %d\n " , memsum); 132 while (t){ 133 curp %= memsum; 134 i = curp; 135 // printf("t : %d curp : %d length: %d state: %d\n", t, curp, memdata[i].length, memdata[i].state); 136 if (!memdata[i].state && job_size <= memdata[i].length){ 137 curp++ ; 138 return i; 139 } 140 curp++ ; 141 t-- ; 142 } 143 return - 1 ; 144 } 145 146 int mem_allocate_bf( int k){ // 最佳適應算法 147 int i; 148 int job_size = jobdata[k].vol; 149 int min = - 1 ; 150 for (i= 0 ;i<memsum;++ i){ 151 if (!memdata[i].state && job_size <= memdata[i].length){ 152 if (min == - 1 ) min = i; 153 else if (memdata[i].length<memdata[min].length) min = i; 154 } 155 } 156 if (min!= - 1 ) return min; 157 return - 1 ; 158 } 159 160 void mem_allocate( int i, int j){ // 將分區j分配給作業i 161 int k; 162 163 if (jobdata[i].vol == memdata[j].length){ 164 memdata[j].state = 1 ; 165 memdata[j].jobid = jobdata[i].jobid; 166 } 167 else { 168 for (k=memsum- 1 ;k>=j;-- k){ 169 memdata[k+ 1 ] = memdata[k]; 170 } 171 int temp = memdata[j].length; 172 memdata[j].length = jobdata[i].vol; 173 174 memdata[j].state = 1 ; 175 memdata[j].jobid = jobdata[i].jobid; 176 memdata[j+ 1 ].length = temp - memdata[j].length; 177 memdata[j+ 1 ].state = 0 ; 178 memdata[j+ 1 ].jobid = 0 ; 179 memdata[j+ 1 ].head = memdata[j].length + memdata[j].head; 180 ++ memsum; 181 } 182 } 183 184 int mem_locate( int id){ // 根據作業ID,查找jobdata的id在數組memdata的位置 185 int i; 186 for (i= 0 ;i<memsum;++ i) 187 if (id == memdata[i].jobid) 188 return i; 189 return - 1 ; 190 } 191 192 void mem_redraw( int k){ // 作業回收 193 int i; 194 int t = mem_locate(k); 195 printf( " t : %d\n " , t); 196 if (t == - 1 ) return ; 197 198 memdata[t].state = 0 ; 199 memdata[t].jobid = 0 ; 200 201 if ( t > 0 && memdata[t- 1 ].state == 0 ){ 202 memdata[t- 1 ].state = 0 ; 203 memdata[t- 1 ].jobid = 0 ; 204 memdata[t- 1 ].length += memdata[t].length; 205 for (i=t+ 1 ;i<memsum;++ i) 206 memdata[i- 1 ] = memdata[i]; 207 -- memsum; 208 -- t; 209 } 210 if (t+ 1 <= memsum && memdata[t+ 1 ].state == 0 ){ 211 memdata[t].state = 0 ; 212 memdata[t].jobid = 0 ; 213 memdata[t].length += memdata[t+ 1 ].length; 214 for (i=t+ 2 ;i<memsum;++ i) 215 memdata[i- 1 ] = memdata[i]; 216 -- memsum; 217 } 218 } 219 220 void mem_restore(){ // 內存狀態還原 221 int k; 222 memsum = 9 ; 223 for (k= 0 ;k<memsum;++ k){ 224 memdata[k].head = membackup[k- 1 ].head; 225 memdata[k].jobid = membackup[k- 1 ].jobid; 226 memdata[k].state = membackup[k- 1 ].state; 227 memdata[k].length = membackup[k- 1 ].length; 228 } 229 for (k=memsum;k<max;++ k){ 230 memdata[k].head = 0 ; 231 memdata[k].jobid = 0 ; 232 memdata[k].state = 0 ; 233 memdata[k].length = 0 ; 234 } 235 } 236 237 int main( int argc, char const * argv[]) 238 { 239 int i, j, start; 240 printf( " \n------------The current memory state----------!\n " ); 241 mem_state(); 242 _keygo(); 243 printf( " \n------------The work allocate start-----------!\n " ); 244 start = 5 ; 245 for (i=start;i<jobsum;++ i){ 246 printf( " The work %s wait to allocate, The size is %iK\n " , jobdata[i].name, jobdata[i].vol); 247 _sleep( 1 ); 248 j = mem_allocate_ff(i); 249 printf( " The allocate : %d\n " , j); 250 if (j == - 1 ) printf( " The work %s is too big, the allocation is failed\n " , jobdata[i].name); 251 else { 252 printf( " allocation space to The work %s\n " , jobdata[i].name); 253 mem_allocate(i, j); 254 mem_state(); 255 } 256 _keygo(); 257 } 258 printf( " ----------------The allocation over!---------\n " ); 259 printf( " restore the memory!\n " ); 260 printf( " \n----------------The current memory state------------\n " ); 261 mem_state(); 262 j = 88 ; 263 while (j != 0 ){ 264 printf( " \n Please choose the job No: " ); 265 scanf( " %d " , & j); 266 mem_redraw(j); 267 printf( " \nThe restore success !\n " ); 268 printf( " \n-------------The current memory state---------\n " ); 269 mem_state(); 270 } 271 _keygo(); 272 return 0 ; 273 }
?
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
