操作系统实验(四)——页面置换算法模拟-创新互联

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

创新互联公司2013年开创至今,先为牧野等服务建站,牧野等地企业,进行企业商务咨询服务。为牧野企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
一、OPT 代码
#includeusing namespace std;
listmain_store= {};
listback_store = {1,4,3,1,2,5,1,4,2,1,4,5};
int change_time = 0;// 记录替换次数

int find(list::iterator begin,list::iterator end,int value)
// 寻找list列表中value首次出现的下标,未找到则返回列表长度,即size()
// 这里未找到设置为size(),就是将不再出现的page的权值设置为了大,优先替换 
{int i=0;
    for(list::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(lista)
// 打印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;
}
运行截图

在这里插入图片描述

二、FIFO 代码
#includeusing namespace std;
listmain_store= {};
listback_store = {1,4,3,1,2,5,1,4,2,1,4,5};
int change_time = 0;// 记录替换次数
int ptr=0;

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

void FIFO(int new_page)
// 先进先出算法
// 对整型数new_page进行替换
{list::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; ichange_page_iter++;
    }
    // 替换
    change_time++;
    *change_page_iter = new_page;
    ptr = (ptr+1)%main_store.size();
}

void printList(lista)
// 打印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;
}
运行截图

在这里插入图片描述

三、LRU 代码
#includeusing namespace std;
listmain_store= {};
listback_store = {1,4,3,1,2,5,1,4,2,1,4,5};
int change_time = 0;// 记录替换次数 
int clt=0;
mapm;

int find(list::iterator begin,list::iterator end,int value)
// 寻找list列表中value首次出现的下标,未找到则返回列表长度,即size()
// 这里未找到设置为size(),就是将不再出现的page的权值设置为了大,优先替换 
{int i=0;
    for(list::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(lista)
// 打印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;
}
运行截图

在这里插入图片描述

小结

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

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


标题名称:操作系统实验(四)——页面置换算法模拟-创新互联
链接地址:http://pwwzsj.com/article/hgdig.html