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

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

一、OPT

代码

#include
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列表中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列表
{
    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;
}

运行截图

操作系统实验(四)——页面置换算法模拟_第1张图片

二、FIFO

代码

#include
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列表中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列表
{
    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;
}

运行截图

操作系统实验(四)——页面置换算法模拟_第2张图片

三、LRU

代码

#include
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列表中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列表
{
    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;
}

运行截图

操作系统实验(四)——页面置换算法模拟_第3张图片

小结

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

你可能感兴趣的:(#,操作系统实验,算法,c++,开发语言)