一个班(20信安)的同学搜到这篇别直接copy我的,代码仅供参考
#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;
}
#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;
}
#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;
}
调用了C++的STL库里的list
列表容器和map
容器
写了遍历打印函数,以及重写了列表的find函数