操作系统分页存储算法——页面置换

FIFO、LRU页面置换算法

在两个源程序中,都定义了以下数据:

问题:

FIFO算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页
面予以淘汰。LRU算法总是淘汰最近最久未使用的页面,即选择最近最久未访问
的页面予以淘汰。

#define InitPysiBlocks 3
#define MaxPages 20
int PysicalBlocks[InitPysiBlocks] = { -1,-1,-1 };
int PageSequence[30] = { 7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};

按照教材中FIFO、LRU算法描述进行算法设计

void FIFO(int py[],int pg[])//参数可以是指针
void LRU(int py[],int pg[])//参数可以是指针
FIFO算法
#include <stdio.h>

#define InitPysiBlocks 3
#define MaxPages 20


void main()
{
    void FIFO(int py[],int pg[]);
    int PysicalBlocks[InitPysiBlocks] = {-1,-1,-1};
    int PageSequence[20] = { 7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};
    FIFO(PysicalBlocks,PageSequence);
}

void FIFO(int py[],int pg[])
{

    int *flag=py;
    int Same;
    int j,i,k,max=0,m=0;
    printf("内存块:\n");
    printf("块1 块2 块3\n");

    //对3个物理块进行初始化
    for(i=0;i<20;i++)
    {
        for(j=0;j<3;j++)
        {
            if(py[j]==-1)// 判断是块否空
            {
                py[j]=pg[i];
                printf(" %d  ",py[i++]);
                if(j==2) printf("\n");
                continue;
            }
        }
        //确定所有物理块是否都满
        for(j=0;j<3;j++)
        {
            if(py[j]!=-1);
        }

        if(j==3)//块满后,扫描的此页如果块中有,直接扫描下一页,如果没有,则进行置换
        {
            Same=0;
            for(j=0;j<3;j++)//块满是否需要置换,Same=1,不需要置换
            {
                if(py[j]==pg[i])
                {
                    Same=1;
                    break;
                }
            }
            if(Same==1)
            {
                for(j=0;j<3;j++)//块满,存在相同页面,直接扫描下一页
                {
                    break;
                }
            }
            else//块满,不存在相同页面,发生置换
            {
                *flag = pg[i];
                if(flag==&py[InitPysiBlocks - 1])
                    flag = &py[0];
                else
                    flag++;
                printf("%2d  %2d  %2d 发生置换\n", py[0], py[1], py[2]);
                continue;
            }
        }
    }
}

结果:

在这里插入图片描述

LRU算法
#include <stdio.h>

#define InitPysiBlocks 3
#define MaxPages 20

void main()
{
    void LRU(int py[],int pg[]);
    int PysicalBlocks[InitPysiBlocks] = {-1,-1,-1};//对内存初始化-1表示空
    int PageSequence[20] = { 7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};
    LRU(PysicalBlocks,PageSequence);
}


void LRU(int py[],int pg[])
{
    int Same;
    int i,j,k,p,n,min;
    int flag[3],f;
    printf("内存块:\n");
    printf("块1 块2 块3\n");

    for(i=0;i<20;i++)//访问序列
    {
        n=0;

        for(k=0;k<3;k++)
        {
            flag[k]=0;
        }
        for(j=0;j<3;j++)
        {
            if(py[j]==-1)// 判断是块否空
            {
                py[j]=pg[i];
                printf(" %d  ",py[j]);
                if(j==2) printf("\n");
                break;
            }
        }
        //确定所有物理块是否都满
        for(j=0;j<3;j++)
        {
            if(py[j]!=-1);
        }
        if(j==3)//块满后,扫描的此页如果块中有,直接扫描下一页,如果没有,则进行置换
        {
            Same=0;
            for(j=0;j<3;j++)//块满是否需要置换,Same=1,不需要置换
            {
                if(py[j]==pg[i])
                {
                    Same=1;
                    break;
                }
            }
            if(Same==1)
            {
                for(j=0;j<3;j++)//块满,存在相同页面
                {
                    if(py[j]==pg[i])
                        break;
                }
            }
            else	//块满,不存在相同页面,发生置换
            {
                //找出最久未使用的块
                for (f = i ;f >= 0; f--) {
                    if(pg[f] == py[0]) flag[0]=1;
                    if(pg[f] == py[1]) flag[1]=1;
                    if(pg[f] == py[2]) flag[2]=1;
                    if(flag[0]+flag[1]+flag[2]==2){
                        min = 0;
                        for (n=0; n <3; n++){
                            if(flag[n]==0){
                                min = n;
                                break;
                            }
                        }
                    }
                }
                py[min] = pg[i];
                //输出置换后的内存
                printf("%2d  %2d  %2d 发生置换\n", py[0], py[1], py[2]);
                p++;
                continue;
            }

        }

    }

}

结果:

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【实验目的】 1. 通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解; 2. 熟悉虚存管理的各种页面淘汰算法; 3. 通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。 【实验准备】 1.虚拟存储器的管理方式  段式管理  页式管理  段页式管理 2.页面置换算法  先进先出置换算法  最近最久未使用置换算法  Clock置换算法  其他置换算法 【实验内容】 1. 实验题目 设计一个请求页式存储管理方案。并编写模拟程序实现之。产生一个需要访问的指令地址流。它是一系列需要访问的指令的地址。为不失一般性,你可以适当地(用人工指定地方法或用随机数产生器)生成这个序列,使得 50%的指令是顺序执行的。25%的指令均匀地散布在前地址部分,25%的地址是均匀地散布在后地址部分。为简单起见。页面淘汰算法采用 FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表中抹去。而不再判断它是否被改写过,也不将它写回到辅存。 2. 具体做法 产生一个需要访问的指令地址流;指令合适的页面尺寸(例如以 1K或2K为1页);指定内存页表的最大长度,并对页表进行初始化;每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页表未满,则调入一页并打印页表情况;如果该页不足主存且页表已满,则按 FIFO页面淘汰算法淘汰一页后调入所需的页,打印页表情况;逐个地址访问,直到所有地址访问完毕。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值