aboutsummaryrefslogtreecommitdiff
path: root/pa8_predict/pager-predict2.c
diff options
context:
space:
mode:
Diffstat (limited to 'pa8_predict/pager-predict2.c')
-rw-r--r--pa8_predict/pager-predict2.c56
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++;
+}