
1568.动态分区管理系统 《操作系统原理》课程设计.doc
11页计算机科学与技术专业《操作系统原理》课程设计课题名称:动态分区管理系统 姓 名: 班 级: 学 号: 课程设计起止时间:2005年12月26日至12月30日指导教师: 成绩:课程设计任务书《操作系统原理》课程设计任务书设计题目:动态分区管理系统任务下达时间:2005年12月26日任务完成时间:2005年12月30日指导教师: 指导教师评语一、所得结果:二、存在问题:成绩评阅人一、设计原理 利用C程序设计语言在windows操作系统下模拟实现操作系统的动态分区存储管理的功能一方面加深对计算机分区存储管理方式的理解,另一方面通过编程提高解决实际问题的能力二、工作原理 分区管理是把内存划分成若干个大小不等的区域,除操作系统占用了一个区域之外,其余由多道环境下的各并发进程共享分区管理的基本原理是给每一个内存中的进程划分一块适当大小的存储区,以连续存储各个进程的程序和数据,使各个进程得以并发执行三、 详细设计(一)、主要系统函数说明1、设计合理的数据结构来描述存储空间1)对于未分配出去的部分,用空闲分区链表来描述。
struct freeList {int startAddress; /* 分区起始地址 */int size; /* 分区大小 */struct freeList *next; /* 分区链表指针 */}2) 对于已经分配出去的部分,由装入内存的作业占据struct usedList {int startAddress; /* 分区起始地址 */int jobID; /* 分区中存放作业ID */struct usedList *next; /* 分区链表指针 */}3) 作业组织成链表struct jobList{int id; /* 作业ID */int size; /* 作业大小(需要的存储空间大小) */int status; /* 作业状态 0 : new job ,1 : in the memory , 2 : finished . */struct jobList *next; /* 作业链表指针 */}将存储空间分为空闲可占用两部分,在usedList中设jobID而不设size,可以在不增加空间复杂度(与freeList相比)的同时更方便的实现可变分区存储管理。
尽管设置jobList增加了空间复杂度,但它的存在,使得该程序可以方便的直接利用D盘中的JOB文件该文件可以认为是一个和其他进程共享的资源通过这个文件,其他进程写入数据供读取2、实现分区存储管理的内存分配功能,选择适应算法 基本原理分析: 1)Best fit :将空闲分区按大小从小到大排序,从头找到大小合适的分区2)Worst fit:将空闲分区按大小从大到小排序,从头找到大小合适的分区3)First fit:将空闲分区按起始地址大小从小到大排序,从头找到大小合适的分区4)Last fit :将空闲分区按起始地址大小从大到小排序,从头找到大小合适的分区 可将空闲分区先做合适的排序后用对应的适应算法给作业分配存储空间排序函数 order( bySize为零则按分区大小排序,否则按分区起始地址;inc为零从小到大排序,否则从大到小排序;通过empty指针返回结果 )void order(struct freeList **empty,int bySize,int inc){struct freeList *p,*q,*temp; int startAddress,size; for(p = (*empty) -> next;p;p = p -> next) { /* 按bySize和inc两个参数寻找合适的节点,用temp指向它 */ for(temp = q = p;q;q = q -> next) { switch(bySize) { case 0 : switch(inc) { case 0:if(q->size < temp->size) temp = q;break; default:if(q->size > temp->size) temp = q;break; } break; default: switch(inc) { case 0:if(q->startAddress < temp->startAddress) temp = q;break; default:if(q->startAddress > temp->startAddress) temp = q;break; } break; } } /* 交换节点的成员值 */ if(temp != p) { startAddress = p->startAddress; size = p->size; p->startAddress = temp->startAddress; p->size = temp->size; temp->startAddress = startAddress; temp->size = size; } }}3、实现分区存储管理的内存回收算法void insertFreeNode(struct freeList **empty,int startAddress,int size)插入回收的空节点分区,处理回收分区与空闲分区的四种邻接关系。
{ struct freeList *p,*q,*r; for(p = *empty;p -> next;p = p -> next) ; /* 处理链表尾部的邻接情况 */ if(p == *empty || p -> startAddress + p -> size < startAddress)/* 与尾部不相邻*/ { makeFreeNode(&r,startAddress,size); /* 通过r指针返回创建的空闲节点*/ r -> next = p -> next; /* 插入独立的空闲节点 */ p -> next = r; return ; } if(p -> startAddress + p -> size == startAddress) /* 与尾部上邻 */ { p -> size += size; /* 合并尾部节点 */ return ; } q = (*empty) -> next; /* 处理链表首节点的邻接情况 */ if(startAddress + size == q -> startAddress) /* 与首节点下邻 */ { q -> startAddress = startAddress; /* 合并首节点 */ q -> size += size; } else if(startAddress + size < q -> startAddress) /* 与首节点不相邻 */ { makeFreeNode(&r,startAddress,size); r -> next = (*empty) -> next; (*empty) -> next = r; } else { /* 处理链表中间的邻接情况 */ while(q -> next && q -> startAddress < startAddress) { p = q; q = q -> next; } if(p -> startAddress + p -> size == startAddress &&\ q -> startAddress == startAddress + size) /* 上下邻,合并节点 */ { p -> size += size + q -> size; p -> next = q -> next; free(q); /* 删除多余节点 */ } else if(p -> startAddress + p -> size == startAddress &&\ q -> startAddress != startAddress + size) /*上邻,增加节点的大小*/ { p -> size += size; } else if(p -> startAddress + p -> size != startAddress &&\ q -> startAddress == startAddress + size) /* 下邻 */ { q -> startAddress = startAddress; /* 修改节点起始地址 */ q -> size += size; /* 修改节点的大小 */ } else { /* 上下不相邻 */ makeFreeNode(&r,startAddress,size); r -> next = p -> next; p -> next = r; } }}4、当碎片产生时,进行碎片的拼接。
5、空闲分区队列显示:int showFreeList(struct freeList *empty)6、作业占用链表显示:int showUsedList(struct jobList *jobs,struct usedList *used) 从头到尾显示used链,同时通过其中的作业ID在jobs中查对应的大小7、从输入作业到D盘的JOB文件:void inputJob(void)8、从JOB文件中读出作业并创建作业链表:int makeJobList(struct jobList **jobs)9、显示作业链表:int showJobList(struct jobList。
