- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
组号 成绩
计算机操作系统
课程设计报告
题目 内存的连续分配算法
专业: 计算机科学与技术
班级:
学号姓名:
指导教师:
2016年12月 26 日
设计目的
掌握内存的里联系分配方式的各种算法。
设计内容
本系统模拟操作系统内存分配算法的实现,实现可重定位分区分配算法,采用PCB定义结构体来表示一个进程,定义了进程的名称和大小,进程内存起始地址和进程状态。内存分区表用空闲分区表的形式来模拟实现。
设计原理
动态分区的实现是根据进程所申请的内存大小来决定动态的由系统进行分配内存空间大小,因此分区表里的空闲分区个数是不定的,根据进程数和进程大小决定的。可重定位分区算法比动态分区算法增加了紧凑的功能。
详细设计及编码
模块分析
该实验可分为三大部分,每一部分又由个数不同的几个函数实现。第一部分是装入作业,第二部分是内存回收,第三部分是进行紧凑。装入作业的时候首先初始化一个链表,根据用户输入的操作代号进行相应的操作。若用户选择装入作业首先判断空闲分区表里有没有比作业需要的内存大的分区,若有直接分配,若没有进行紧凑操作,再将紧凑后的空闲分区与作业大小比较,若能装的下则分配给作业,若是进行紧凑后的空闲分区仍不能装入整个作业则通知用户内存不够。
2、流程图
代码实现
#includestdio.h
#includestdlib.h
#includetime.h
#includewindows.h
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define SIZE 3
//进程表
int ppNo=1; //用于递增生成进程号
int pLength=0;
struct PCB
{
int pNo; //进程号(名)
int pSize; // 进程大小
int pOccupy; // 实际占用的内存
int pStartAddr; // 进程起始地址
int pState; //进程状态
};
struct PCB pList[200];
//////////////////空闲分区表部分/////////////////////////////////////////////////////
typedef int Status;
typedef struct emptyNode
{ //空闲分区结构体
int areaSize; //空闲分区大小
int aStartAddr; //空闲分区始址
struct emptyNode *next;
}emptyNode,*LinkList;
int ListDelete(struct PCB *pList,int i);//删除下标为i的进程
void pSort(struct PCB *pList); //内存中的进程按始址递增排序
void compact(LinkList L,struct PCB *pList);//紧凑 ,内存中进程移动,修改进程数据结构;空闲分区合并,修改空闲分区表数据结构
void amalgamate(LinkList L); //回收后进行合并空闲分区
void recycle(LinkList L,struct PCB *pList); //回收 ,从进程表中删除进程 ,把释放出的空间插入到空闲分区链表中
Status InitList(LinkList L); ///构造一个新的有头节点的空链表L
Status ClearList(LinkList L); ///将链表L重置为空表
Status ListInsert(LinkList L,LinkList s1); //根据始址进行插入
void DeleteElem(LinkList L,int aStartAddr);//删除线性表中始址值为aStartAddr的结点
void PrintList(LinkList L);
原创力文档


文档评论(0)