操作系统实验四:页面置换算法

实验目的及基本要求

  设计和实现:

  1. 最佳置换算法(Optimal)
  2. 先进先出置换算法(FIFO)
  3. 最近最久未使用置换算法(LRU)
  4. 改进型Clock置换算法
  5. 页面缓冲置换算法(PBA)

  假设模拟的虚拟内存的地址为16位,页面大小为1K ,模拟的物理内存有32K,通过页面访问序列随机发生器实现对上述算法的测试及性能比较。

基本知识: 

  1. 请求分页虚拟内存管理

请求分页虚拟内存管理是建立在基本分页基础上的,为了能支持虚拟存储器功能,而增加了请求调页功能和置换功能。

  1. 工作集

多数程序都显示出高度的局部性,也就是说,在一个时间段内,一组页面被反复引用。这组被反复引用的页面随着时间的推移,其成员也会发生变化。有时这种变化是剧烈的,有时这种变化则是渐进的。我们把这组页面的集合称为工作集

  1. 缺页率

缺页中断次数/总的页面访问次数

前提说明

 

  1. 页表用整数数组或结构数组来表示
  2. 页面访问序列串是一个整数序列,整数的取值范围为0到N - 1。页面访问序列串中的每个元素p表示对页面p的一次访问
  3. 符合局部访问特性的随机生成算法

(1)确定虚拟内存的尺寸N,工作集的起始位置p,工作集中包含的页数e,工作集移动率m(每处理m个页面访问则将起始位置p +1),以及一个范围在0和1之间的值t;

(2)生成m个取值范围在p和p + e间的随机数,并记录到页面访问序列串中;

(3)生成一个随机数r,0 ≤ r ≤ 1;

(4)如果r < t,则为p生成一个新值,否则p = (p + 1) mod N;

(5)如果想继续加大页面访问序列串的长度,请返回第2步,否则结束。

 

一、最佳置换算法Optimal

原理:

  选择永不使用或是在最长时间内不再被访问(即距现在最长时间才会被访问)的页面淘汰出内存。是一种理想化算法,具有最好性能(对于固定分配页面方式,本法可保证获得最低的缺页率),但实际上却难于实现,故主要用于算法评价参照

 全局数据结构设计:

int block = 3;
int access[32];//访问序列
int lost = 0;  //没找到的页面数
int index = 0; //指示当前下标
int p;         //工作集的起始位置

void generate();//模拟生成访问序列
void initMemory();//初始化存储空间,主要是设置分配空间的大小
bool  inMemory (int n); //指定页号是否已经在内存中

//访问序列的长度始终为32,默认初始分配给每种算法的内存空间块数为3

数据结构设计:

void optimal (int n); //访问一个页面,执行一次最佳置换算法
void testOptimal();  //算法实现函数


//最佳适应算法
void optimal (int n)
{
    int i = 0, j = 0;

    if (inMemory (n))
    {
        printf ("页面已被调入\n");
    }

    else
        if (index == block)
        {
            lost++;
            int max = 0, pos, tag;

            for (i = 0; i < block; i++)
            {
                tag = -1;

                for (j = n + 1; j < 32; j++)
                {
                    if (access[j] == memo[i])
                    {
                        tag = j;
                        break;
                    }
                }

                if (tag == -1)
                {
                    max = 32;
                    pos = i;
                    break;
                }

                else
                {
                    if (max < tag)
                    {
                        max = tag;
                        pos = i;
                    }
                }
            }

            memo[pos] = access[n];
        }

        else
        {
            memo[index] = access[n];
            index++;
        }
}


void testOptimal()
{
    initMemory();
    int i = 0;
    printf ("最佳置换算法:\n");

    for (; i < 32; i++)
    {
        optimal (i);
        printf ("%d %d %d\n", memo[0], memo[1], memo[2]);
    }
    printf("***************************************************\n");
    printf ("最佳置换算法:\n");
    printf("页面置换次数:%d ,缺页率:%2f \n", lost,lost / 32.0);
    printf("***************************************************\n");
    lost = 0;
    free (memo);
    in
  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值