Skip to content

Instantly share code, notes, and snippets.

@gocs
Last active December 19, 2020 17:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gocs/a2aa7e7736b80f788899979c00412bf2 to your computer and use it in GitHub Desktop.
Save gocs/a2aa7e7736b80f788899979c00412bf2 to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
)
func main() {
js := []Job{
{pno: 1, prio: 2, at: 0, bt: 4},
{pno: 2, prio: 4, at: 1, bt: 2},
{pno: 3, prio: 6, at: 2, bt: 3},
{pno: 4, prio: 10, at: 3, bt: 5},
{pno: 5, prio: 8, at: 4, bt: 1},
{pno: 6, prio: 12, at: 5, bt: 4},
{pno: 7, prio: 9, at: 6, bt: 6},
}
var s []Job
var working Job
var elapsed uint
for len(js) > 0 {
working, js = arrive(js, elapsed)
elapsed += working.bt
s = append(s, Job{
pno: working.pno,
bt: elapsed,
})
// fmt.Println("working:", working, "\tjs:", js)
}
for _, v := range s {
fmt.Println("no:", v.pno, "\tbt:", v.bt)
}
}
type Job struct {
pno uint
prio uint
at uint
bt uint
}
func arrive(js []Job, currentTime uint) (job Job, jobs []Job) {
if currentTime > 0 {
// get all pending jobs before currentTime
var pjobs []Job
for _, j := range js {
if j.at < currentTime {
pjobs = append(pjobs, j)
}
}
// get the highest priority before currentTime
var prio uint
for _, j := range pjobs {
if j.prio > prio {
prio = j.prio
}
}
// get the job by prio
for k, j := range pjobs {
if j.prio == prio {
job, jobs = j, append(js[:k], js[k+1:]...)
return
}
}
panic("prio and job doesn't match")
}
// if there is no pending task, get the next job
job = js[0]
for k, j := range js {
if j.at < job.at {
job, jobs = j, append(js[:k], js[k+1:]...)
return
}
}
jobs = js[1:]
return
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment