今天早上做了操作系统实验:
1、阅读理解两个例程,掌握例程的运作流程。
2、连续式分配例程中提供了三种分配算法:首次适应、循环首次适应、最佳适应。例程还缺少分配作业和回收作业的功能。请至少实现一种分配算法并完成分配作业的功能,保证该例程能够正确实现分配作业的功能
3、回收作业的功能属于选做部分。
4、分页管理例程缺少分配作业和回收的功能,请实现这两个功能,保证该例程能够正确实现分页管理的分配与回收功能
5、上述要求2和4,必须完成其中一个。
连续式分配代码贴上:
1 #include2 #include 3 #include 4 #include 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 =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 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