操作系统课程设计报告书

  • 格式:doc
  • 大小:567.00 KB
  • 文档页数:57

下载文档原格式

  / 57
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计报告书2014 / 2015 学年第 2 学期

课程名称:操作系统课程设计

专业班级:_计算机科学与技术1303班__ 学号:________ _________ 姓名:_________ ___________ 指导教师:_____ 邵虹崔文成 ______

题目1 连续动态内存管理模拟实现

1.1 题目的主要研究内容及预期达到的目标

(1)针对操作系统中内存管理相关理论进行设计,编写程序并进行测试,该程序管理一块虚拟内存。重点分析三种连续动态内存分配算法,即首次适应算法、循环首次适应算法和最佳适应算法。

(2)实现内存分配和回收功能。

1.2 题目研究的工作基础或实验条件

(1)硬件环境:PC机

(2)软件环境:Windows XP,Visual C++ 6.0

1.3 设计思想

首次适应算法的实现:从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法的目的在于减少查找时间。为适应这种算法,空闲分区表中的空闲分区要按地址由低到高进行排序。该算法优先使用低址部分空闲区,在低址空间造成许多小的空闲区,在高址空间保留大的空闲区。

循环首次适应算法的实现:在分配内存空间时,不再每次从表头开始查找,而是从上次找到空闲区的下一个空闲开始查找,直到找到第一个能满足要求的的空闲区为止,并从中划出一块与请求大小相等的内存空间分配给作业。该算法能使内存中的空闲区分布得较均匀。

最佳适应算法的实现:从全部空闲区中找到能满足作业要求的、且最小的空闲分区,这种方法能使碎片尽量小。为适应此算法,空闲分区表中的空闲分区要按从小到大进行排序,从表头开始查找第一个满足要求的自由分配。

1.4 流程图

内存分配流程图,如图1-1所示。

图1-1 内存分配流程图内存回收流程图,如1-2所示。

图1-2 内存回收流程图

1.5 主要程序代码

(1)分配内存

void allocate(char z,float l)

{

int i,k;

float ad;

k=-1;

for(i=0;i

if(free_table[i].length >= l && free_table[i].flag == 1)

if(k==-1 || free_table[i].length

k=i;

if(k==-1)

printf("无可用空闲区\n");

return;

}

if(free_table[k].length-l <= minisize)

{

free_table[k].flag=0;

ad=free_table[k].address;

l=free_table[k].length;

}

else

{

free_table[k].length=free_table[k].length-l;

ad=free_table[k].address+free_table[k].length;

}

i=0;

while(used_table[i].flag!=0 && i

i++;

if(i>=n)

{

printf("无表目填写已分分区,错误\n");

if(free_table[k].flag==0)

free_table[k].flag=1;

else

{

free_table[k].length=free_table[k].length+l;

return;

}

}

else

used_table[i].address=ad;

used_table[i].length=l;

used_table[i].flag=z;

}

return;

}

(2)回收内存

void reclaim(char z)

{

int i,k,j,s,t;

float S,L;

s=0;

while((used_table[s].flag!=z || used_table[s].flag==0)&&s

if(s>=n)

{

printf("找不到该作业\n");

return;

}

used_table[s].flag=0;

S=used_table[s].address;

L=used_table[s].length;

j=-1;

k=-1;

i=0;

while(i

{

if(free_table[i].flag==1)

{

if(free_table[i].address+free_table[i].length==S)

k=i;

if(free_table[i].address==S+L)

j=i;

}

i++;

}

if(k!=-1)

if(j!=-1)

{

free_table[k].length=free_table[j].length+free_table[k].length+L;

free_table[j].flag=0;

}

else

free_table[k].length=free_table[k].length+L;

else if(j!=-1)

{

free_table[j].address=S;

free_table[j].length=free_table[j].length+L;

}

else

{

t=0;

while(free_table[t].flag==1&&t

t++;

if(t>=m)

{

printf("主存空闲表没有空间,回收空间失败\n");

used_table[s].flag=z;

return;