#include <iostream>
#include <vector>
#include <queue>
#include <unordered_map>
// Constants
const int PAGE_SIZE = 4; // Number of pages in memory
const int NUM_PAGES = 10; // Total number of pages in the virtual memory
// Class to simulate a virtual memory system
class VirtualMemory {
public:
VirtualMemory(int pageSize) : pageSize(pageSize) {}
// Access a page
void accessPage(int pageNumber) {
if (pageTable.find(pageNumber) == pageTable.end()) {
// Page fault: page not in memory
if (memory.size() >= pageSize) {
// Memory is full, need to evict a page
int evictPage = pageQueue.front();
pageQueue.pop();
pageTable.erase(evictPage);
std::cout << "Page " << evictPage << " evicted from memory.\n";
}
// Load the page into memory
memory.push_back(pageNumber);
pageTable[pageNumber] = memory.size() - 1;
pageQueue.push(pageNumber);
std::cout << "Page " << pageNumber << " loaded into memory.\n";
} else {
// Page hit: page is already in memory
std::cout << "Page " << pageNumber << " is already in memory.\n";
}
}
// Print current memory state
void printMemory() const {
std::cout << "Current memory state: ";
for (int page : memory) {
std::cout << page << " ";
}
std::cout << std::endl;
}
private:
int pageSize;
std::vector<int> memory;
std::unordered_map<int, int> pageTable; // Maps page number to its position in memory
std::queue<int> pageQueue; // Keeps track of page replacement order
};
int main() {
VirtualMemory vm(PAGE_SIZE);
// Simulate accessing pages
std::vector<int> pageRequests = {1, 2, 3, 4, 1, 5, 6, 2, 7, 8, 9, 10, 5, 3};
for (int pageNumber : pageRequests) {
vm.accessPage(pageNumber);
vm.printMemory();
}
return 0;
}