From 66c7dd84d7a6680524ea544989a5693994e432fd Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Mon, 2 Dec 2024 21:29:28 +0100 Subject: [PATCH] added disk scheduling diagrams --- disk-scheduling/algorithms.typ | 62 +++++++++++++++++++++++++++++++++ disk-scheduling/main.pdf | Bin 0 -> 13087 bytes disk-scheduling/main.typ | 39 +++++++++++++++++++++ disk-scheduling/utils.typ | 58 ++++++++++++++++++++++++++++++ 4 files changed, 159 insertions(+) create mode 100644 disk-scheduling/algorithms.typ create mode 100644 disk-scheduling/main.pdf create mode 100644 disk-scheduling/main.typ create mode 100644 disk-scheduling/utils.typ diff --git a/disk-scheduling/algorithms.typ b/disk-scheduling/algorithms.typ new file mode 100644 index 0000000..a1a0e57 --- /dev/null +++ b/disk-scheduling/algorithms.typ @@ -0,0 +1,62 @@ +#let schedule-fcfs(places) = { + return places +} + +#let schedule-sstf(places) = { + let places = places + let cur = places.remove(0) + let result = (cur,) + + while places.len() != 0 { + let best-d = none + let best-i = none + for (i, val) in places.enumerate() { + let d = calc.abs(cur - val) + if best-i == none or d < best-d { + best-d = d + best-i = i + } + } + cur = places.remove(best-i) + result.push(cur) + } + return result +} + +#let schedule-scan(places, initial-dir, min, max) = { + assert(initial-dir in (left, right)) + + let first = places.first() + let places = places.sorted() + let i = places.position(v => v == first) + let left-side = places.slice(0, i) + let right-side = places.slice(i+1) + + let result = if initial-dir == left { + (first,) + left-side.rev() + (min,) + right-side + } else { + (first,) + right-side + (max,) + left-side.rev() + } + + return result +} + +#let schedule-cscan(places, min, max) = { + let first = places.first() + let places = places.sorted() + let i = places.position(v => v == first) + let left-side = places.slice(0, i) + let right-side = places.slice(i+1) + + return (first,) + right-side + (max, min) + left-side +} + +#let schedule-clook(places) = { + let first = places.first() + let places = places.sorted() + let i = places.position(v => v == first) + let left-side = places.slice(0, i) + let right-side = places.slice(i+1) + + return (first,) + right-side + left-side +} \ No newline at end of file diff --git a/disk-scheduling/main.pdf b/disk-scheduling/main.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cd152e9fc9c6d3ccd3f805226f8afe07bed07974 GIT binary patch literal 13087 zcmch82UwF!6E28=^xhF8y$B>B0Ya4yO79&4gc=Bj(3^Aw5kcuinuv%9(gdU^N|7#A z6cA96u5?lHenHPs&wtK;{^vgTx!F%iW@mP1XE(d^?o9afRnbggAaUbBZxl#e9pi<=e=_oQz#S3rWH6qhjPya_YXKg09W6~I5hIK*))8fd z^zxAqRmPy5@Jwo6jujfAAXM8DJnuNkHGDM?wPN0~jQa^aMHt9!Y6{NgDr1 zLSQz(&Od%Z{G5Mnl$Q(66&NrAZ?5mlRRu8Pk@0l!3+QN_s=J|aC@e4$Xe17$io&lf ze4D_$qL7~C0lA*nbTIQ^+SrXRR1eP56#^?cVByxn_W99N zz%6m3H4o36Guf-JHJ*oRvU`LHzj)qgdV^Ru>aEJeN+-YK@}WbN#PQ6%C+FOrt{gtw z&lCNmQhKK@$i6xzFSXGtx6zB9n2Nc@VmOLPe(YR!!ILYx{`3Oc<3%)Y+SDAIaXB;- zmA6Wb1^SuGQdKyFvuuW&zrNgg_sn@_^5iv~^1CrjXq`;W3)kKAo8a2Dm|U&S(CgQ? z+fqCZZ@R~;70y|~a6R*bLtS+@KU{pjQIpQ|q)HH7;vu3`YUq+Jhi#Tzy?~kM6bkDV z@IcGvKWTfmznLbwC^yHUap9dCTU2^Mi~v_udbj9VAwg14CA|X9T9UQ1RzqCJcbFLG z8IKdUZe4#&p&>?PyRKA7PrgKMd=W}3b8e#GIF3d+T*%r-`h3)iz6B`m&~UqbuV9F1 z?>b-iob~-7x`8tk3KzuKLOS1{7W$$V!*Rjv9siajj{~@K;OZ%DMcVaU548p|jPHuy zr{r*WXG7oc%Aq3FJBD@qhVf&5|JXXD|8D6(B@nQq@94iQktDM~G~*&u_^i}|jpN1? z*Wk?F`s(^B@?HzqM&-wreF8K(#2(Gio+-j#KOrXhsF1|+wyKH4IZKVv7(tk4wjg~8 zSs9boxnfCAVqqPT2*aJ&ZB5}F8WCYS<$!6a8V`q5J zbgRMDin5Z`E|dP+A!MItJHrAd=blTqm$DOQ z*NzW;p(9o2r&-V8H0aMG7?O0fqe2W3pY!utWF&R#EU6~r=M3}Q)q_mYIdzppQ0HXEx8fC(7&w(-Qh2frVc?D z`Mi%WGAIYLZp);dqrI6BAZNO?N1@#Hwq?u4=2k3seff-LNy9Vs#cVwt-7v?mbM3nW z14^@-P+r=%H{MgFo#G_7m6hX@B{_H-e$D5NLNvjFd>8}?F0iz?!&+GVOxjYSd^lR; z<^&t1I%%5DZ2Xn|WqBRlh7R`nAdgVegZZdR5|3974NH-_;ZY6foX(B4y5%G}m)D!M z5yI7VdR05!Eyqq$$B#XFPKB(^SDoeDCU<2VlomRDJ5b4Z<(i$#;6v}jB%f=(+vkEd z^ZZA`54C#FJPW2N>V!WT`O^88P3#R z>&IrY4X(?#f`dv|)=D)tDddvoyo+x=u+QnwQzMF3zf~}Nhv{vQ?rUMxj=LD*UVWX} zHafGR8BNI0f(;wu+(7>}y{o|P#k}Nty-`XNk~@9npR(k}pP$nqyh5|2L+I1^Zb@M1 zN`LKA+Rf53wanqHa0~0#Wg;&pxr0p-{nk^}ve;gb$DX?d?nm`MoM^c)Gk2e4drRWe z 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 J@u}&l{~yq0N2>q; literal 0 HcmV?d00001 diff --git a/disk-scheduling/main.typ b/disk-scheduling/main.typ new file mode 100644 index 0000000..21b29fe --- /dev/null +++ b/disk-scheduling/main.typ @@ -0,0 +1,39 @@ +#import "algorithms.typ": * +#import "utils.typ": draw-algo, compute-total + +#set document(title: "Disk scheduling algorithms") +#set page(width: auto, height: auto, margin: 1cm) +#set text(font: "Source Sans 3") + +#let places = (53, 98, 193, 37, 14, 124, 65, 67) +#let min = 0 +#let max = 199 + +#let names = ("FCFS", "SSTF", "SCAN", "C-SCAN", "C-LOOK") +#let places-lst = ( + schedule-fcfs(places), + schedule-sstf(places), + schedule-scan(places, left, min, max), + schedule-cscan(places, min, max), + schedule-clook(places) +) +#let graphs = places-lst.map( + draw-algo.with(min: min, max: max ,width: 10) +) + +#let wraps = (false,) * 3 + (true,) * 2 +#let compute-total = compute-total.with(min: min, max: max) + +#align(center, text(size: 1.2em)[*Disk scheduling algorithms*]) + +#table( + columns: 2, + inset: 0.5em, + align: center + horizon, + ..names.zip(places-lst, wraps).map(((name, places, wrap)) => { + rotate( + -90deg, + reflow: true + )[*#name* (total: #compute-total(places, wrap: wrap))] + }).zip(graphs).flatten() +) \ No newline at end of file diff --git a/disk-scheduling/utils.typ b/disk-scheduling/utils.typ new file mode 100644 index 0000000..dd3b1f7 --- /dev/null +++ b/disk-scheduling/utils.typ @@ -0,0 +1,58 @@ +#import "@preview/cetz:0.3.1": canvas, draw + +#let draw-algo(places, min: 0, max: 199, width: 10) = canvas({ + let m = min + let M = max + let s = M - m + let w = width / s + + draw.line((0, 0), (width, 0)) + let draw-tick(v) = { + draw.line((v*w, 0), (v*w, 0.2)) + draw.content( + (v*w, 0.2), + str(v), + anchor: "south", + padding: 3pt + ) + } + + let drawn = (m, M) + draw-tick(m) + draw-tick(M) + + let pos = () + for (i, place) in places.enumerate() { + if place not in drawn { + draw-tick(place) + drawn.push(place) + } + + let p = (place * w, -i * 0.5) + if pos.len() != 0 { + draw.line(pos.last(), p, mark: (end: "straight")) + } + pos.push(p) + } + + let bottom-y = -(places.len() - 1) * 0.5 + draw.line((m*w, 0), (m*w, bottom-y)) + draw.line((M*w, 0), (M*w, bottom-y)) +}) + +#let compute-total(places, wrap: false, min: 0, max: 199) = { + let total = 0 + for i in range(places.len() - 1) { + let p0 = places.at(i) + let p1 = places.at(i + 1) + let d = calc.abs(p0 - p1) + if wrap { + if p1 < p0 { + d = (max - p0) + (p1 - min) + // d = 0 + } + } + total += d + } + return total +} \ No newline at end of file