added demand paging algorithms
This commit is contained in:
parent
66c7dd84d7
commit
fe957e03d1
BIN
demand-paging/main.pdf
Normal file
BIN
demand-paging/main.pdf
Normal file
Binary file not shown.
24
demand-paging/main.typ
Normal file
24
demand-paging/main.typ
Normal file
@ -0,0 +1,24 @@
|
||||
#import "utils.typ": sim-demand-paging
|
||||
|
||||
#set document(title: "Demand paging algorithms")
|
||||
#set page(width: auto, height: auto, margin: 1cm)
|
||||
#set text(font: "Source Sans 3")
|
||||
|
||||
#let requests = (7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0 , 1)
|
||||
|
||||
#align(center, text(size: 1.2em)[*Demand paging algorithms*])
|
||||
|
||||
#figure(
|
||||
sim-demand-paging(requests, "FIFO"),
|
||||
caption: [Demand Paging: FIFO]
|
||||
)
|
||||
|
||||
#figure(
|
||||
sim-demand-paging(requests, "OPT"),
|
||||
caption: [Demand Paging: OPT]
|
||||
)
|
||||
|
||||
#figure(
|
||||
sim-demand-paging(requests, "LRU"),
|
||||
caption: [Demand Paging: LRU]
|
||||
)
|
84
demand-paging/utils.typ
Normal file
84
demand-paging/utils.typ
Normal file
@ -0,0 +1,84 @@
|
||||
#let sim-demand-paging(size: 3, requests, algo) = {
|
||||
let mem = ()
|
||||
|
||||
let j = 0
|
||||
let last-used = (:)
|
||||
|
||||
let states = ()
|
||||
let cells = ()
|
||||
let faults = 0
|
||||
|
||||
for (i, req) in requests.enumerate() {
|
||||
// In memory
|
||||
if req in mem {
|
||||
cells.push(req)
|
||||
|
||||
// Not in memory but enough space
|
||||
} else if mem.len() < size {
|
||||
mem.push(req)
|
||||
cells.push(req)
|
||||
|
||||
// Page fault
|
||||
} else {
|
||||
faults += 1
|
||||
|
||||
if algo == "FIFO" {
|
||||
mem.at(j) = req
|
||||
j = calc.rem(j + 1, size)
|
||||
|
||||
} else if algo == "OPT" {
|
||||
let future = requests.slice(i + 1)
|
||||
let dists = mem.map(v => {
|
||||
let pos = future.position(v2 => v2 == v)
|
||||
return if pos == none {calc.inf} else {pos}
|
||||
})
|
||||
let max = calc.max(..dists)
|
||||
let k = dists.position(v => v == max)
|
||||
mem.at(k) = req
|
||||
|
||||
} else if algo == "LRU" {
|
||||
let k = mem.enumerate()
|
||||
.map(p => (
|
||||
p.first(),
|
||||
last-used.at(
|
||||
str(p.last())
|
||||
)
|
||||
))
|
||||
.sorted(key: p => p.last())
|
||||
.first()
|
||||
.first()
|
||||
|
||||
mem.at(k) = req
|
||||
}
|
||||
|
||||
cells.push(grid.cell(fill: red.lighten(40%), str(req)))
|
||||
}
|
||||
last-used.insert(str(req), i)
|
||||
|
||||
states.push(mem)
|
||||
}
|
||||
|
||||
cells.insert(0, grid.cell(
|
||||
rowspan: size + 1,
|
||||
stroke: black,
|
||||
inset: (x: 0.4em, y: 0.4em),
|
||||
rotate(-90deg, reflow: true)[Faults: #faults]
|
||||
))
|
||||
|
||||
for i in range(size) {
|
||||
cells += states.map(s => s.at(i, default: none))
|
||||
}
|
||||
|
||||
grid(
|
||||
columns: requests.len() + 1,
|
||||
inset: (x: 0.2em, y: 0.4em),
|
||||
stroke: (x, y) => if y != 0 {
|
||||
black + .5pt
|
||||
},
|
||||
column-gutter: 0.6em,
|
||||
row-gutter: (0.4em,) + (0pt,) * size,
|
||||
align: center + horizon,
|
||||
fill: (x, y) => if y != 0 {blue.lighten(60%)},
|
||||
..cells.map(c => if type(c) == int {str(c)} else {c})
|
||||
)
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user