今天早上做了操作系统实验:
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 }