操作系统实验(四)——页面置换算法模拟

一个班(20信安)的同学搜到这篇别直接copy我的,代码仅供参考

一、OPT

代码

#include<bits/stdc++.h>
using namespace std;
list<int> main_store= {};
list<int> back_store = {1,4,3,1,2,5,1,4,2,1,4,5};
int change_time = 0;// 记录替换次数

int find(list<int>::iterator begin,list<int>::iterator end,int value)
// 寻找list<int>列表中value首次出现的下标,未找到则返回列表长度,即size()
// 这里未找到设置为size(),就是将不再出现的page的权值设置为了最大,优先替换 
{
    int i=0;
    for(list<int>::iterator iter = begin; iter!=end; iter++,i++)
    {
        if(*iter == value)
        {
            return i;
        }
    }
    return i;
}

void OPT(int new_page)
// 最佳页面置换算法
// 对整型数new_page进行替换
{
    auto change_page_iter = main_store.begin();
    // 如果主存中有page,则无需替换
    if(count(main_store.begin(), main_store.end(), new_page)) return;

    // 找到主存中出现位置最靠后的page(change_pagh_iter)
    for(auto i=main_store.begin(); i!=main_store.end(); i++)
    {
        if(find(back_store.begin(), back_store.end(), *i) > find(back_store.begin(), back_store.end(), *change_page_iter))
        {
            change_page_iter = i;
        }
    }
    // 替换
    change_time++;
    *change_page_iter = new_page;
}

void printList(list<int> a)
// 打印list<int>列表
{
    for(auto iter=a.begin(); iter!=a.end(); iter++)
    {
        cout << *iter << " ";
    }
    cout << endl;
}

int main()
{
    while(back_store.size())
    {
        int new_page = back_store.front();
        back_store.pop_front();
        // 检测主存是否有空闲空间
        if(main_store.size()<3)
        {
            main_store.push_back(new_page);
            printList(main_store);
        }
        else
        {
            OPT(new_page);
            printList(main_store);
        }
    }
    cout << "页面置换次数:" << change_time;
}

运行截图

在这里插入图片描述

二、FIFO

代码

#include<bits/stdc++.h>
using namespace std;
list<int> main_store= {};
list<int> back_store = {1,4,3,1,2,5,1,4,2,1,4,5};
int change_time = 0;// 记录替换次数
int ptr=0;

int find(list<int>::iterator begin,list<int>::iterator end,int value)
// 寻找list<int>列表中value首次出现的下标,未找到则返回列表长度,即size()
{
    int i=0;
    for(list<int>::iterator iter = begin; iter!=end; iter++,i++)
    {
        if(*iter == value)
        {
            return i;
        }
    }
    return i;
}

void FIFO(int new_page)
// 先进先出算法
// 对整型数new_page进行替换
{
    list<int>::iterator change_page_iter = main_store.begin();
    // 如果主存中有page,则无需替换
    if(count(main_store.begin(), main_store.end(), new_page)) return;

    // 找到主存中位置i的迭代器change_pagh_iter
    for(int i=0; i<ptr; i++)
    {
        change_page_iter++;
    }
    // 替换
    change_time++;
    *change_page_iter = new_page;
    ptr = (ptr+1)%main_store.size();
}

void printList(list<int> a)
// 打印list<int>列表
{
    for(auto iter=a.begin(); iter!=a.end(); iter++)
    {
        cout << *iter << " ";
    }
    cout << endl;
}

int main()
{
    while(back_store.size())
    {
        int new_page = back_store.front();
        back_store.pop_front();
        // 检测主存是否有空闲空间
        if(main_store.size()<3)
        {
            main_store.push_back(new_page);
            printList(main_store);
        }
        else
        {
            FIFO(new_page);
            printList(main_store);
        }
    }
    cout << "页面置换次数:" << change_time;
}

运行截图

在这里插入图片描述

三、LRU

代码

#include<bits/stdc++.h>
using namespace std;
list<int> main_store= {};
list<int> back_store = {1,4,3,1,2,5,1,4,2,1,4,5};
int change_time = 0;// 记录替换次数 
int clt=0;
map<int,int> m;

int find(list<int>::iterator begin,list<int>::iterator end,int value)
// 寻找list<int>列表中value首次出现的下标,未找到则返回列表长度,即size()
// 这里未找到设置为size(),就是将不再出现的page的权值设置为了最大,优先替换 
{
    int i=0;
    for(list<int>::iterator iter = begin; iter!=end; iter++,i++)
    {
        if(*iter == value)
        {
            return i;
        }
    }
    return i;
}

void LRU(int new_page)
// 最近最久未使用页面置换算法
// 对整型数new_page进行替换
{
    auto change_page_iter = main_store.begin();
    // 如果主存中有page,则无需替换
    if(count(main_store.begin(), main_store.end(), new_page)) return;

    // 找到主存中出现位置最靠后的page(change_pagh_iter)
    for(auto i=main_store.begin(); i!=main_store.end(); i++)
    {
        if(m[*i] < m[*change_page_iter])
        {
            change_page_iter = i;
        }
    }
    // 替换
    change_time++;
    *change_page_iter = new_page;
}

void printList(list<int> a)
// 打印list<int>列表
{
    for(auto iter=a.begin(); iter!=a.end(); iter++)
    {
        cout << *iter << " ";
    }
    cout << endl;
}

int main()
{
    while(back_store.size())
    {
        int new_page = back_store.front();
        back_store.pop_front();
        clt++;
        m[new_page] = clt;
        // 检测主存是否有空闲空间
        if(main_store.size()<3)
        {
            main_store.push_back(new_page);
            printList(main_store);
        }
        else
        {
            LRU(new_page);
            printList(main_store);
        }
    }
    cout << "页面置换次数:" << change_time;
}

运行截图

在这里插入图片描述

小结

调用了C++的STL库里的list<int>列表容器和map容器
写了遍历打印函数,以及重写了列表的find函数

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

introversi0n

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

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

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

打赏作者

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

抵扣说明:

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

余额充值