首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>编程开发>java>正文

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

http://www.oklinux.cn  2005-08-30  来源: oklinux收集整理  frog      会员收藏  游客收藏  【 】 
算法连载(7)--操作系统之3种页面置换算法
作者:  来自:  阅读次数: 58033 [大 中 小]
         

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


#include <iostream.h>

#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<Bsize; i++)
{
  block.content = -1;
  block.timer = 0;
}

page = new pageInfor[Psize];
for(i=0; i<Psize; i++)
{
  page.content = QString;
  page.timer = 0;
}
}

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

int PRA::findExist(int curpage)
{

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

return -1;
}

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

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

void PRA::display(void)
{


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


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

for(int i=0; i<Psize; i++)
{   
  exist = findExist(i);
  if(exist != -1)
  { cout<<"不缺页"<<endl; }
  else
  {   
   space = findSpace();
   if(space != -1)
   {
    block[space] = page;  
    display();
   }
   else
   {
     for(int k=0; k<Bsize; k++)
    for(int j=i; j<Psize; 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<Psize; i++)
{
  exist = findExist(i);
  if(exist != -1)
  {
       cout<<"不缺页"<<endl;
   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<Bsize; j++)
   block[j].timer++;
}
}

void PRA::FIFO(void)
{

int exist,space,position ;

for(int i=0; i<Psize; i++)
{
  exist = findExist(i);
  if(exist != -1)
   {cout<<"不缺页"<<endl;}

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

void PRA::BlockClear(void)
{
for(int i=0; i<Bsize; i++)
{
  block.content = -1;
  block.timer = 0;
}
}


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


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

}
发布时间:2005-4-15

[ Last edited by frog on 2005-10-23 at 16:17 ]

上一篇:《下载》21天学通C语言(第六版)   下一篇:自由软件发布方法惯例


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·《下载》21天学通C语言(第六版)
·自由软件发布方法惯例
·看看用哪个编程
·Gcc使用的内嵌汇编语法格式小教程
·算法-数据结构-链表
·最新visual c++6.0视频教学
·算法-数据结构-堆栈
·算法-数据结构-队列
·转 新新 的帖子
·算法-数据结构-二叉树
·由C#风潮想起的-给初学编程者的忠告
·算法-加密/解密-DES(数据加密标准)
·请问linux下java如何配制?
·算法-多线程编程-pthread
·PHP程序员的自我修炼:PHP编程风格
·算法-编译原理之词法分析器-状态机SM.确定性有限自
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·J2EE综合:如何实现javabean的属性拷贝
·关于Java数据对象JDO 2.0查询语言的特
·Java源码分析:深入探讨Iterator模式
·Java基础知识:谈谈简单Hibernate入门
·漫谈Java程序的性能优化
·设计及设计模式--面向对象的思维方式
·数据库相关--Hibernate的事务和并发
·Java 安全--java程序开发的程序的保护
·浅析Java学习从入门到精通
·一个用JAVA写的测算服务器响应速度程序
·软件测试:软件测试的基础知识概要介绍
·Java SE6调用Java编译器的两种新方法
  阅读排行
·Linux 上的 WebSphere MQ 开发快速入门
·C/C++头文件一览
·C++视频教程《下载》
·AspectJ学习笔记之Pointcut
·用gcc编译生成动态链接库*.so文件的方
·使用AJAX技术实现网页无闪自动局部刷新
·c++ builder视频教程
·spring中对hibernate的支持程度分析
·设定执行Java程序的Linux安全环境
·在Fedora8系统下搭建JSP开发环境的方法
·Linux系统中安装JAVA JDK.6的方法
·算法-编译原理之词法分析器-状态机SM
·最新visual c++6.0视频教学
·C语言程序设计讲课视频
·算法--数据结构--图的多重邻接链表表示
网摘收藏: