From fe957e03d12112c5faf46025bcd5375046851be3 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Mon, 2 Dec 2024 22:02:24 +0100 Subject: [PATCH] added demand paging algorithms --- demand-paging/main.pdf | Bin 0 -> 13971 bytes demand-paging/main.typ | 24 ++++++++++++ demand-paging/utils.typ | 84 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+) create mode 100644 demand-paging/main.pdf create mode 100644 demand-paging/main.typ create mode 100644 demand-paging/utils.typ diff --git a/demand-paging/main.pdf b/demand-paging/main.pdf new file mode 100644 index 0000000000000000000000000000000000000000..783f98d15effafebc67ba4f1d72b5c9b4e8b2a50 GIT binary patch literal 13971 zcmch;2|QHq7e7v9Yax-XG(;lH%rIjoOO~wJw=fuEFpM#_l*pc)XhDb;NtWzuwp2p0 z%aT3W_nqIJY5#ma-_Q5^|G$2(pL^52=Q-!xbI$YJ$9X@`x!l@{N&*l;Q5tSv;D?3= z1_Fbet?X%}q-a1OAw4fF5+tPL?1U%W>AG3ri39=}OrXdkT#cr@NiK!re8M7mldooo|0g2V_k8W|ZHfRkVs4T0&u8mOSENYF{J6Z${f2?*(Wx#E!+RVQ0# z5HSFNDLP0L+7*xU0-cis3_$V%>Hw-1&IXAi_;l`vPv0AK-LP0kBnI#kM2HYzIKWM? zh2Sj?jm10TK%zvS0J@?fkx2-6vYxZDs-gx0`zuHUK|_!!7+{8rgFz7BfD6MwP~d<; z#6ZHpAqEo#i2w%-Dhh%T4pArw4jeF1Vc;R6ASf6N1W=54FAfq1!GuLX5I_|e1QmsY zAb?5;2r33#K?x@e1_MEa38%2Q7zhHeihzX000KZJ=myvURyasRMEJ_@JwoWBUp=CZ zbVA|nKq3(00Qok66adGF?r0FYl-QtzcElrbKxiBhc%&kd(ANZ=K%|if42@?JCib#c zEtsxxXp>=*j9TV1{DQW%3jRVqWjsmSWE*==K%vGb>4jO0_bF!U<2^ne`*SxuF#EQZ zr>d}pjl&y)!ADFwS%d19vb!pMZloD~O2yBIobh_R&WEwJUTE&#%<&%d zUR=e<sXdlzNDqR#$QjosYLhvtS7WtA49;zm2L?YHdt@)~Qgnx# z_D$Cyep-W89v7EndHR}n167Ho;N=}u#5~k-@IiLn<5 zWAP{rU(9AmCrm-N>CD;#*XoIdiX{j3llx;~yqHg?dps}?uT6}5$-JA4xup_E-NyB? z0Cb=JQGdvn2VY|BlnOYng06C0<+{qv7y4T9&_nNs+?Q1WVu*;En_!4i%&jCl^-}IO zuA?9~R;6Q_J5cW~*3s6p?4Bp_cb`RjmWrE9<(}UgiJx|IPL1lMZD3rMC%lK>JL$(8 zDgICW4-pj;ArAfj($9eg&W@&rjI!%}UM;72T9#j?>~Ht_ta-P(kJS6*CBJsrd!pLT z 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 F{{fSt@M-`6 literal 0 HcmV?d00001 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