请求页式存储管理基本置换算法LRU与CLOCK

一、实验目的

通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。

二、实验内容与基本要求

基于一个虚拟存储区和内存工作区,设计下述算法并统计计算缺页次数、置换次数、缺页率。
1.最近最久未使用算法(LRU)
2.简单时钟(钟表)算法(CLOCK)

三、实验报告内容

  • (1)最近最久未使用算法(LRU)基本原理

每次淘汰的页面都是最近最久未使用的页面
实现方法:赋予每个页面对应的页表项中,用访问字段记录该页面自上次被访问以来所经历的时间t。当需要淘汰一个页面时,选择现有页面中t值最大的,即最近最久未使用的页面。

  • (2)简单时钟(钟表)算法(CLOCK)基本原理

为每个页面设置一个访问位,再将内存中的页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位置为1。当需要淘汰一个页面时,只需检查页的访问位。如果是0,就选择该页换出;如果是1,则将它置为0,暂不换出,继续检查下一个页面,若第一轮扫描中所有页面都是1,则将这些页面的访问位依次置为0后,再进行第二轮扫描(第二轮扫描中一定会有访问位为0的页面,因此简单的CLOCK算法选择一个淘汰页面最多会经过两轮扫描

四、代码实现

(1)最近最久未使用算法(LRU)

#include<stdio.h>
#include<stdlib.h>

typedef struct lru{
    int yehao;//页号
    int kuaihao;//内存块号
    int time;//上次访问时间
} lru;
int qi;//请求的号
int kuaishu;//系统块数
int yyk;//用了的块数
int a, b, c;

int Qfind(lru *l,int n){
    for (int i = 1; i <= yyk;i++){
        if(l[i].yehao==n) return i;
    }
    return yyk+1;
}
int mint(lru *l){
    l[0].time = 775000;
    int ans = 0;
    for (int i = 1; i <= yyk;i++){
        if(l[i].time<l[ans].time)
            ans = i;
    }
    return ans;
}
void print(lru *l){
    for (int i = 1; i <= yyk;i++)
        printf("%d ", l[i].yehao);
    for (int i = yyk + 1; i <= kuaishu; i++)
        printf("# ");
    printf("\n");
}

int main(){
    kuaishu = 4;
    lru lQ[kuaishu+1];
    yyk = 0;
    int time = 0;
    printf("请输入请求队列:\n");
    while(scanf("%d", &qi)&&qi){
        ++time;
        int n = Qfind(lQ, qi);       
        if(n>yyk){//不在内存,缺页
            if(yyk<kuaishu){//分配空间
                yyk++;
            }else{//置换
                n = mint(lQ);
                b++;
            }
            lQ[n].yehao = qi;
            lQ[n].kuaihao = n;
            lQ[n].time = time;
            a++;
        }else{//修改时间
            lQ[n].time = time;
        }
        c++;
        print(lQ);
    }
    printf("缺页次数:%d\n置换次数:%d\n缺页率:%.1f\%\n", a, b, (float)a / c*100);
}

//1 8 1 7 8 2 7 2 1 8 3 8 2 1 3 1 7 1 3 7 0

(2)简单时钟(钟表)算法(CLOCK)

#include<stdio.h>
#include<stdlib.h>

typedef struct clock{
    int yehao;//页号
    int kuaihao;//内存块号
    int fangwen;
    struct clock *next;
} clock;
clock *Q;
clock *p, *q;
int qi;//请求的号
int a, b, c;
int flag;
clock temp[5] = {
    {5, 1, 0}, {6, 2, 1}, 
{3, 3, 0}, {4, 4, 0}, {7, 5, 1}};

clock* Qfind(int qi){
    p = q = Q;
    do{
        if(p->yehao==qi){
            return p;
        }
        p = p->next;
    } while (p != q);
    return NULL;
}
clock* zhihuan(){
    p = q = Q;
    do{
        if(p->fangwen==0){
            Q = p->next;
            return p;
        }
        p->fangwen = 0;
        p = p->next;
    } while (p != q);
    Q = Q->next;
    return p;
}
void print(int f){
    printf("请求号:%d  缺页:", qi);
    if(f)printf("√");
    printf("\n");
    p = q = Q;
    do{
        printf("%d ", p->yehao);
        p = p->next;
    } while (p != q);
    printf("\n");
}

int main(){
    Q = &temp[0];
    for (int i = 0; i < 5;i++)
        temp[i].next = &temp[(i + 1)%5];
    printf("请输入请求队列:\n");
    while(scanf("%d",&qi)&&qi){
        flag = 0;
        p = Qfind(qi);
        if(p){
            p->fangwen = 1;
        }else{//缺页
            flag = 1;
            p = zhihuan();
            p->yehao = qi;
            p->fangwen = 1;
            b++;
            a++;
        }
        c++;
        print(flag);
    }
    printf("缺页次数:%d\n置换次数:%d\n缺页率:%.1f\%\n", a, b, (float)a / c*100);
}
//1 3 4 2 5 6 3 4 7 0

五、实验结果
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木灬U6770

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值