Материал: ОСиС. Лабораторная работа 10

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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

Источник: https://studfile.net/preview/16437652/