added disk scheduling diagrams
This commit is contained in:
commit
66c7dd84d7
62
disk-scheduling/algorithms.typ
Normal file
62
disk-scheduling/algorithms.typ
Normal file
@ -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
|
||||
}
|
BIN
disk-scheduling/main.pdf
Normal file
BIN
disk-scheduling/main.pdf
Normal file
Binary file not shown.
39
disk-scheduling/main.typ
Normal file
39
disk-scheduling/main.typ
Normal file
@ -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()
|
||||
)
|
58
disk-scheduling/utils.typ
Normal file
58
disk-scheduling/utils.typ
Normal file
@ -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
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user