diff --git a/demand-paging/main.pdf b/demand-paging/main.pdf new file mode 100644 index 0000000..783f98d Binary files /dev/null and b/demand-paging/main.pdf differ diff --git a/demand-paging/main.typ b/demand-paging/main.typ new file mode 100644 index 0000000..458437e --- /dev/null +++ b/demand-paging/main.typ @@ -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] +) diff --git a/demand-paging/utils.typ b/demand-paging/utils.typ new file mode 100644 index 0000000..96d6b6e --- /dev/null +++ b/demand-paging/utils.typ @@ -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}) + ) +} \ No newline at end of file