操作系统内存buddy算法和页置换算法实验报告Word下载.docx

上传人:b****1 文档编号:15392200 上传时间:2022-10-29 格式:DOCX 页数:25 大小:419.10KB
下载 相关 举报
操作系统内存buddy算法和页置换算法实验报告Word下载.docx_第1页
第1页 / 共25页
操作系统内存buddy算法和页置换算法实验报告Word下载.docx_第2页
第2页 / 共25页
操作系统内存buddy算法和页置换算法实验报告Word下载.docx_第3页
第3页 / 共25页
操作系统内存buddy算法和页置换算法实验报告Word下载.docx_第4页
第4页 / 共25页
操作系统内存buddy算法和页置换算法实验报告Word下载.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

操作系统内存buddy算法和页置换算法实验报告Word下载.docx

《操作系统内存buddy算法和页置换算法实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《操作系统内存buddy算法和页置换算法实验报告Word下载.docx(25页珍藏版)》请在冰豆网上搜索。

操作系统内存buddy算法和页置换算法实验报告Word下载.docx

分析:

总的内存大小固定(默认为2048),申请内存的时候用到随机函数,为了使分配效果更加突出,每次申请内存大小为1——600。

每次申请完并成功分配后,得到剩余内存大小availMemory和碎片大小fragment[],来得到分配失败的原因。

分配成功的内存集记录为haveAllo[],在haveAllo[]中随机抽取内存进行释放。

2、要求:

首先用srand()和rand()函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算出相应的命中率。

可以直接忽略指令的内容,按照地址来进行分析,这样是执行更加方便。

各个算法总体相同,主要区别就是置换的条件不同,掌握好条件是本实验的关键。

四、具体实现

4.1流程图:

1、分配内存:

释放内存:

 

2、

(1)最佳置换算法(Optimal)

(2)先进先出法(FisrtInFirstOut)

(3)最近最久未使用(LeastRecentlyUsed)4)最不经常使用法(LeastFrequentlyUsed)

4.2数据结构定义:

1、

typedefstructMemoryTree{

structMemoryTree*left;

structMemoryTree*right;

structMemoryTree*father;

inttab;

intthisMemory;

intused;

}TreeNode,*Mtree;

内存节点定义:

tab为可用标记,1为可用,0为已用

thisMemory表示此节点共有内存量

used表示已用内存量

intAlloMemory(inttoBeAllo,Mtreeroot)

分配内存

voidReleaseMemory(inttoBeRele,Mtreeroot)

释放内存

voidDelete(inta[],intnum)

从数组a中删除元素num,该函数用于内存释放。

voidScanMemory(Mtreeroot)

浏览分配树,以得到可用内存和碎片

2、

voidinit_addr(void)

初始化指令序列,并按照一定规则执行

voidinit_page(void)

初始化页表

intisIn(inta)

判断地址为a的指令是否在页中

intfind_max(intnum,intdata[])

找出data序列中第一个最大值的序号

intfind_min(intnum,intdata[])

找出data序列中第一个最小值的序号

floatoptimal(void)

optimal算法,返回命中率

floatFIFO(void)

FIFO算法,返回命中率

floatLRU(void)

LRU算法,返回命中率

floatLFU(void)

LFU算法,返回命中率

五、调试运行结果

1、假设有3次分配,然后释放。

结果如下:

若分配次数增加,假设变为7次,结果如下:

我们发现,出现两次碎片过多引起的分配失败。

释放过程只释放5次就结束了,不会释放非配失败的内存:

2、我们进行对页表大小为1、5、10、15、20、25、32来进行模拟,结果如下:

(1)页表大小为1

(2)页表大小为5

(3)页表大小为10(4)页表大小为15

(5)页表大小为20(6)页表大小为25

(7)页表大小为32

六、所遇问题及解决办法

1、P:

在数组传递参数时出错

A:

发现很多需要传递的数组时贯穿全局的,所以设置为全局变量,不再进行参数的传递

2、P:

在合并可用伙伴内存的时候不知道如何去进行未知次数的合并

调用递归,进行树的后续遍历,先合并再判断,使问题迎刃而解。

3、P:

在分配指令序列的时候,没有考虑到极端情况:

如有320条指令,第一次随机的m为320,第m+1条指令不存在。

把此时的第m条指令作为地址流中的一个,此处理不影响全局的概率。

附:

程序代码:

1、内存分配与释放:

#include<

stdio.h>

stdlib.h>

time.h>

#defineMEMORY2048

intavailable[100],avaiNum=0,avaiMemory=MEMORY;

intfragment[100],fragNum=0;

{

if(toBeAllo>

avaiMemory){

return0;

}elseif(toBeAllo>

root->

thisMemory){

return-1;

thisMemory/2){

if((root->

left==NULL)&

&

(root->

tab==0)){

root->

tab=1;

used=toBeAllo;

return1;

}else

return-1;

}elseif(root->

tab==1){

}else{

if(root->

left==NULL){

left=(Mtree)malloc(sizeof(TreeNode));

left->

tab=0;

thisMemory=root->

thisMemory/2;

used=0;

left=NULL;

right=NULL;

father=root;

right=(Mtree)malloc(sizeof(TreeNode));

right->

}

if(AlloMemory(toBeAllo,root->

left)!

=1)

returnAlloMemory(toBeAllo,root->

right);

else

}

}

Mtreetemp;

if(root!

=NULL){

ReleaseMemory(toBeRele,root->

left);

if((root->

tab==0)&

father!

=NULL)){

if((root->

father->

left==NULL)){

temp=root->

father;

temp->

}

}elseif((root->

tab==1)&

used==toBeRele)){

root->

}

inti=num;

while(a[i]!

='

\0'

){

a[i]=a[i+1];

i++;

if(root->

tab==0)

available[avaiNum++]=root->

thisMemory;

fragment[fragNum++]=root->

thisMemory-root->

used;

ScanMemory(root->

intmain()

inttimes,i,j,n,releNum;

intallocated,released;

intlabel;

//表明分配后的结果

inthaveAllo[256];

Mtreeinit=NULL;

pri

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

当前位置:首页 > 求职职场 > 职业规划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1