void BufferManager::start() { // Clear variables for (int i = 0; i < 2; i++) { pages[i] = Page(); pageNums[i] = 0; dirtied[i] = 0; pinned[i] = 0; } // Load pages from disk pageIn(0, 1); pageIn(1, 2); }
void simulate(mmu *m){ inst *elt, *tmp; while (instList != NULL){ tmp = instList; elt = popInst(tmp); if (elt == NULL){ continue; } //invalid instruction m->insts_N +=1; int rw = elt->rw; int page = elt->page; int instN = elt->instN; free(elt); elt =NULL; tmp = NULL; if (algo==3){ m->mmucounter +=1; m->cT64[page] = m->mmucounter; //printf("==> %llu %lu\n", m->cT64[page],m->mmucounter); } if (isPresent(m->pageT[page])){ if (rw ==1){ modified(&(m->pageT[page])); } referenced(&(m->pageT[page])); continue; } //page present int victim, nextFID; if (m->frameN < numFrames){ victim = page; nextFID = m->frameN; } else { updateMMU(m, page); victim = nextFrame(m); nextFID = unmap(m,victim,instN); } pageIn(m, page, rw, instN, nextFID); map(m, page, nextFID, instN); /* MAP */ } //while instList NOT NULL return; }
int BufferManager::findKey(int key) { int checked[4] = {0, 0, 0, 0}; // Look for key in pages in memory for (int i = 0; i < 2; i++) { int pageNum = pageNums[i]; checked[pageNum - 1] = 1; if (pages[i].findKey(key) != -1) { return i; } } // Look for key in pages on disk for (int i = 0; i < 4; i++) { if (checked[i] == 0) { int pageNum = i + 1; int index = selectVictim(); pageOut(index); pageIn(index, pageNum); if (pages[index].findKey(key) != -1) { return index; } } } return -1; }