内存管理Word文档下载推荐.docx
《内存管理Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《内存管理Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
![内存管理Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2023-1/15/a519d1db-84aa-475b-8f19-1736e5589b69/a519d1db-84aa-475b-8f19-1736e5589b691.gif)
intmemory;
//页面对应的内存物理块号
intflag;
//状态标志,判断页面是否在内存,0页在内存,1页在辅存
};
(2)页框结构体:
structMem
intnum;
boolfree;
inttime;
(3)算法中涉及到的主要变量:
Pagepage_table[20];
//页表
Memmem_table[20];
//叶匡
intfangwenadd[20];
//访问地址流
intfangwenye[20];
//访问页流
intpage_size=1024;
//页面大小,单位byte
intmemory_size=0;
//物理块的大小
intprocess_size;
//进程大小
intpage_num;
//页面数
intM;
//访问地址个数
intmemory_num;
//物理块的个数
(4)主要函数说明:
intnum(intx,inty)//用来取得页面数,根据进程大小,范围页数
intcount_page_num(intaddress)//统计页数
voidinit(void)//初始化
boolcheck_in_page_table(intyehao)//检查访问的页号是否在内存中
boolcheck_in_mem(intyehao)//检查是否在内存中
intcheck_mem_free(void)//检查页框是否有空闲的,空闲的话返回空闲物理块号,没有空闲的返回-1
voidtimeup(void)//时间加1函数
intgetmax(void)//求出那个物理块中的页面呆的时间最长,返回物理块号
intgetpagenum(intmem_num)//根据物理块号获取页表号
voidprintpage(void)//打印页表函数
voidstart(void)//FIFO算法实现
2.2主要代码:
voidstart(void)
for(inti=0;
i<
M;
i++)
{
printf("
第%d个访问地址:
\n"
i+1);
if(check_in_page_table(fangwenye[i]))
{
if(check_in_mem(fangwenye[i]))
{
printf("
访问的地址在内存中!
);
printpage();
}
elseif(check_mem_free()>
=0)
inttempnum=check_mem_free();
mem_table[tempnum].free=false;
mem_table[tempnum].time=1;
page_table[fangwenye[i]].memory=tempnum;
page_table[fangwenye[i]].flag=0;
访问地址不在内存中,存在空闲物理块,调入页:
else
intmempage=getmax();
inttemppage=getpagenum(mempage);
page_table[temppage].flag=1;
page_table[temppage].memory=-1;
page_table[fangwenye[i]].memory=mempage;
mem_table[mempage].time=1;
访问的地址不在内存中,不存在空闲物理块,淘汰fi,调入页:
}
else
printf("
访问的地址超出范围!
\n\n"
timeup();
getchar();
}
}
intcheck_mem_free(void)
inttemp=-1;
i<
memory_num;
i++)
if(mem_table[i].free)
temp=i;
returntemp;
voidtimeup(void)
if(mem_table[i].time>
0)
mem_table[i].time++;
intgetmax(void)/*求出那个物理块中的页面呆的时间最长,返回物理块号*/
intmax=-1;
inttag=0;
memory_num;
max)
{
max=mem_table[i].time;
tag=i;
returntag;
intgetpagenum(intmem_num)
page_num;
if(page_table[i].memory==mem_num)
3.实验总结
在本次操作系统试验中,我采用C++实现请求分页存储管理方式的内存管理模拟,采用FIFO淘汰页面算法。
首先,应了解虚拟存储器和分也是存储管理的有关内容,并掌握FIFO算法的思想及流程。
然后,在这个基础上,结合编程方法,编写正确的程序实现。
在检查过程中,发现存在一些问题,比如,数据的确定方式,是用户确定,还是系统默认,等等,在老师的指导后,重新修改算法和实现,发现程序的可行性和实际应用性更强。
在这次实验中收获很多,谢谢老师的指导和同学的帮忙。
附录
源代码:
#include<
stdio.h>
structPage
intnum(intx,inty)
inttemp=x%y;
if(temp==0)
returnx/y;
else
return(x/y+1);
intcount_page_num(intaddress)
intpage_nums;
page_nums=num(address,page_size);
returnpage_nums;
voidinit(void)//初始化
printf("
输入进程大小(单位byte):
"
scanf("
%d"
&
process_size);
page_num=num(process_size,page_size);
page_table[i].page=i;
page_table[i].memory=-1;
page_table[i].flag=1;
初始化成功!
*************************************************\n"
进程信息:
进程大小:
%dbytes\n"
process_size);
进程页数:
%d页\n"
page_num);
页面大小:
page_size);
*************************************************\n\n"
boolcheck_in_page_table(intyehao)//检查访问的页号是否在内存中
booltemp=false;
if(yehao<
page_num)
temp=true;
boolcheck_in_mem(intyehao)//检查是否在内存中
if(page_table[yehao].flag==0)
temp=false;
voidprintpage(void)
***************页表情况如下:
*************\n"
页号物理块号标记位\n"
for(intx=0;
x<
page_num;
x++)
%3d%14d%11d\n"
page_table[x].page,page_table[x].memory,page_table[x].flag);
voidstart(void)
voidmain(void)
**************操作系统内存管理模拟***************\n"
init();
请输入物理块的个数:
memory_num);
for(inty=0;
y<
y++)
mem_table[y].num=y;
mem_table[y].free=true;
mem_table[y].time=0;
请输入访问地址个数M="
M);
请输入物理块大小:
memory_size);
请输入访问地址:
第%d个:
scanf("
fangwenadd[i]);
for(intj=0;
j<
j++)
fangwenye[j]=count_page_num(fangwenadd[j]);
x<
x++)
%d"
fangwenye[x]);
start();