csci3753

CSCI3753 Coursework
git clone https://git.pngu.org/csci3753
Log | Files | Refs | README

pager-predict2.c (1831B)


// Jack Sangdahl
// CSCI3753 SP24
// PA8 Predict
#include "../common/simulator.h"
#include <stdbool.h>
#include <string.h>

void pageit(Pentry q[MAXPROCESSES]) {
  static bool initialised = false;
  static int prev[MAXPROCESSES], tick = 1;
  static int row_sum[MAXPROCESSES][MAXPROCPAGES];
  static int prediction[MAXPROCESSES][MAXPROCPAGES][MAXPROCPAGES];
  bool swap[MAXPROCPAGES] = {false};
  if (!initialised) {
    for (int i = 0; i < MAXPROCESSES; i++)
      prev[i] = -1;
    memset(row_sum, 0, sizeof(row_sum));
    memset(prediction, 0, sizeof(prediction));
    initialised = true;
  }
  for (int proc = 0; proc < MAXPROCESSES; proc++)
    if (q[proc].active) {
      int curr = q[proc].pc / PAGESIZE;
      if (prev[proc] != -1 && prev[proc] != curr) {
        row_sum[proc][prev[proc]]++;
        prediction[proc][prev[proc]][curr]++;
      }
      prev[proc] = curr;
      swap[curr] = true;
      if (tick > PAGEWAIT && row_sum[proc][curr])
        for (int i = 0; i < MAXPROCPAGES; i++) {
          double probability =
              (double)prediction[proc][curr][i] / row_sum[proc][curr];
          if (probability) {
            swap[i] = true;
            if (probability > 0.9)
              for (int j = 0; j < MAXPROCPAGES; j++) {
                double secondary_prob =
                    (double)prediction[proc][i][j] / row_sum[proc][i];
                if (secondary_prob > 0.025)
                  swap[j] = true;
              }
          }
        }
      for (int i = 0; i < q[proc].npages; i++)
        if (!swap[i] && q[proc].pages[i])
          pageout(proc, i);
      if (!q[proc].pages[curr])
        pagein(proc, curr);
      for (int i = 0; i < q[proc].npages; i++)
        if (swap[i] && !q[proc].pages[i])
          pagein(proc, i);
      memset(swap, false, sizeof(swap));
    }
  tick++;
}