diff options
Diffstat (limited to 'pa8_predict/pager-predict2.c')
-rw-r--r-- | pa8_predict/pager-predict2.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/pa8_predict/pager-predict2.c b/pa8_predict/pager-predict2.c new file mode 100644 index 0000000..512e7c4 --- /dev/null +++ b/pa8_predict/pager-predict2.c @@ -0,0 +1,56 @@ +// 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++; +} |