1、 组号 成绩 计算机操作系统 课程设计报告 题目 内存的连续分配算法 专业: 计算机科学与技术 班级: 学号姓名: 指导教师: 2016 年 12 月 26 日 一、 设计目的 掌握内存的里联系分配方式的各种算法。 二、 设计内容 本系统模拟操作系统内存分配算法的实现, 实现可重定位分区分配算法, 采用 PCB 定义结构 体来表示一个进程,定义了进程的名称和大小,进程内存起始地址和进程状态。内存分区表 用空闲分区表的形式来模拟实现。 三、 设计原理 动态分区的实现是根据进程所申请的内存大小来决定动态的由系统进行分配内存空间大小, 因此分区表里的空闲分区个数是不定的, 根据进程数和进程大小决定的
2、。 可重定位分区算法 比动态分区算法增加了紧凑的功能。 四、 详细设计及编码 1、模块分析 该实验可分为三大部分,每一部分又由个数不同的几个函数实现。第一部分是装入 作业,第二部分是内存回收,第三部分是进行紧凑。装入作业的时候首先初始化一 个链表,根据用户输入的操作代号进行相应的操作。若用户选择装入作业首先判断 空闲分区表里有没有比作业需要的内存大的分区,若有直接分配,若没有进行紧凑 操作,再将紧凑后的空闲分区与作业大小比较,若能装的下则分配给作业,若是进 行紧凑后的空闲分区仍不能装入整个作业则通知用户内存不够。 2、流程图 2、 代码实现 #include #include #include
3、 #include #define TURE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define SIZE 3 检索空闲分区链 进行紧凑形成连 续空闲区 空闲分区总 和u.size? N Y N 找到 u.size 的分 无 法 分 配, 返回 请 求 分 配 u.size 分区 修改有关的数据 结构 进行紧凑形成连 续空闲区 按动态分区方式 进行分配 Y 返回分区号及首址 /进程表 int ppNo=1; /用于递增生成进程号 int pLength=
4、0; struct PCB int pNo; /进程号(名) int pSize; / 进程大小 int pOccupy; / 实际占用的内存 int pStartAddr; / 进程起始地址 int pState; /进程状态 ; struct PCB pList200; /空闲分区表部分/ typedef int Status; typedef struct emptyNode /空闲分区结构体 int areaSize; /空闲分区大小 int aStartAddr; /空闲分区始址 struct emptyNode *next; emptyNode,*LinkList; int Lis
5、tDelete(struct PCB *pList,int i);/删除下标为 i 的进程 void pSort(struct PCB *pList); /内存中的进程按始址递增排序 void compact(LinkList /紧凑 ,内存中进程移动,修改进程数据 结构;空闲分区合并,修改空闲分区表数据结构 void amalgamate(LinkList /回收后进行合并空闲分区 void recycle(LinkList /回收 ,从进程表中删除进程 ,把释放 出的空间插入到空闲分区链表中 Status InitList(LinkList /构造一个新的有头节点的空链表 L Status ClearList(LinkList /将链表 L 重置为空表 Status ListInsert(LinkList /根据始址进行插入 void DeleteElem(LinkList /删除线性表中始址值为 aStartAddr 的结 点 void PrintList(LinkList L); /输出各结点的值 void creatP(struct PCB *p); /初始化进程 int search(LinkList /检索分区表 ,返回合适分区的首址 int add(LinkList /返回空闲分区总