模拟实现可变分区存储管理.docx
- 文档编号:10632554
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:31
- 大小:227.91KB
模拟实现可变分区存储管理.docx
《模拟实现可变分区存储管理.docx》由会员分享,可在线阅读,更多相关《模拟实现可变分区存储管理.docx(31页珍藏版)》请在冰豆网上搜索。
模拟实现可变分区存储管理
《操作系统》
课程设计说明书
题目:
模拟实现可变分区存储管理
班级:
学号:
姓名:
指导老师:
1.目的和要求
在熟练掌握计算机分区存储管理方式的原理的基础上,利用一种程序设计语言模拟实现操作系统的可变分区存储管理的功能,一方面加深对原理的理解,另一方面提高学生通过编程根据已有原理解决实际问题的能力,为学生将来进行系统软件开发和针对实际问题提出高效的软件解决方案打下基础。
2.设计内容
设计合理的数据结构来描述存储空间:
对于未分配出去的部分,可以用空闲分区队列或空闲分区链表来描述,对于已经分配出去的部分,由装入内存的作业占据,可以将作业组织成链表或数组。
实现分区存储管理的内存分配功能,实现两种适应算法:
首次适应算法,最坏适应算法。
实现分区存储管理的内存回收算法:
要求能够正确处理回收分区与空闲分区的四种邻接关系。
当碎片产生时,能够进行碎片的拼接。
3.设计环境
Windows操作系统、DEVC++
C语言
4.程序概要
(1)数据结构和全局变量
inttype=0;//算法类型
//空闲分区
structfreelink{
intlen;//len为分区长度
intaddress;//address为分区起始地址
structfreelink*next;
};
//占用分区
structbusylink{
charname;//作业或进程名,name='S'表示OS占用
intlen;
intaddress;
structbusylink*next;
};
structfreelink*free_head=NULL;//自由链队首指针
structbusylink*busy_head=NULL,//占用区队首指针
*busy_tail=NULL;//占用区队尾指针
(2)功能模块划分
大体上可以将整个程序的模块划分成如下几个部分:
1)主模块:
主要是初始化(设置物理内存的用户区的大小,选取适应算法)和界面,界面参考如下:
2)内存分配算法(实现两种适应算法:
最坏适应算法,首次适应算法)
3)内存回收算法(考虑四种邻接情况,尤其是采用最佳(坏)适应算法时的分区合并)
4)碎片拼接算法
5)空闲分区队列显示
6)占用分区队列显示
(3)各函数调用关系
(4)主要函数流程图
allocateMemoByWF();//两种算法分配回收大致相同,在这里只列举一种
compactMemo()
freeMemoByWF()
5.源代码
#include
#include
#defineMAX_SIZE512//系统能分配的最大内存
#defineFALSE0
#defineTRUE1
inttype=0;//算法类型
//空闲分区
structfreelink{
intlen;//len为分区长度
intaddress;//address为分区起始地址
structfreelink*next;
};
//占用分区
structbusylink{
charname;//作业或进程名,name='S'表示OS占用
intlen;
intaddress;
structbusylink*next;
};
structfreelink*free_head=NULL;//自由链队列(带头结点)队首指针
structbusylink*busy_head=NULL,//占用区队列队(带头结点)首指针
*busy_tail=NULL;//占用区队列队尾指针
//初始化
voidinit(){
structfreelink*p;
structbusylink*q;
free_head=(structfreelink*)malloc(sizeof(structfreelink));
free_head->next=NULL;//创建自由链头结点
busy_head=busy_tail=(structbusylink*)malloc(sizeof(structbusylink));
busy_head->next=NULL;//创建占用链头结点
p=(structfreelink*)malloc(sizeof(structfreelink));
p->address=64;
p->len=MAX_SIZE-64;//(OS占用了64K)
p->next=NULL;
free_head->next=p;
q=(structbusylink*)malloc(sizeof(structbusylink));
q->name='S';//S表示操作系统占用
q->len=64;
q->address=0;
q->next=NULL;
busy_head->next=q;
busy_tail=q;
}
//紧凑
structfreelink*compactMemo(intrequire){
intsum=0;
structfreelink*fNode=free_head->next;
while(fNode!
=NULL){
sum+=fNode->len;
fNode=fNode->next;
}
printf("\n");
if(sum returnNULL; } //删除空闲区所有节点 structfreelink*p=free_head->next;//让p一直指向第一个数据节点 while(p! =NULL){ free_head->next=p->next; free(p); p=free_head->next; } //创建新的分区 structfreelink*node=(structfreelink*)malloc(sizeof(structfreelink)); node->address=0; node->len=MAX_SIZE; free_head->next=node; node->next=NULL; //修改占用区作业内存地址 structbusylink*q=busy_head->next; while(q! =NULL){ q->address=node->address; node->len-=q->len; node->address+=q->len; q=q->next; } returnnode; } //最坏(佳)适应算法在分区合并和分割后需要调整分区位置 intadjust(structfreelink*node){ structfreelink*p=free_head; //合并后链表中只剩一个分区 if(p->next==NULL){ free_head->next=node; node->next=NULL; returnTRUE; } while(p->next! =NULL&&node->len<=p->next->len){ p=p->next; } if(p->next==NULL){ p->next=node; node->next=NULL; } else{ node->next=p->next; p->next=node; } returnTRUE; } //最坏适应算法 intallocateMemoByWF(){ intrequire; printf("请输入作业所需内存大小: "); scanf("%d",&require); //判断第一个空闲分区大小是否满足需求 structfreelink*p=free_head->next; if(p->len printf("没有分区满足要求,正在尝试碎片拼接...\n"); //判断所有分区容量总和是否满足要求 if((p=compactMemo(require))==NULL){ returnFALSE; } } //将第一个空闲分区切割require分配给该作业 structbusylink*q=(structbusylink*)malloc(sizeof(structbusylink)); printf("请输入作业名称: "); getchar();//输入require之后有一个换行符,用getchar吃掉 scanf("%c",&q->name); //检查是否重名 structbusylink*temp=busy_head->next; while(temp! =NULL&&temp->name! =q->name){ temp=temp->next; } if(temp! =NULL){ printf("该作业名已存在! \n"); returnFALSE; } q->len=require; q->address=p->address; q->next=NULL; //将作业按地址递增的顺序插入到作业队列中 temp=busy_head; while(temp->next! =NULL&&q->address>temp->next->address){ temp=temp->next; } if(temp->next==NULL){ temp->next=q; q->next=NULL; } else{ q->next=temp->next; temp->next=q; } //分割空闲分区 if(p->len==require){ free(p); returnTRUE; } else{ p->address+=require; p->len-=require; } //把第一个分区从空闲区中拿出来 if(p->next! =NULL){ free_head->next=p->next; } elsereturnTRUE;//空闲队列中是否只存在一个节点 //将分割后的分区放到合适的位置 adjust(p); returnTRUE; } //首次适应算法 intallocateMemoByFF(){ intrequire; printf("请输入作业所需内存大小: "); scanf("%d",&require); structfreelink*p=free_head->next; structfreelink*pre=free_head; while(p! =NULL&&p->len pre=p; p=p->next; } if(p==NULL){ printf("没有分区满足要求,正在尝试碎片拼接...\n"); //判断所有分区容量总和是否满足要求 if((p=compactMemo(require))==NULL){ returnFALSE; } } //将第一个满足条件的分区分割合适的内存分配给作业 structbusylink*q=(structbusylink*)malloc(sizeof(structbusylink)); printf("请输入作业名称: "); getchar();//输入require之后有一个换行符,用getchar吃掉 scanf("%c",&q->name); //检查是否重名 structbusylink*temp=busy_head->next; while(temp! =NULL&&temp->name! =q->name){ temp=temp->next; } if(temp! =NULL){ printf("该作业名已存在! \n"); returnFALSE; } q->len=require; q->address=p->address; q->next=NULL; //将作业按地址递增的顺序插入到作业队列中 temp=busy_head; while(temp->next! =NULL&&q->address>temp->next->address){ temp=temp->next; } if(temp->next==NULL){ temp->next=q; q->next=NULL; } else{ q->next=temp->next; temp->next=q; } //分割空闲分区 if(p->len==require){ pre->next=p->next; free(p); returnTRUE; } else{ p->address+=require; p->len-=require; returnTRUE; } } //匹配节点并创建回收分区 structfreelink*matchName(charname){ structbusylink*q=busy_head; structfreelink*node=(structfreelink*)malloc(sizeof(structfreelink)); //找到匹配节点的前一个 while(q->next! =NULL&&q->next->name! =name){ q=q->next; } if(q->next==NULL){ printf("%c进程不存在\n",name); returnNULL; } //接收匹配节点的内存信息 node->len=q->next->len; node->address=q->next->address; //在占用分区中删除匹配的节点 structbusylink*temp=q->next; if(q->next==busy_tail){ busy_tail=q; q->next=NULL; } else{ q->next=q->next->next; } free(temp); returnnode; } intfreeMemoByWF(){ printf("请输入作业名称: "); charname; getchar(); scanf("%c",&name); printf("\n"); //将内存(即node节点)放回空闲区 structfreelink*node; if((node=matchName(name))==NULL){ returnFALSE; } structfreelink*p=free_head->next; structfreelink*pre=free_head; //三种邻接情况(合并后需要重新根据大小排序) while(p! =NULL){ //与下一分区邻接 if(node->address+node->len==p->address){ //与上一分区邻接 if(p->next! =NULL&& p->next->address+p->next->len==node->address){ structfreelink*temp=p->next; temp->len=temp->len+p->len+node->len; free(node); pre->next=temp->next; free(p); adjust(temp); printf("回收成功! \n"); returnTRUE; } else{ p->address=node->address; p->len+=node->len; free(node); pre->next=p->next;//把合并后分区取出来 adjust(p); printf("回收成功! \n"); returnTRUE; } } //与上一分区邻接 if(p->address+p->len==node->address){ //同时与下一分区邻接 if(p->next! =NULL&& node->address+node->len==p->next->address){ p->len=p->len+node->len+p->next->len; pre->next=p->next->next; free(p->next); free(node); adjust(p); printf("回收成功! \n"); returnTRUE; } else{ p->len+=node->len; free(node); pre->next=p->next; adjust(p); printf("回收成功! \n"); returnTRUE; } } pre=p; p=p->next; } //不邻接 adjust(node); printf("回收成功! \n"); returnTRUE; } intfreeMemoByFF(){ printf("请输入作业名称: "); charname; getchar(); scanf("%c",&name); printf("\n"); //将内存(node节点)放回空闲区 structfreelink*node; if((node=matchName(name))==FALSE){ returnFALSE; } structfreelink*p=free_head->next; //三种邻接情况 while(p! =NULL){ //与下一分区邻接 if(node->address+node->len==p->address){ p->address=node->address; p->len+=node->len; free(node); printf("回收成功! \n"); returnTRUE; } //与上一分区邻接 if(p->address+p->len==node->address){ //同时与下一分区邻接 if(p->next! =NULL&& node->address+node->len==p->next->address){ p->len=p->len+node->len+p->next->len; structfreelink*temp=p->next; p->next=p->next->next; free(temp); free(node); printf("回收成功! \n"); returnTRUE; } else{ p->len+=node->len; free(node); printf("回收成功! \n"); returnTRUE; } } p=p->next; } //不邻接 p=free_head; while(p->next! =NULL&&node->address>p->next->address){ p=p->next; } if(p->next==NULL){ p->next=node; node->next=NULL; }/*回收分区是分区链中地址最大的一个*/ else{ node->next=p->next; p->next=node; } printf("回收成功! \n"); returnTRUE; } //输出空闲分区 voidprintFreeLink(){ structfreelink*p=free_head->next; printf("空闲分区: \n"); while(p! =NULL){ printf("分区起始地址: %d",p->address); printf("分区大小: %d\n",p->len); p=p->next; } printf("\n"); } //输出占用分区 voidprintBusyLink(){ structbusylink*q=busy_head->next;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模拟 实现 可变 分区 存储 管理