aboutsummaryrefslogtreecommitdiff
path: root/pa7_lru/pager-lru.c
diff options
context:
space:
mode:
Diffstat (limited to 'pa7_lru/pager-lru.c')
-rw-r--r--pa7_lru/pager-lru.c30
1 files changed, 27 insertions, 3 deletions
diff --git a/pa7_lru/pager-lru.c b/pa7_lru/pager-lru.c
index 14608d0..aa20825 100644
--- a/pa7_lru/pager-lru.c
+++ b/pa7_lru/pager-lru.c
@@ -3,19 +3,28 @@
// PA7 LRU
#include "../common/simulator.h"
#include <stdbool.h>
+#include <stdio.h>
#include <string.h>
void pageit(Pentry q[MAXPROCESSES]) {
- static int timestamps[MAXPROCESSES][MAXPROCPAGES], tick = 1;
static bool initialised = false;
+ static int prev[MAXPROCESSES], tick = 1;
+ static int timestamps[MAXPROCESSES][MAXPROCPAGES];
+ static int predict_cnt[MAXPROCESSES][MAXPROCPAGES];
if (!initialised) {
+ for (int i = 0; i < MAXPROCPAGES; i++)
+ prev[i] = -1;
memset(timestamps, 0, sizeof(timestamps));
+ memset(predict_cnt, 0, sizeof(predict_cnt));
initialised = true;
}
- for (int proc = 0; proc < MAXPROCESSES; proc++)
+ for (int proc = 0; proc < MAXPROCESSES; proc++) {
if (q[proc].active) {
int curr = q[proc].pc / PAGESIZE;
timestamps[proc][curr] = tick;
+ if (prev[proc] != -1 && prev[proc] != curr)
+ predict_cnt[prev[proc]][curr]++;
+ prev[proc] = curr;
if (!q[proc].pages[curr])
if (!pagein(proc, curr)) {
int min = tick, choice;
@@ -27,5 +36,20 @@ void pageit(Pentry q[MAXPROCESSES]) {
pageout(proc, choice);
}
}
- tick++;
+ tick++;
+ }
+ if (tick > 3000000 && tick < 3000020) {
+ int row_sum[MAXPROCPAGES];
+ memset(row_sum, 0, sizeof(row_sum));
+ for (int i = 0; i < MAXPROCPAGES; i++)
+ for (int j = 0; j < MAXPROCPAGES; j++)
+ row_sum[i] += predict_cnt[i][j];
+ for (int i = 0; i < MAXPROCPAGES; i++) {
+ for (int j = 0; j < MAXPROCPAGES; j++) {
+ double chance = (double)predict_cnt[i][j] / row_sum[i];
+ printf("%.2f\t", row_sum[i] ? chance : 0);
+ }
+ printf("\n");
+ }
+ }
}