操作系统实验模内存管理模拟实验Word格式.docx

上传人:b****2 文档编号:5228609 上传时间:2023-05-04 格式:DOCX 页数:17 大小:193.35KB
下载 相关 举报
操作系统实验模内存管理模拟实验Word格式.docx_第1页
第1页 / 共17页
操作系统实验模内存管理模拟实验Word格式.docx_第2页
第2页 / 共17页
操作系统实验模内存管理模拟实验Word格式.docx_第3页
第3页 / 共17页
操作系统实验模内存管理模拟实验Word格式.docx_第4页
第4页 / 共17页
操作系统实验模内存管理模拟实验Word格式.docx_第5页
第5页 / 共17页
操作系统实验模内存管理模拟实验Word格式.docx_第6页
第6页 / 共17页
操作系统实验模内存管理模拟实验Word格式.docx_第7页
第7页 / 共17页
操作系统实验模内存管理模拟实验Word格式.docx_第8页
第8页 / 共17页
操作系统实验模内存管理模拟实验Word格式.docx_第9页
第9页 / 共17页
操作系统实验模内存管理模拟实验Word格式.docx_第10页
第10页 / 共17页
操作系统实验模内存管理模拟实验Word格式.docx_第11页
第11页 / 共17页
操作系统实验模内存管理模拟实验Word格式.docx_第12页
第12页 / 共17页
操作系统实验模内存管理模拟实验Word格式.docx_第13页
第13页 / 共17页
操作系统实验模内存管理模拟实验Word格式.docx_第14页
第14页 / 共17页
操作系统实验模内存管理模拟实验Word格式.docx_第15页
第15页 / 共17页
操作系统实验模内存管理模拟实验Word格式.docx_第16页
第16页 / 共17页
操作系统实验模内存管理模拟实验Word格式.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

操作系统实验模内存管理模拟实验Word格式.docx

《操作系统实验模内存管理模拟实验Word格式.docx》由会员分享,可在线阅读,更多相关《操作系统实验模内存管理模拟实验Word格式.docx(17页珍藏版)》请在冰点文库上搜索。

操作系统实验模内存管理模拟实验Word格式.docx

它的缺点是低地址部分不断被划分,会留下很多难以利用的、很小的空闲分区,而每次查找又都是从低址部分开始,这样无疑会增加查找可用空闲分区的开销。

分配内存,从空闲的分区表中找到所需大小的分区。

设请求的分区的大小为job_length,表中每个空闲分区的大小可表示为free[i].length。

如果frees[i].length>

=job_length,即空闲空间I的长度大于等于作业的长度将空闲标志位设置为1,如果不满足这个条件则输出:

“对不起,当前没有满足你申请长度的空闲内存,请稍后再试!

”。

=job_length空闲区空间I的长度不大于作业长度,I的值加1判断下一个空闲区空间是否大于作业的长度。

把未用的空闲空间的首地址付给已用空间的首地址,已用空间的长度为作业的长度,已用空间数量加1。

如果(frees[i].length>

job_length),空间的长度大于作业的长度,frees[i].front+=job_length;

空闲空间的起始首地址=原空闲区间的起始长度加作业长度frees[i].length-=job_length;

空闲区间的长度=原空闲区间的长度-作业的长度。

如果空间的长度与作业的长度相等,空闲区向前移一位,空闲区的数量也减一。

这样判断所有情况并相应分配之后,内存空间分配成功。

第二个操作为:

撤消相应作业。

在这个操作中,进行了以下步骤:

(1)按照系统提示输入将要撤消的作业名;

(2)判断该作业是否存在

若不存在:

输出“没有这个作业名,请重新输入作业名”;

若存在:

则先分别用flag,start,len保存该作业在分配区表的位置i,内存空间的首地址以及长度。

接着根据回收区的首地址,即该作业的首地址,从空闲区表中找到相应的插入点,将其加入空闲表,此时可能出现以下三种情况之一:

1.回收区只与插入点前一个空闲分区F1相邻接即(frees[i].front+frees[i].length)==start),此时判断其是否与后一个空闲分区F2相邻接,又分两种情况:

