- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
存储管理的页面置换算法
存储管理的页面置换算法在考试中常常会考到,操作系统教材中主要介绍了3种常用的页面置换算法,分别是:先进先出法(FIFO)、最佳置换法(OPT)和最近最少使用置换法(LRU)。大家要理解3种置换算法的含义,然后能熟练地运用在具体的练习中就可以了。
为什么要进行页面置换
在请求分页存储管理系统中,由于使用了虚拟存储管理技术,使得所有的进程页面不是一次性地全部调入内存,而是部分页面装入。
这就有可能出现下面的情况:要访问的页面不在内存,这时系统产生缺页中断。操作系统在处理缺页中断时,要把所需页面从外存调入到内存中。如果这时内存中有空闲块,就可以直接调入该页面;如果这时内存中没有空闲块,就必须先淘汰一个已经在内存中的页面,腾出空间,再把所需的页面装入,即进行页面置换。
有助于理解的关键词有:请求分页、虚拟存储、缺页中断、页面置换。
先进先出法(FIFO)
算法描述:由于认为最早调入内存的页不再被使用的可能性要大于刚调入内存的页,因此,先进先出法总是淘汰在内存中停留时间最长的一页,即先进入内存的页,先被换出。先进先出法把一个进程所有在内存中的页按进入内存的次序排队,淘汰页面总是在队首进行。如果一个页面刚被放入内存,就把它插在队尾。
【例1】教材第4章课后习题。
考虑下述页面走向:1,2,3,4,2,1,5,6,2,1,2,3,7,6,3,2,1,2,3,6。当内存块数量分别为3,5时,试问先进先出置换算法(FIFO)的缺页次数是多少?(注意,所有内存块最初都是空的,凡第一次用到的页面都产生一次缺页。)
解:当内存块数量分别为3时,FIFO算法的执行过程如下图所示。
打叉的表示发生了缺页,共缺页16次。
提示:当FIFO算法执行到蓝色的4号页面时,这时内存中有三个页面,分别是1,2,3。按照FIFO算法,在内存中停留时间最长的页面被淘汰。三个页面在内存中的停留时间用绿色区域标记出来了,可见,1号页面是停留时间最长的,因此要淘汰1号页面。
当内存块数量分别为5时,共缺页10次。FIFO算法的执行过程如下。
优缺点:先进先出法(FIFO)简单易于实现,但是性能不好,存在Belady现象。例如对于以下页面:1,2,3,4,1,2,5,1,2,3,4,5,当内存块为3时,出现9次缺页中断;当内存块为4时,出现10次缺页中断。缺页率随着内存块增加而增加的现象,称为Belady现象。有兴趣的同学可以试一试,看看是不是这样的。
代码:
#include iostream
using namespace std;
#includevector
#include deque
//ram 模拟系统为进程分配的3个内存块
dequeint ram(3);
int length=0;
//检测是否在内存中
int isContain(int findNum)
{
int i;
for (i=0;iram.size();i++)
{
if (findNum==ram[i])
break;
}
return i;
}
//缺页中断 将缺少的页调入内存 同时将最早进来的页调出
int intServer(int page)
{
if(length!=ram.size())
{
ram[length]=page;
length++;
}
else
{
ram.pop_front();
ram.push_back(page);
}
return 0;
}
//显示3个内存块中存放的页面号
void display()
{
int i;
cout内存块中存放的页面号:;
for (i=0;iram.size();i++)
{
printf(%2d ,ram[i]);
}
coutendl;
}
int main()
{
//
int i=0;
for (i=0;iram.size();i++ )
{
ram[i]=0;
}
//该模拟进程总共有20条指令 instructes[i] 为i条指令所在页
int instructes[21]={0};
srand(122055105);
//随机产生指令所在的页
for(int i=1;i=20;i++)
{
//该模拟进程指令或数据分布在6个页面中
//分别为第 1,2,3,4,5,6 页
instructes[i]=rand()%6+1;
//cout第i条指令所在页instructes[i]endl;
printf(第%2d指令所在页%d \n,i,instructes[i]);
}
int count=0;
for ( i=1;i=20;i++)
{
原创力文档


文档评论(0)