From 08760a5700fc632f55255dc1401d6426a7743306 Mon Sep 17 00:00:00 2001 From: tobyatgithub Date: Tue, 25 Oct 2022 17:33:16 -0700 Subject: [PATCH] add plot for chap22. --- .gitignore | 3 +++ Homework7/chap22/Chapter22Simulator.md | 1 + Homework7/chap22/hitrate-compare.png | Bin 0 -> 41896 bytes Homework7/chap22/paging-policy.py | 0 Homework7/chap22/plot.py | 21 +++++++++++++++++++++ Homework7/chap22/run.sh | 11 +++++++++++ Homework7/chap22/transform.py | 11 +++++++++++ 7 files changed, 47 insertions(+) create mode 100644 Homework7/chap22/hitrate-compare.png mode change 100644 => 100755 Homework7/chap22/paging-policy.py create mode 100644 Homework7/chap22/plot.py create mode 100755 Homework7/chap22/run.sh create mode 100755 Homework7/chap22/transform.py diff --git a/.gitignore b/.gitignore index 2c7b7b9..7887edc 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,6 @@ .vs_code */.idea */cmake-build-* +ls-trace.txt +vpn.txt +result.txt \ No newline at end of file diff --git a/Homework7/chap22/Chapter22Simulator.md b/Homework7/chap22/Chapter22Simulator.md index acb9c4b..af4ca35 100644 --- a/Homework7/chap22/Chapter22Simulator.md +++ b/Homework7/chap22/Chapter22Simulator.md @@ -150,3 +150,4 @@ LRU was performing pretty well with locality. And RAND is not too bad compared t > Use a program like `valgrind` to instrument a real application and generate a virtual page reference stream. For example, running `valgrind --tool=lackey --trace-mem=yes ls` will output a nearly-complete reference trace of every instruction and data reference made by the program `ls`. To make this useful for the simulator above, you’ll have to first transform each virtual memory reference into a virtual page-number reference (done by masking off the offset and shifting the resulting bits downward). How big of a cache is needed for your application trace in order to satisfy a large fraction of requests? Plot a graph of its working set as the size of the cache increases. **Answer:** +![](hitrate-compare.png) \ No newline at end of file diff --git a/Homework7/chap22/hitrate-compare.png b/Homework7/chap22/hitrate-compare.png new file mode 100644 index 0000000000000000000000000000000000000000..5d5c43a37f2a59b96d6dc16abef7eb81a3dfa97d GIT binary patch literal 41896 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�XQM_bQ`4;?Exy-wu~Ae=WZlOFxJ0 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 DPx}yU literal 0 HcmV?d00001 diff --git a/Homework7/chap22/paging-policy.py b/Homework7/chap22/paging-policy.py old mode 100644 new mode 100755 diff --git a/Homework7/chap22/plot.py b/Homework7/chap22/plot.py new file mode 100644 index 0000000..c3e9a30 --- /dev/null +++ b/Homework7/chap22/plot.py @@ -0,0 +1,21 @@ +import numpy as np +import matplotlib.pyplot as plt + +cacheSizes = np.arange(1, 5) +policies = ["FIFO", "LRU", "OPT", "UNOPT", "RAND", "CLOCK"] +hitRate = [ + [60.67, 86.24, 94.39, 98.72], + [60.79, 90.73, 95.76, 99.11], + [60.79, 90.77, 97.49, 99.41], + [60.79, 61.04, 61.10, 61.34], + [60.79, 86.75, 95.34, 98.08], + [60.79, 87.72, 95.89, 98.84] +] + +for i in range(len(policies)): + plt.plot(cacheSizes, hitRate[i]) + +plt.legend(policies) +plt.xlabel("Cache sizes") +plt.ylabel("Hitrate") +plt.savefig("hitrate-compare.png") \ No newline at end of file diff --git a/Homework7/chap22/run.sh b/Homework7/chap22/run.sh new file mode 100755 index 0000000..3c96c2b --- /dev/null +++ b/Homework7/chap22/run.sh @@ -0,0 +1,11 @@ +#!/bin/bash +POLICIES=("FIFO" "LRU" "OPT" "UNOPT" "RAND" "CLOCK") + +for policy in "${POLICIES[@]}" +do + for i in 1 2 3 4 + do + ./paging-policy.py -c -f ./vpn.txt -p "$policy" -N -C "$i" + done + echo "$policy Done with Cache size = $i.\n" +done \ No newline at end of file diff --git a/Homework7/chap22/transform.py b/Homework7/chap22/transform.py new file mode 100755 index 0000000..214bbd3 --- /dev/null +++ b/Homework7/chap22/transform.py @@ -0,0 +1,11 @@ +#! /usr/bin/env python3 + +traceFile = open('./ls-trace.txt', 'r') +vpnFile = open('./vpn.txt', 'w') + +for line in traceFile: + if (not line.startswith('=')): + vpnFile.write(str((int("0x" + line[3:11], 16) & 0xfffff000) >> 12) + "\n") + +traceFile.close() +vpnFile.close() \ No newline at end of file