操作系统试验—页面置换算法

本文详细介绍了OPT页面置换算法在内存管理中的应用,通过实验实例探讨了如何计算缺页次数、页面置换次数和缺页率。通过实际操作演示,理解了最佳淘汰策略如何减少内存碎片,提升系统效率。

实验内容:

已知页面访问序列,采用下列页面置换算法,求缺页次数、页面置换次数和缺页率。
OPT算法;

实验目的:

了解内存分页管理策略 掌握一些基本的页面置换算法

实验原理:问题分析及算法设计

1、 虚拟存储系统
UNIX中,为了提高内存利用率,提供了内外存进程对换机制;内存空间的分配和回收均以页为单位进行;一个进程只需将其一部分(段或页)调入内存便可运行;还支持请求调页的存储管理方式。
当进程在运行中需要访问某部分程序和数据时,发现其所在页面不在内存,就立即提出请求(向CPU发出缺中断),由系统将其所需页面调入内存。这种页面调入方式叫请求调页。为实现请求调页,核心配置了四种数据结构:页表、页框号、访问位、修改位、有效位、保护位等。
2、页面置换算法
当CPU接收到缺页中断信号,中断处理程序先保存现场,分析中断原因,转入缺页中断处理程序。该程序通过查找页表,得到该页所在外存的物理块号。如果此时内存未满,能容纳新页,则启动磁盘I/O将所缺之页调入内存,然后修改页表。如果内存已满,则须按某种置换算法从内存中选出一页准备换出,是否重新写盘由页表的修改位决定,然后将缺页调入,修改页表。利用修改后的页表,去形成所要访问数据的物理地址,再去访问内存数据。整个页面的调入过程对用户是透明的。
最佳淘汰算法(OPT):选择永不使用或在未来最长时间内不再被访问的页面予以替换。

实验源代码:

  #include<stdio.h>
#include<stdlib.h>
#define PN 20//页面访问列长度
#define FN 3//分配给进程的内存块数

int *pageSeq;//页面访问序列
int *frames;//内存块数组
int fault,exchange;//缺页次数和置换次数
float ratio;//缺页率

void init();//初始化页面访问向量
void clear();//初始化内存块
void print();//输出最后结果
void print1(int);//输出每一步结果
void OPT(int*,int,int*,int);//OPT算法
int search(int,int*,int,int);//搜索页面在序列某段中的位置,找到返回下标,否则返回-1

int main()
{
    int num;
    init();//初始化页面访问向量
    printf("操作说明:\n");
    printf("    num=0  程序结束\n");
    printf("    num=1  OPT算法\n");
    printf("==============================\n");
    printf("\n");
    printf("输入操作序号num:");
    scanf("%d",&num);
    while(1)
    {
        switch(num)
        {
            case 0:printf("\n=====程序结束!=====\n");return 0;
            case 1:printf("\n【OPT算法】\n");OPT(pageSeq,PN,frames,FN);break;
            default:printf("\n=====重新输入=====\n");goto L1;
        }
        print();
L1:     printf("\n");
        printf("输入操作序号num:");
        scanf("%d",&num);
    }
}

void init()//输入访问序列
{
    int i;
    pageSeq=(int*)(malloc(PN*sizeof(int)));
    frames=(int*)(malloc(FN*sizeof(int)));
    printf("向pageSeq输入页面访问序列:");
    for(i=0;i<PN;i++)
        scanf("%d",&pageSeq[i]);
    printf("\n");
    printf("页面访问序列:\n\n");//输出页面访问序列
    for(i=0;i<PN;i++)
        printf("%3d",pageSeq[i]);
    printf("\n\n");
    printf("===============================================================\n");
}

void clear()//重新初始化内存块frames,因为有0号页面,所以置-1
{
    int i;
    fault=0;//缺页次数
    exchange=0;//置换次数
    for(i=0;i<FN;i++)//内存块置-1
        frames[i]=-1;
}

void print1(int flag)//flag为缺页标志,输出每一步结果
{
    int t;
    for(t=0;t<FN;t++)//每访问一个页面,都输出一次内存块(页面)
        printf("%3d",frames[t]);
    if(flag) printf("  fault");//在缺页位置标记“fault”
    printf("\n");
}

void print()//输出最后结果
{
    exchange=fault-FN;
    ratio=(float)fault/PN*100;
    printf("------------------------------\n");
    printf("缺页次数:%d\n",fault);
    printf("置换次数:%d\n",exchange);
    printf("缺 页 率:%4.1f%%\n",ratio);
    printf("==============================\n");
}

int search(int p,int* ar,int start,int end)//参数说明:(页号,页面访问序列或者内存块数组,起点,终点)
{//检测页面p是否存在数组ar中(起点start,终点end),存在则返回其在ar中的位置(下标),否则返回-1
    int i,f;
    if(start>end)f=-1;//f作为方向标志,f=1时,循环变量递增;f=-1时,循环变量递减
    else f=1;
    i=start;//从strat位置开始搜索
    while(i!=end+f)//i超过end时结束循环
    {//在OPT算法中,start<end,循环变量递增,f=1;而在LRU算法中则相反,f=-1
        if(p==ar[i])return i;//首次搜索到p即返回下标
        i=i+f;
    }
    return -1;//未搜索到页面p,即p在未来不再被访问
}

