void clear() override;
private:
//Текущий индекс элемента int mCurrent = 0;
//Вектор страниц std::vector<int> mPages;
//Вектор состояний страниц std::vector<bool> mBits;
};
#endif // CLOCK_PAGING_H
Таблица 4 — Файл clock_paging.cpp
#include "clock_paging.h" #include <algorithm>
// Конструктор с параметром
ClockPaging::ClockPaging(int pageCount) : AbstractPaging(pageCount) {}
//Передача на рассмотрение страницы page void ClockPaging::refer(int page) {
auto duplicate = std::find(mPages.begin(), mPages.end(), page); if (duplicate != mPages.end()) {
mBits[duplicate - mPages.begin()] = true; return;
}
++mPageFault;
if ((long)mPages.size() != (long)mPageCount) { mPages.emplace_back(page); mBits.emplace_back(false);
return;
}
while (true) {
if (!mBits[mCurrent]) { mPages[mCurrent] = page;
mCurrent = (mCurrent + 1) % mPageCount; return;
}
mBits[mCurrent] = false;
mCurrent = (mCurrent + 1) % mPageCount;
}
}
//Получение списка страниц
const std::list<int> ClockPaging::getList() {
return std::list<int>(mPages.begin(), mPages.end());
}
// Очистка данных, возврат к начальному состоянию void ClockPaging::clear() {
mPageFault = 0; mCurrent = 0; mPages.clear(); mBits.clear();
}
Таблица 5 — Файл fifo_paging.h
#ifndef FIFO_PAGING_H #define FIFO_PAGING_H
#include "abstract_paging.h"
16
class FifoPaging : public AbstractPaging { public:
//Конструктор с параметром FifoPaging(int pageCount);
//Передача на рассмотрение страницы page void refer(int page) override;
//Получение списка страниц
const std::list<int> getList() override;
// Очистка данных, возврат к начальному состоянию void clear() override;
private:
// Дек страниц std::list<int> mPages;
};
#endif // FIFO_PAGING_H
Таблица 6 — Файл fifo_paging.cpp
#include "fifo_paging.h" #include <algorithm>
// Конструктор с параметром
FifoPaging::FifoPaging(int pageCount) : AbstractPaging(pageCount) {}
//Передача на рассмотрение страницы page void FifoPaging::refer(int page) {
if (std::find(mPages.begin(), mPages.end(), page) == mPages.end()) { ++mPageFault;
if ((long)mPages.size() == (long)mPageCount) { mPages.pop_front();
}
mPages.emplace_back(page);
}
}
//Получение списка страниц
const std::list<int> FifoPaging::getList() { return mPages; }
// Очистка данных, возврат к начальному состоянию void FifoPaging::clear() {
mPageFault = 0; mPages.clear();
}
Таблица 7 — Файл lfu_paging.h
#ifndef LFU_PAGING_H #define LFU_PAGING_H
#include "abstract_paging.h" #include <set>
class LfuPaging : public AbstractPaging { public:
//Конструктор с параметром
LfuPaging(int pageCount);
//Передача на рассмотрение страницы page void refer(int page) override;
//Получение списка страниц
const std::list<int> getList() override;
// Очистка данных, возврат к начальному состоянию
17
void clear() override;
private:
// Упорядоченное множество страниц std::set<std::pair<int, int>> mPages;
};
#endif // LFU_PAGING_H
Таблица 8 — Файл lfu_paging.cpp
#include "lfu_paging.h" #include <algorithm>
// Конструктор с параметром
LfuPaging::LfuPaging(int pageCount) : AbstractPaging(pageCount) {}
// Передача на рассмотрение страницы page void LfuPaging::refer(int page) {
auto duplicate =
std::find_if(mPages.begin(), mPages.end(),
[&page](auto pair) { return pair.second == page; }); if (duplicate == mPages.end()) {
++mPageFault;
if ((long)mPages.size() == (long)mPageCount) { mPages.erase(*mPages.begin());
}
mPages.insert({0, page}); } else {
int t = duplicate->first; mPages.erase(duplicate); mPages.insert({t + 1, page});
}
}
// Получение списка страниц
const std::list<int> LfuPaging::getList() { std::list<int> list;
for (auto &pair : mPages) { list.emplace_back(pair.second);
}
return list;
}
// Очистка данных, возврат к начальному состоянию void LfuPaging::clear() {
mPageFault = 0; mPages.clear();
}
Таблица 9 — Файл lru_paging.h
#ifndef LRU_PAGING_H #define LRU_PAGING_H
#include "abstract_paging.h"
class LruPaging : public AbstractPaging { public:
//Конструктор с параметром LruPaging(int pageCount);
//Передача на рассмотрение страницы page void refer(int page) override;
//Получение списка страниц
18
const std::list<int> getList() override;
// Очистка данных, возврат к начальному состоянию void clear() override;
private:
// Список страниц std::list<int> mPages;
};
#endif // LRU_PAGING_H
Таблица 10 — Файл lru_paging.cpp
#include "lru_paging.h" #include <algorithm>
// Конструктор с параметром
LruPaging::LruPaging(int pageCount) : AbstractPaging(pageCount) {}
// Передача на рассмотрение страницы page void LruPaging::refer(int page) {
auto duplicate = std::find(mPages.begin(), mPages.end(), page); if (duplicate == mPages.end()) {
++mPageFault;
if ((long)mPages.size() == (long)mPageCount) { mPages.pop_front();
}
mPages.emplace_back(page); } else {
mPages.remove(page); mPages.emplace_back(page);
}
}
// Получение списка страниц
const std::list<int> LruPaging::getList() { return mPages; }
// Очистка данных, возврат к начальному состоянию void LruPaging::clear() {
mPageFault = 0; mPages.clear();
}
Таблица 11 — Файл reverselru_paging.h
#ifndef REVERSELRU_PAGING_H #define REVERSELRU_PAGING_H
#include "abstract_paging.h" #include <unordered_map>
class ReverseLruPaging : public AbstractPaging { public:
//Конструктор с параметром ReverseLruPaging(int pageCount);
//Передача на рассмотрение страницы page void refer(int page) override;
//Получение списка страниц
const std::list<int> getList() override;
// Очистка данных, возврат к начальному состоянию void clear() override;
private:
// Список страниц
19
std::list<int> mPages;
// Ассоциативный массив (страница, положение в списке) std::unordered_map<int, std::list<int>::iterator> mRefMap;
};
#endif // REVERSELRU_PAGING_H
Таблица 12 — Файл reverselru_paging.cpp
#include "reverselru_paging.h"
// Конструктор с параметром
ReverseLruPaging::ReverseLruPaging(int pageCount) : AbstractPaging(pageCount) {}
// Передача на рассмотрение страницы page void ReverseLruPaging::refer(int page) {
if (mRefMap.find(page) == mRefMap.end()) { ++mPageFault;
if ((long)mPages.size() == (long)mPageCount) { mRefMap.erase(mPages.back()); mPages.pop_back();
}
} else { mPages.erase(mRefMap[page]);
}
mPages.emplace_front(page); mRefMap[page] = mPages.begin();
}
// Получение списка страниц
const std::list<int> ReverseLruPaging::getList() { return mPages; }
// Очистка данных, возврат к начальному состоянию void ReverseLruPaging::clear() {
mPageFault = 0; mPages.clear(); mRefMap.clear();
}
Таблица 13 — Файл mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow { Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0); ~MainWindow();
private slots:
void on_startButton_clicked(); void on_infoButton_clicked();
private: Ui::MainWindow *ui;
20