热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

算法--操作系统--3种页面置换算法

算法--操作系统--3种页面置换算法--Linux通用技术-Linux编程与内核信息,下面是详情阅读。
算法连载(7)--操作系统之3种页面置换算法
作者: 来自: 阅读次数: 58033 [大 中 小]


1.问题描述及设计思想:在进程运行过程中,若其所要访问的页面不在内存需把它们调入内存,但内存已无空闲空间时,为了保证该进程能正常运行,系统必须从内存中调出一页程序或数据,送磁盘的对换区中。但应将哪个页面调出,所以需要根据一定的算法来确定。以下分别是三个算法的设计思想。
OPTIMAL:最佳置换算法。其所选择的被淘汰页面,将是以后永不使用的,或是在最长(未来)时间内不再被访问的页面。
FIFO:先进先出置换算法。该算法总是淘汰最先进入内存的页面,既选择在内存中驻留时间最久的页面予以淘汰。
LRU:最近最久未使用置换算法。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间T,当须淘汰一个页面时,选择现有页面中其T值最大的给予淘汰。


#include

#define Bsize 3
#define Psize 20

struct pageInfor
{
int content;//页面号
int timer;//被访问标记
};

class PRA
{
public:
PRA(void);
int findSpace(void);//查找是否有空闲内存
int findExist(int curpage);//查找内存中是否有该页面
int findReplace(void);//查找应予置换的页面
void display(void);//显示
void FIFO(void);//FIFO算法
void LRU(void);//LRU算法
void Optimal(void);//OPTIMAL算法
void BlockClear(void);//BLOCK恢复
pageInfor * block;//物理块
pageInfor * page;//页面号串

private:

};

PRA::PRA(void)
{
int QString[20]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};

block = new pageInfor[Bsize];
for(int i=0; i {
block.cOntent= -1;
block.timer = 0;
}

page = new pageInfor[Psize];
for(i=0; i {
page.cOntent= QString;
page.timer = 0;
}
}

int PRA::findSpace(void)
{
for(int i=0; i if(block.cOntent== -1)
return i;//找到空闲内存,返回BLOCK中位置
return -1;
}

int PRA::findExist(int curpage)
{

for(int i=0; i if(block.cOntent== page[curpage].content)
return i;//找到内存中有该页面,返回BLOCK中位置

return -1;
}

int PRA::findReplace(void)
{
int pos = 0;

for(int i=0; i if(block.timer >= block[pos].timer)
pos = i;//找到应予置换页面,返回BLOCK中位置
return pos;
}

void PRA::display(void)
{


for(int i=0; i if(block.content != -1)
cout<.content<<" ";
cout< }


void PRA::Optimal(void)
{
int exist,space,position ;

for(int i=0; i {
exist = findExist(i);
if(exist != -1)
{ cout<<"不缺页"< else
{
space = findSpace();
if(space != -1)
{
block[space] = page;
display();
}
else
{
for(int k=0; k for(int j=i; j {
if(block[k].content != page[j].content)
{ block[k].timer = 1000; }//将来不会用,设置TIMER为一个很大数
else
{
block[k].timer = j;
break;
}
}
position = findReplace();
block[position] = page;
display();
}
}
}
}

void PRA::LRU(void)
{
int exist,space,position ;

for(int i=0; i {
exist = findExist(i);
if(exist != -1)
{
cout<<"不缺页"< block[exist].timer = -1;//恢复存在的并刚访问过的BLOCK中页面TIMER为-1
}
else
{
space = findSpace();
if(space != -1)
{
block[space] = page;
display();
}
else
{
position = findReplace();
block[position] = page;
display();
}
}
for(int j=0; j block[j].timer++;
}
}

void PRA::FIFO(void)
{

int exist,space,position ;

for(int i=0; i {
exist = findExist(i);
if(exist != -1)
{cout<<"不缺页"<
else
{
space = findSpace();
if(space != -1)
{
block[space] = page;
display();
}
else
{
position = findReplace();
block[position] = page;
display();
}
}
for(int j=0; j block[j].timer++;//BLOCK中所有页面TIMER++
}
}

void PRA::BlockClear(void)
{
for(int i=0; i {
block.cOntent= -1;
block.timer = 0;
}
}


void main(void)
{
cout<<"|----------页 面 置 换 算 法----------|"< cout<<"|---power by zhanjiantao(028054115)---|"< cout<<"|-------------------------------------|"< cout<<"页面号引用串:7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1"< cout<<"----------------------------------------------------"< cout<<"选择<1>应用Optimal算法"< cout<<"选择<2>应用FIFO算法"< cout<<"选择<3>应用LRU算法"< cout<<"选择<0>退出"< int select;
PRA test;


while(select)
{
cin>>select;
switch(select)
{
case 0:
break;
case 1:
cout<<"Optimal算法结果如下:"< test.Optimal();
test.BlockClear();
cout<<"----------------------"< break;
case 2:
cout<<"FIFO算法结果如下:"< test.FIFO();
test.BlockClear();
cout<<"----------------------"< break;
case 3:
cout<<"LRU算法结果如下:"< test.LRU();
test.BlockClear();
cout<<"----------------------"< break;
default:
cout<<"请输入正确功能号"< break;
}

}

}
发布时间:2005-4-15

[ Last edited by frog on 2005-10-23 at 16:17 ]
推荐阅读
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文探讨如何设计一个安全的加密和验证算法,确保生成的密码具有高随机性和低重复率,并提供相应的验证机制。 ... [详细]
  • 深入解析:手把手教你构建决策树算法
    本文详细介绍了机器学习中广泛应用的决策树算法,通过天气数据集的实例演示了ID3和CART算法的手动推导过程。文章长度约2000字,建议阅读时间5分钟。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • 在给定的数组中,除了一个数字外,其他所有数字都是相同的。任务是找到这个唯一的不同数字。例如,findUniq([1, 1, 1, 2, 1, 1]) 返回 2,findUniq([0, 0, 0.55, 0, 0]) 返回 0.55。 ... [详细]
  • 本文探讨了卷积神经网络(CNN)中感受野的概念及其与锚框(anchor box)的关系。感受野定义了特征图上每个像素点对应的输入图像区域大小,而锚框则是在每个像素中心生成的多个不同尺寸和宽高比的边界框。两者在目标检测任务中起到关键作用。 ... [详细]
author-avatar
K_M_睡到自然醒cES_881
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有