diff options
Diffstat (limited to 'pa7_lru/pager-lru.c')
-rw-r--r-- | pa7_lru/pager-lru.c | 30 |
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"); + } + } } |