操作系统实验3:内存分配与回收
来源:互联网 发布:手机怎么看淘宝直播 编辑:程序博客网 时间:2024/06/08 20:07
今天早上做了操作系统实验:
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分配给作业i161 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 }
0 0
- 操作系统实验3:内存分配与回收
- 操作系统 内存分配与回收算法 模拟
- 操作系统 内存分配与回收算法 模拟
- 操作系统 内存分配与回收算法 模拟
- 模拟实现操作系统内存分配与回收
- 内存分配与回收策略
- 内存分配与回收策略
- java内存分配与回收
- JVM内存分配与回收
- JVM内存回收与分配
- 内存分配与回收策略
- 垃圾回收与内存分配
- 内存分配与回收策略
- 内存分配与回收策略
- 内存分配与回收策略
- 内存分配与回收策略
- Java内存回收与分配
- linux内存分配与回收
- 笔试总结篇(一) : 广州X公司笔试
- KMP 代码 暂存
- 编程珠玑 第一章 大数据排序
- 操作系统课程:调度算法
- PLAN :昔日未来
- 操作系统实验3:内存分配与回收
- JAVA 作业:图形界面
- Love myself...
- 数据结构总结:(一)顺序表
- 关于iTunes随机播放和我所不知道的自己
- Printk 标志优先级别
- LInux 2.6 编译内核出现Question
- Linux内核编译和运行
- 数据结构总结:(二)链表