120 lines
4.9 KiB
Markdown
120 lines
4.9 KiB
Markdown
|
|
||
|
This simulator, paging-policy.py, allows you to play around with different
|
||
|
page-replacement policies. For example, let's examine how LRU performs with a
|
||
|
series of page references with a cache of size 3:
|
||
|
|
||
|
0 1 2 0 1 3 0 3 1 2 1
|
||
|
|
||
|
To do so, run the simulator as follows:
|
||
|
|
||
|
prompt> ./paging-policy.py --addresses=0,1,2,0,1,3,0,3,1,2,1
|
||
|
--policy=LRU --cachesize=3 -c
|
||
|
|
||
|
And what you would see is:
|
||
|
|
||
|
ARG addresses 0,1,2,0,1,3,0,3,1,2,1
|
||
|
ARG numaddrs 10
|
||
|
ARG policy LRU
|
||
|
ARG cachesize 3
|
||
|
ARG maxpage 10
|
||
|
ARG seed 0
|
||
|
|
||
|
Solving...
|
||
|
|
||
|
Access: 0 MISS LRU-> [br 0]<-MRU Replace:- [br Hits:0 Misses:1]
|
||
|
Access: 1 MISS LRU-> [br 0, 1]<-MRU Replace:- [br Hits:0 Misses:2]
|
||
|
Access: 2 MISS LRU->[br 0, 1, 2]<-MRU Replace:- [br Hits:0 Misses:3]
|
||
|
Access: 0 HIT LRU->[br 1, 2, 0]<-MRU Replace:- [br Hits:1 Misses:3]
|
||
|
Access: 1 HIT LRU->[br 2, 0, 1]<-MRU Replace:- [br Hits:2 Misses:3]
|
||
|
Access: 3 MISS LRU->[br 0, 1, 3]<-MRU Replace:2 [br Hits:2 Misses:4]
|
||
|
Access: 0 HIT LRU->[br 1, 3, 0]<-MRU Replace:2 [br Hits:3 Misses:4]
|
||
|
Access: 3 HIT LRU->[br 1, 0, 3]<-MRU Replace:2 [br Hits:4 Misses:4]
|
||
|
Access: 1 HIT LRU->[br 0, 3, 1]<-MRU Replace:2 [br Hits:5 Misses:4]
|
||
|
Access: 2 MISS LRU->[br 3, 1, 2]<-MRU Replace:0 [br Hits:5 Misses:5]
|
||
|
Access: 1 HIT LRU->[br 3, 2, 1]<-MRU Replace:0 [br Hits:6 Misses:5]
|
||
|
]
|
||
|
|
||
|
The complete set of possible arguments for paging-policy is listed on the
|
||
|
following page, and includes a number of options for varying the policy, how
|
||
|
addresses are specified/generated, and other important parameters such as the
|
||
|
size of the cache.
|
||
|
|
||
|
prompt> ./paging-policy.py --help
|
||
|
Usage: paging-policy.py [options]
|
||
|
|
||
|
Options:
|
||
|
-h, --help show this help message and exit
|
||
|
-a ADDRESSES, --addresses=ADDRESSES
|
||
|
a set of comma-separated pages to access;
|
||
|
-1 means randomly generate
|
||
|
-f ADDRESSFILE, --addressfile=ADDRESSFILE
|
||
|
a file with a bunch of addresses in it
|
||
|
-n NUMADDRS, --numaddrs=NUMADDRS
|
||
|
if -a (--addresses) is -1, this is the
|
||
|
number of addrs to generate
|
||
|
-p POLICY, --policy=POLICY
|
||
|
replacement policy: FIFO, LRU, LFU, OPT,
|
||
|
UNOPT, RAND, CLOCK
|
||
|
-b CLOCKBITS, --clockbits=CLOCKBITS
|
||
|
for CLOCK policy, how many clock bits to use
|
||
|
-C CACHESIZE, --cachesize=CACHESIZE
|
||
|
size of the page cache, in pages
|
||
|
-m MAXPAGE, --maxpage=MAXPAGE
|
||
|
if randomly generating page accesses,
|
||
|
this is the max page number
|
||
|
-s SEED, --seed=SEED random number seed
|
||
|
-N, --notrace do not print out a detailed trace
|
||
|
-c, --compute compute answers for me
|
||
|
]
|
||
|
|
||
|
As usual, "-c" is used to solve a particular problem, whereas without it, the
|
||
|
accesses are just listed (and the program does not tell you whether or not a
|
||
|
particular access is a hit or miss).
|
||
|
|
||
|
To generate a random problem, instead of using "-a/--addresses" to pass in
|
||
|
some page references, you can instead pass in "-n/--numaddrs" as the number of
|
||
|
addresses the program should randomly generate, with "-s/--seed" used to
|
||
|
specify a different random seed. For example:
|
||
|
|
||
|
prompt> ./paging-policy.py -s 10 -n 3
|
||
|
.. .
|
||
|
Assuming a replacement policy of FIFO, and a cache of size 3 pages,
|
||
|
figure out whether each of the following page references hit or miss
|
||
|
in the page cache.
|
||
|
|
||
|
Access: 5 Hit/Miss? State of Memory?
|
||
|
Access: 4 Hit/Miss? State of Memory?
|
||
|
Access: 5 Hit/Miss? State of Memory?
|
||
|
]
|
||
|
|
||
|
As you can see, in this example, we specify "-n 3" which means the program
|
||
|
should generate 3 random page references, which it does: 5, 7, and 5. The
|
||
|
random seed is also specified (10), which is what gets us those particular
|
||
|
numbers. After working this out yourself, have the program solve the problem
|
||
|
for you by passing in the same arguments but with "-c" (showing just the
|
||
|
relevant part here):
|
||
|
|
||
|
prompt> ./paging-policy.py -s 10 -n 3 -c
|
||
|
...
|
||
|
Solving...
|
||
|
|
||
|
Access: 5 MISS FirstIn-> [br 5] <-Lastin Replace:- [br Hits:0 Misses:1]
|
||
|
Access: 4 MISS FirstIn->[br 5, 4] <-Lastin Replace:- [br Hits:0 Misses:2]
|
||
|
Access: 5 HIT FirstIn->[br 5, 4] <-Lastin Replace:- [br Hits:1 Misses:2]
|
||
|
]
|
||
|
|
||
|
The default policy is FIFO, though others are available, including LRU, MRU,
|
||
|
OPT (the optimal replacement policy, which peeks into the future to see what
|
||
|
is best to replace), UNOPT (which is the pessimal replacement), RAND (which
|
||
|
does random replacement), and CLOCK (which does the clock algorithm). The
|
||
|
CLOCK algorithm also takes another argument (-b), which states how many bits
|
||
|
should be kept per page; the more clock bits there are, the better the
|
||
|
algorithm should be at determining which pages to keep in memory.
|
||
|
|
||
|
Other options include: "-C/--cachesize" which changes the size of the page
|
||
|
cache; "-m/--maxpage" which is the largest page number that will be used if
|
||
|
the simulator is generating references for you; and "-f/--addressfile" which
|
||
|
lets you specify a file with addresses in them, in case you wish to get traces
|
||
|
from a real application or otherwise use a long trace as input.
|
||
|
|