void OPT(int* arp,int p,int* arf,int f)
{//参数说明:(页面访问序列数组,数组长度,内存块数组,数组长度)
    int i=0,j,flag;
    int kf=0;//kf为进入内存页面数,当kf>=f时,内存块满,此时缺页产生置换,且kf的值不再增加
    int kp;//搜索起点,即页面访问序列中当前页的下一位置
    int posi,pmaxi,pmaxj;//未来最久不使用页面在arp和arf中的位置
    clear();//内存块数据清零
    printf("页面访问过程:\n");
    printf("------------------------------\n");
    for(i=0;i<p;i++)//扫描页面序列
    {
        flag=0;//缺页标志,初值置0,不缺页
        if(search(arp[i],arf,0,f-1)==-1)//页不在内存
        {
            flag=1;//缺页,flag置1
            fault++;//缺页+1
            if(kf<f)//有空闲内存块,无置换
            {
                arf[kf]=arp[i];//页面直接调入内存块arf[kf]中
                kf++;//当内存块放满页面后,kf不再增加
            }
            else//没有空闲内存块,将产生置换
            {
               kp=i+1; //设置页面访问序列arp中向后搜索的起点,选择淘汰页面
               pmaxi=-1;//被淘汰页面在访问序列arp中的位置,初值置-1
               for(j=0;j<f;j++)
               {//对内存arf中的每个页面依次查找其在访问序列arp中(未来)第一次出现的位置,并存放在posi中
                   posi=search(arf[j],arp,kp,p-1);
                   if(posi==-1)//search()返回-1,说明该页面在未来不存在,即不会再被访问到
                   {
                       arf[j]=arp[i];//置换并终止循环
                       break;
                   }
                   if(posi>pmaxi)
                   {//search()返回值不是-1,则记录最久未使用页面在访问序列arp中的位置
                       pmaxi=posi;//记录最大位置
                       pmaxj=j;//记录最久未使用页面在内存arf中的位置
                   }
               }
               if(j>=f)arf[pmaxj]=arp[i];//当内存块数组arf中所有页面在未来都会被访问到时,置换
            }
        }
        print1(flag);//输出一次内存页面情况
    }
}

实验结果:(截图)

输入实例7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1。
在这里插入图片描述

实验总结:(心得体会)

OPT算法:最佳置换算法(Optimal Replacement,
OPT)其实质是:为调入新页面而必须预先淘汰某个老页面时,所选择的老页面应在将来不被使用,或者是在最远的将来才被访问。
优点:保证有最小缺页率。
本次我的操作系统实验期间对作品进行了构想、思考、制作、完善,经历了这次实验让对知识点进行了系统化的学习,也让自己认识到了自己的不足。本次实验后,也让我深深地明白程序从算法的具体步骤,和一个系统应该具有哪些要素。相信在下一次的实验中我可以做的更好。

一、实验题目:页面置换算法(请求分页) 二、实验目的: 进一步理解父子进程之间的关系。 1) 理解内存页面调度的机理。 2) 掌握页面置换算法的实现方法。 3) 通过实验比较不同调度算法的优劣。 4) 培养综合运用所学知识的能力。 页面置换算法是虚拟存储管理实现的关键,通过本次试验理解内存页面调度的机制,在模拟实现FIFO、LRU等经典页面置换算法的基础上,比较各种置换算法的效率及优缺点,从而了解虚拟存储实现的过程。将不同的置换算法放在不同的子进程中加以模拟,培养综合运用所学知识的能力。 三、实验内容及要求 这是一个综合型实验,要求在掌握父子进程并发执行机制和内存页面置换算法的基础上,能综合运用这两方面的知识,自行编制程序。 程序涉及一个父进程和两个子进程。父进程使用rand()函数随机产生若干随机数,经过处理后,存于一数组Acess_Series[]中,作为内存页面访问的序列。两个子进程根据这个访问序列,分别采用FIFO和LRU两种不同的页面置换算法对内存页面进行调度。要求: 1) 每个子进程应能反映出页面置换的过程,并统计页面置换算法的命中或缺页情况。 设缺页的次数为diseffect。总的页面访问次数为total_instruction。 缺页率 = disaffect/total_instruction 命中率 = 1- disaffect/total_instruction 2)将为进程分配的内存页面数mframe 作为程序的参数,通过多次运行程序,说明FIFO算法存在的Belady现象。
页面置换算法操作系统中的一个重要概念,用于解决虚拟内存中的页面置换问题。常见的页面置换算法包括最佳置换算法、先进先出页面置换算法、最近最久未使用置换算法、改进型Clock置换算法和页面缓冲算法等。 最佳置换算法是一种理论上的算法,它总是选择最长时间内不再被访问的页面进行置换,以保证最小化缺页率。但是,由于需要预测未来的页面访问情况,因此在实际应用中很难实现。 先进先出页面置换算法是一种简单的算法,它总是选择最先进入内存的页面进行置换。这种算法容易实现,但是可能会导致“老旧页面”长时间占用内存,从而增加缺页率。 最近最久未使用置换算法是一种基于时间局部性原理的算法,它总是选择最长时间未被访问的页面进行置换。这种算法相对于先进先出算法能够更好地利用时间局部性,但是需要维护一个访问时间戳,因此实现起来比较复杂。 改进型Clock置换算法是一种基于时钟算法的改进算法,它通过维护一个环形链表和一个访问位来实现页面置换。这种算法相对于最近最久未使用算法能够更好地平衡页面的访问频率和时间,但是需要更多的硬件支持。 页面缓冲算法是一种基于缓存的算法,它通过将热点数据缓存到内存中来减少缺页率。这种算法相对于其他算法能够更好地利用空间局部性,但是需要更多的内存空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值