处理机调度模拟内存的管理.docx
- 文档编号:30178868
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:13
- 大小:99.98KB
处理机调度模拟内存的管理.docx
《处理机调度模拟内存的管理.docx》由会员分享,可在线阅读,更多相关《处理机调度模拟内存的管理.docx(13页珍藏版)》请在冰豆网上搜索。
处理机调度模拟内存的管理
课程设计任务书
学生姓名:
孙伟专业班级:
计算机0309班
指导教师:
戚欣工作单位:
计算机科学与技术学院
题目:
动态分区管理方式的主存分配回收模拟系统的设计——最先适应法
初始条件:
1.预备内容:
阅读操作系统的内存管理章节内容,理解动态分区的思想,并体会最先适应法的具体实施方法。
2.实践准备:
掌握一种计算机高级语言的使用。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1.采用最先适应法模拟动态分区管理方式的主存分配和回收:
⑴主存分配函数实现寻找空闲区、空闲区表的修改、已分配区表的修改功能;
⑵主存回收函数实现:
有上邻空闲区和下邻空闲区,它们与回收区的合并;有上邻空闲区,无下邻空闲区,回收区与上邻空闲区的合并;无上邻空闲区,有下邻空闲区,回收区与下邻空闲区的合并
2.设计报告内容应说明:
⑴课程设计目的与功能;
⑵需求分析,数据结构或模块说明(功能与框图);
⑶源程序的主要部分;
⑷运行结果与运行情况分析;
⑸自我评价与总结:
)你认为你完成的设计哪些地方做得比较好或比较出色;
)什么地方做得不太好,以后如何改正;
)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);
)完成本题是否有其他的其他方法(如果有,简要说明该方法);
)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:
设计安排一周:
周1、周2:
完成程序分析及设计。
周2、周3:
完成程序调试及测试。
周4、周5:
撰写课程设计报告。
设计验收安排:
17周的周五上午到实验室进行上机验收。
设计报告书收取时间:
17周的星期五下午。
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
处理机调度:
模拟内存的管理
——最先适用算法
一、课程设计的目的与功能
设计目的
操作系统是现代计算机系统中不可缺少的基本系统软件。
操作系统管理和控制计算机系统中的所有软、硬件资源,是计算机系统的灵魂和核心。
除此之外,它还为用户使用计算机提供一个方便灵活、安全可靠的工作环境。
所以我们应该更加了解操作系统的具体工作情况,而模拟操作系统的运行,对我们来说是必要的。
它能加深对操作系统的认识,也有助于对计算机的熟悉。
设计功能
本程序能完成如下功能:
(1)随机产生内存的大小,随机分配进程个数和进程的大小。
(2)对每个进程进行最先适用算法的内存分配,报告执行的情况以及内存的大小。
(3)对最先适用算法,建立链表,并在程序完成后回收相应的内存空间,对它进行组织。
二、需求分析,数据结构
(1)随机产生内存的大小及每个进程对内存需求大小。
(2)要求根据分配算法显示分区的使用情况。
(3)要能处理内存回收的时候上下邻接区合并的问题。
本程序所用的数据结构为一下两个:
(1)建立链表
typedefstructmemory
{
intm_begin;
intm_size;
memory*next;
}memory;
该共用体用来建立空闲区链表,按从小到大顺序连接每一块空闲区。
当分配进程时,如果进程所需空间大于处理机分配给它的内存空间,则将剩下的空间又重新组织到空闲区链表中,并从小到大排列。
(2)进程控制块
typedefstructpcb
{
intp_size;
intstatus;
intpbegin;
//pcb*next;
}pcb;
该结构为进程控制块,管理进程的首地址,以及需求的大小和执行的状态。
请求SIZE大小的分区
三、源程序的主要部分
建立链表
typedefstructmemory
{
intm_begin;
intm_size;
memory*next;
}memory;
进程控制块
typedefstructpcb
{
intp_size;
intstatus;
intpbegin;
//pcb*next;
}pcb;
功能上面已经介绍。
初始化未分配出去的内存块的链表:
boolInitialMemory()
初始化进程数
boolGetg_pro()
初始化进程:
boolInitialProcessing()
这几个程序主要用来完成初始化工作,即,随机产生内存的大小,随机产生进程数,以及随机产生每个进程的大小。
为以后的程序执行奠定基础。
内存分配及空闲区回收
用最先适用算法来实现内存的分配:
boolm_FirstFit()
{
memory*m,*prem;//记录当前和前一次走过的空闲块
m=g_mLNode.next;
prem=m;
for(inti=1;i<=g_pro;i++){
if(g_pcb[i].status==RUN||g_pcb[i].status==FINISH)continue;
while(m!
=NULL){
if(m->m_size>=g_pcb[i].p_size)
{
if(m->m_size==g_pcb[i].p_size)
{
g_mLNode.m_total-=g_pcb[i].p_size;
g_pcb[i].pbegin=m->m_begin;
prem->next=m->next;
g_pcb[i].status=RUN;
}
Else
{
g_mLNode.m_total=g_mLNode.m_total-g_pcb[i].p_size;
g_pcb[i].pbegin=m->m_begin;
m->m_begin=m->m_begin+g_pcb[i].p_size;
m->m_size-=g_pcb[i].p_size;
g_pcb[i].status=RUN;
}
break;
}
Else
{
prem=m;
m=m->next;
}
}
}
returntrue;
}
内存的回收以及对上下空闲块的合并
boolm_Recycle(pcb*p)
{
memory*m,*prem,*mpcb;
mpcb=(memory*)malloc(sizeof(memory));
mpcb->next=NULL;
m=g_mLNode.next;
prem=m;
if(p->status==FINISH||p->status==WAITE)returnfalse;
mpcb->m_begin=p->pbegin;
mpcb->m_size=p->p_size;
intsize=p->p_size;
intend=mpcb->m_begin+size-1;
p->p_size=0;
p->pbegin=0;
p->status=FINISH;
g_mLNode.m_total+=size;
while(m!
=NULL)
{
if(mpcb->m_begin==m->m_begin+m->m_size)
{
m->m_size=m->m_size+mpcb->m_size;
mpcb=m;
//prem=m;
//m=m->next;
break;
}
elseif(end==m->m_begin-1)
{
mpcb->m_size+=m->m_size;
//prem=m;
//m=m->next;
break;
}
Else
{
prem=m;
m=m->next;
}
}
m=g_mLNode.next;prem=m;
while(m!
=NULL&&(mpcb->m_begin>m->m_begin))
{
prem=m;
m=m->next;
}
if(prem==m&&m==g_mLNode.next)
{
if(m->m_begin==mpcb->m_begin)g_mLNode.next=mpcb;
else{
g_mLNode.next=mpcb;
mpcb->next=m;
}
}
else{
mpcb->next=m;
prem->next=mpcb;
}
returntrue;
}这是程序最主要的两个函数,内存分配严格按照最先适用算法的要求,合并空闲块。
而空闲块的管理为本程序的核心部分,因为题目要求对空闲块进行最先适用管理。
当进程结束时,将会出现4种情况:
a、回收区与上面邻接;b、回收区与下面邻接;c、回收区与两边都邻接;d、回收区不与两边邻接。
对邻接部分进行合并。
四、运行结果与运行情况
下面对运行的情况用截图进行说明:
每张图对应的是各个不同时期进程及内存的状态,而且每次运行程序所得结果均不相同
五、自我评价与总结
从这次课程设计中,我学到了很多东西。
我觉得,我对随机分配函数比较满意。
但本程序还是有很多的缺点与不足的,如对几个进程控制其完成顺序,还有进程分配时不够完美,特别是在内存回收方面还有待改进,同时经常容易出现由于主存分配过大导致所有进程都能申请到足够的内存空间而无法体现出最先适应法的分配方式。
不过,做完这次程序,我基本了解了内存分配的一些基本原理,以及编程的基本技巧。
对最先适用算法有了更加深入的认识。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 处理机 调度 模拟 内存 管理