#include <iostream>
#include <stdio.h>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
int page = 3;
int Check(vector<int> b, int a) {//检查内存中是否存在该页
for (int i = 0; i < b.size(); i++) {
if (b[i] == a) return i;//存在返回下标
}
return -1;//不存在,返回-1
}
void FIFO(vector<int> a) //先进先出算法
{
cout << "FIFO算法\n";
vector<int> b;
int num = 0;
//cout << "访问页面 内存块中存在 \t 是否缺页" << endl;
for (int i = 0; i < a.size(); i++) {
cout << "访问页面:" << a[i] << "\t"<<"内存块中存在:";
for (int j = 0; j < b.size(); j++)
cout << b[j] << " ";//输出内存块中的页
cout << "\t";
if (Check(b, a[i])!=-1)//不缺页
cout << "是否缺页:否\n";
else {//缺页
cout << "是否缺页:是 ";
if (b.size() == page) {//内存满
cout << "淘汰页:" << b[0] << endl;
b.erase(b.begin());
}
else cout << endl;
b.push_back(a[i]);
num++;
}
}
cout << "最终内存中有:";
for (int j = 0; j < b.size(); j++)
cout << b[j] << " ";
cout << endl<<"缺页次数为:" << num << " 缺页率为:";
double l = num * 100.0 / a.size();
printf("%.2f%%\n", l);
}
struct lru
{
vector<int> name;
vector<int> time;
};
void LRU(vector<int> a) //最近最久未使用算法
{
cout << "LRU算法\n";
lru b;
int num = 0;
//cout << "访问页面 内存块中存在\t 是否缺页" << endl;
for (int i = 0; i < a.size(); i++) {
cout << "访问页面:" << a[i] << "\t"<<"内存块中存在:";
for (int k = 0; k < b.time.size(); k++)
b.time[k]++;//所有页未使用时间加1
for (int j = 0; j < b.name.size(); j++)
cout << b.name[j] << " ";
cout << "\t";
int check = Check(b.name, a[i]);
if (check != -1) {//不缺页
cout << "是否缺页:否\n";
b.time[check] = 0;//刚使用过的页,time置0
}
else {//缺页
cout << "是否缺页:是 ";
if (b.name.size() == page)//内存满
{
int it, maxit = 0;
for (int j = 0; j < b.time.size(); j++) {//找time最大(最久未使用)的下标
if (maxit < b.time[j]) {
maxit = b.time[j];
it = j;
}
}
cout << "淘汰页:" << b.name[it] << endl;
b.name.erase(b.name.begin() + it);
b.time.erase(b.time.begin() + it);
}
else cout << endl;
b.name.push_back(a[i]);
b.time.push_back(0);
num++;
}
}
cout << "最终内存中有:";
for (int j = 0; j < b.name.size(); j++)
{
cout << b.name[j] << " ";
}
cout << endl;
cout << "缺页次数为:"<<num<<" 缺页率为:";
double l = num * 100.0 / a.size();
printf("%.2f%%", l);
}
void OPT(vector<int> a) {
}
int main() {
vector<int> a;
ifstream ifs("1.txt", ios::in);
string s;
if (!ifs) {
cout << "打开失败";
return 0;
}
getline(ifs, s);
cout << s << endl;
ifs.close();
for (int i = 0; i < s.length(); i = i + 2) {
a.push_back(s[i] - '0');
}
FIFO(a);
LRU(a);
return 0;
}