博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
操作系统:用c++实现FIFO(先进先出)和LRU(最近最久未使用)页面置换
阅读量:5150 次
发布时间:2019-06-13

本文共 2138 字,大约阅读时间需要 7 分钟。

关于下列算法:首先类似于书本中先将各物理块中初始化为空,这里空物理块用#代替,因为在物理块数的限度内,所有的页面都可以进入内存,所以一开始不需要使用算法,直接全部投入。

随后FIFO中:直接定义一个y值,每放入一个页面,y++,并且mod(物理块总数),这里的y类似于一个循环指针。

在LRU中:也定义一个y值,但是y不再是循环指针,而是每检测一个页面时,当出现缺页状态,便先算出最近最久未使用的页面是哪个物理块,然后将物理块的下标赋给y值,最后将下标所在的物理块里的页面置换出来。

#include<iostream>

#include<string>

using namespace std;

 

void FIFO(int b,string a);

void LRU(int b,string a);

int main()

{

       string a;

       int b;

       cout<<"请输入物理块数:";

       cin>>b;

       cout<<"请输入页面号引用串:";

       cin>>a;

       cout<<"采用FIFO页面置换算法的置换过程如下表:"<<endl;

    FIFO(b,a);

       cout<<"*********************************************"<<endl;

       cout<<"采用LRU页面置换算法的置换过程如下表:"<<endl;

       LRU(b,a);

       return 0;

}

void FIFO(int b,string a)

{

       char m[10]={'#','#','#','#','#','#','#','#','#','#'};//将物理块数内容初始化

       int i=0,j,x,y=0,count1=0;//y为置换标记,count1为缺页标记

       do{

              if(i<b)

              {

                     m[y]=a[i];//缺页后将页面写入

                     i++;

                     count1++;//缺页标记++

                     y=(y+1)%b;//置换标记++

                     cout<<a[i-1]<<" ";

                     for(j=0;j<b;j++)//打印

                            cout<<m[j];

                  cout<<endl;

                     continue;

              }

              for(j=0;j<b;j++)//判断是否缺页

              {

                     if(a[i]==m[j])//未缺页则将x赋值1

                     {

                            x=1;

                            break;

                     }

              }

              if(x==1)//未缺页处理

              {

                     i++;

                     x=0;

                     cout<<a[i-1]<<" "<<endl;

                     continue;

              }

              else//缺页处理

              {

                     m[y]=a[i];

                     i++;

                     y=(y+1)%b;

                     cout<<a[i-1]<<" ";

                     for(j=0;j<b;j++)//打印

                            cout<<m[j];

                  cout<<endl;

            count1++;

              }

       }while(a[i]!='#');

       cout<<"页面缺页次数"<<"  "<<"页面置换次数"<<endl;

       cout<<"     "<<count1<<"           "<<count1-b<<endl;;

       /*打印置换次数和缺页次数*/

}

void LRU(int b,string a)

{

       char m[10]={'#','#','#','#','#','#','#','#','#','#'};

       int i=0,j,x,y=0,count1=0,min=10000;//min为最久未使用的初始值

       cout<<"置换过程如下表"<<endl;

       do{

              if(i<b)

              {

                     m[y]=a[i];//缺页后将页面写入

                     i++;

                     count1++;//缺页标记++

                     y=y+1;//置换标记++

                     cout<<a[i-1]<<" ";

                     for(j=0;j<b;j++)//打印

                            cout<<m[j];

                  cout<<endl;

                     continue;

              }

              for(j=0;j<b;j++)//判断是否缺页

              {

                     if(a[i]==m[j])

                     {

                            x=1;

                            break;

                     }

              }

              if(x==1)//未缺页才处理

              {

                     i++;

                     x=0;

                     cout<<a[i-1]<<" "<<endl;

 

                     continue;

              }

              else//缺页处理

              {

                     for(j=0;j<b;j++)//查找最久未使用的页面

                     {

                            for(int t=i-1;t>=0;t--)

                            {

                                   if(m[j]==a[t])

                        break;

                            }

                            if(t<min)

                            {

                                   min=t;

                                   y=j;

                            }

                     }

                     m[y]=a[i];//置换最久未使用的页面

                     min=10000;//将min初始化

                     i++;

                     cout<<a[i-1]<<" ";

                     for(j=0;j<b;j++)//打印

                            cout<<m[j];

                  cout<<endl;

            count1++;

              }

       }while(a[i]!='#');

       cout<<"页面缺页次数"<<"  "<<"页面置换次数"<<endl;

       cout<<"     "<<count1<<"           "<<count1-b<<endl;

       /*打印页面缺页次数和页面置换次数*/

}

//测试数据70120304230321201701#

 

转载于:https://www.cnblogs.com/RiverChen/p/10963122.html

你可能感兴趣的文章
HTML5简单入门系列(四)
查看>>
AndroidStudio快捷键
查看>>
实现字符串反转
查看>>
转载:《TypeScript 中文入门教程》 5、命名空间和模块
查看>>
苹果开发中常用英语单词
查看>>
[USACO 1.4.3]等差数列
查看>>
Shader Overview
查看>>
Reveal 配置与使用
查看>>
Java中反射的学习与理解(一)
查看>>
nginx配置socket服务
查看>>
C语言初学 俩数相除问题
查看>>
博客园安家--写给自己
查看>>
B/S和C/S架构的区别
查看>>
[Java] Java record
查看>>
jQuery - 控制元素显示、隐藏、切换、滑动的方法
查看>>
postgresql学习文档
查看>>
Struts2返回JSON数据的具体应用范例
查看>>
js深度克隆对象、数组
查看>>
c++ 贪吃蛇
查看>>
socket阻塞与非阻塞,同步与异步
查看>>