若相邻接,则将三个分区合并,修改新的空闲分区的首地址和长度。

新的首地址为F1的首地址,长度为三个分区长度之和,相应的代码为:

frees[i].length=frees[i].length+frees[i+1].length+len;

,并相应的空闲区表。

若不相邻接,即合并后的首应将回收区与插入点的前一分区合并,则不须为回收分区分配新的表项,只须修改其前一分区的大小。

该大小为F1与当前作业大小之和。

frees[i].length+=len;

2.回收分区与插入点前一个空闲分区不邻接但与后一空闲分区F2邻接。

此时应合并当前作业分区与F2分区,合并后的分区首地址为当前作业首地址start,长度为两个分区长度之和。

代码为:

frees[i].front=start;

frees[i].length+=len;

3.回收分区既不与插入点前一空闲分区相邻接,也不与后一空闲分区相邻接。

此时只须将该回收分区插入空闲区表即可。

此时空闲区的数量加1。

将回收区加入空闲区表后还须修改分配区表内容。

具体为:

修改分配区表中回收区(第一区)之后的各区指针,使其依次前移一位,即occupys[i]=occupys[i+1];

同时已分配分区数量减1,即occupy_quantity--;

最后输出内存空间回收完毕!

即完成了撤消作业并回收相应空间的操作。

图2.初始化空闲分区列表

图3.内存空间分配

图4.内存回收

4.实验总结

动态分区分配是根据进程的实际需要,动态地为之分配内存空间。

程序中采用空闲分区表,用于纪录每个空闲分区的情况。

每个空闲分区占一个表目,表目中包括起始地址、长度和状态。

采用已分配表,用于存放请求的作业,每个作业占一个表目,包括起始地址、长度和作业名。

程序调用initial()函数实现对空闲分区的初始化。

将作业装入内存时,运用首次适应分配算法。

程序中调用assign()实现,分配内存时,从表首开始查找,直至找到一个大小能满足要求的空闲分区为止;

然后再按照作业的大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲表中。

若不能找到满足要求的空闲区,则此次内存分配失败,返回。

回收内存,即撤销某些作业,调用撤销函数cancel(),根据所撤销作业的首址,从空闲区表中找到相应的插入点,回收内存包括四种情况:

(1)回收区与前一空闲分区相邻接,此时将回收区与前一分区合并,并修改前一分区的大小;

(2)回收区与后一空闲分区相邻接,此时将回收区与后一分区合并,并修改后一分区的首址和大小;

(3)回收区同时与前、后分区相邻接,则将三个分区合并,使用前一分区的首址,大小为三分区大小之和;

(4)回收区不与空闲分区相邻,则重新建立一新表项,填写首址和大小,插入表中相应位置。

函数show()用于显示空闲区表和已分配表时,运用for循环,依次显示每个空闲区表和已分配表的信息。

5.附录

#include<

stdlib.h>

stdio.h>

iostream.h>

string.h>

iomanip.h>

constintMAXJOB=5;

//定义表最大记录数

typedefstructnode

{

intfront;

intlength;

chardata[20];

}job;

//定义job类型的数据类型

jobfrees[MAXJOB];

//定义空闲区表

intfree_quantity;

joboccupys[MAXJOB];

//定义已分配区表

intoccupy_quantity;

//初始化并创建空闲分区表函数

intinitial()

inti;

frees[0].front=0;

frees[0].length=30;

occupys[0].front=0;

occupys[0].length=0;

strcpy(frees[0].data,"

free"

);

for(i=1;

i<

MAXJOB;

i++)

{

frees[i].front=frees[i-1].front+frees[i-1].length;

frees[i].length=frees[i-1].length+20;

strcpy(frees[i].data,"

occupys[i].front=0;

occupys[i].length=0;

strcpy(occupys[i].data,"

"

}

free_quantity=MAXJOB;

occupy_quantity=0;

return1;

}

//显示函数

voidshow()

printf("

----------------------------------------------------------\n"

当前空闲分区表如下:

\n"

起始地址长度状态\n"

for(i=0;

free_quantity;

{

printf("

%5d%8d%s\n"

frees[i].front,frees[i].length,frees[i].data);

}

当前已分配表如下:

起始地址长度占用作业名\n"

occupy_quantity;

%5d%6d%s\n"

occupys[i].front,occupys[i].length,occupys[i].data);

//首次适应分配算法

voidassign()

charjob_name[20];

intjob_length;

inti,j,flag,t;

请输入新申请内存空间的作业名和空间大小:

"

scanf("

%s"

job_name);

%d"

&

job_length);

flag=0;

if(frees[i].length>

=job_length)//如果空闲空间I的长度>

=作业长度

flag=1;

//空闲标志位就置1

if(flag==0)

对不起,当前没有能满足你申请长度的空闲内存,请稍候再试!

else

t=0;

i=0;

while(t==0)//为空闲区间的时候

=job_length)

t=1;

i++;

//如果空闲空间I的长度不大于作业长度,I加1,判断下一个空间

i--;

occupys[occupy_quantity].front=frees[i].front;

//把未用的空闲空间的首地址付给已用空间的首地址

strcpy(occupys[occupy_quantity].data,job_name);

//已用空间的内容为作业名

occupys[occupy_quantity].length=job_length;

//已用空间的长度为作业的长度

occupy_quantity++;

//已用空间数量加1

job_length)//如果空间的长度大于作业的长度,

frees[i].front+=job_length;

//空闲空间的起始首地址=原空闲区间的起始长度加作业长度

frees[i].length-=job_length;

//空闲区间的长度=原空闲区间的长度-作业的长度

else//如果空间的长度=作业的长度

for(j=i;

j<

free_quantity-1;

j++)

frees[j]=frees[j+1];

//空闲区间前移一位

free_quantity--;

//空闲区间的数量减一

内存空间分配成功!

//撤消作业

voidcancel()

inti,j,flag,p=0;

intstart;

intlen;

请输入要撤消的作业名:

if(!

strcmp(occupys[i].data,job_name))//当输入作业名匹配时

flag=i;

//把i的值赋给flag;

start=occupys[i].front;

//把已用空间的首地址赋给start

len=occupys[i].length;

//把已用空间的长度赋给len

没有这个作业名,请重新输入作业名!

{//加入空闲表

if((frees[i].front+frees[i].length)==start)//上空

if(((i+1)<

free_quantity)&

&

(frees[i+1].front==start+len))//下空

//第i个空闲区间的长度=第i个空闲区间的长度+第i+1个空闲区间的长度(下空闲区)+length

frees[i].length=frees[i].length+frees[i+1].length+len;

for(j=i+1;

frees[j]=frees[j+1];

free_quantity--;

//空闲区的数量渐少了一个

p=1;

else

frees[i].length+=len;

//(上空下不空)第i个空闲区间的长度=第i个空闲区间的长度+length,空闲区个数不变

p=1;

if(frees[i].front==(start+len))//下空上不空

frees[i].front=start;

//起始地址等于待回收地址

//第i个空闲区间的长度=第i个空闲区间的长度+length

if(p==0)//上下空闲区都不空(直接在空闲区表中找一个空表目,将其内容插入)

frees[free_quantity].front=start;

frees[free_quantity].length=len;

free_quantity++;

//空闲区的数量加1

//删除分配表中的该作业

for(i=flag;

occupys[i]=occupys[i+1];

occupy_quantity--;

//已用的区的数量

内存空间回收完毕!

//主函数

voidmain()

intflag=0;

intt=1;

intchioce=0;

|--------------------------------------------------|\n"

|    可变分区存储管理模拟系统     |\n"

|菜单:

(0)退出    |\n"

|        |\n"

|    

(1)申请空间 

(2)撤消作业|\n"

|    (3)显示空闲表和分配表|\n"

initial();

flag=initial();

while(flag==1)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"

请选择:

scanf("

chioce);

switch(chioce)

case1:

assign();

break;

case2:

cancel();

case3:

show();

case0:

flag=0;

default:

printf("

选择错误!

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2