Beispiel #1
0
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);
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}