Die jetzige Implementierung von Multitasking benutzt synchrone, kooperative Threads, sogenannte exothread_t
.
Die auszuführenden Exothreads werden verwaltet von einem exoscheduler_t
, der die aktiven unter ihnen in
einer runlist
speichert.
Der Nachteil einer kooperativen Threadimplementierung ist die Möglichkeit, zu lange die Rechenzeit zu beanspruchen, ohne zwischenzeitlich die CPU Ressource weiterzureichen. Dieser Nachteil muß in jedem Fall bei blockierenden Systemaufrufen in Kauf genommen werden.
╭────────────────╮ │ exoscheduler_t │ ├────────────────┤1 n╭─────────────╮ │ runlist ┼──────────●│ exothread_t │ ╰────────────────╯ run▸ ╰──────┬──────╯ │ ╭───────────────╮ │ │ System/OS API │───────────────────┘ ╰───────┬───────╯ ◂calls splits ∆ into ╭──────────────╮ │ ╭──────────────────╮ │ Blocking Call├──┴──┤ Non Blocking Call│ ╰──────────────╯ ╰──────────────────╯ ┊┌┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┐ └┊ ↯ prevents execution of other exothreads ┊ └┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┘
Eine einfache Lösung ist es, den aktuellen Thread eine Art Signal absenden zu lassen, bevor er einen
blockierenden Systemaufruf tätigt. Dieses Signal bewirkt, daß ein neuer Systemthread gestartet wird, der
das Ausführen von exothread_t.run
innerhalb von exoscheduler_t
übernimmt.
Sobald der blockierende Aufruf zurückkehrt, sorgt ein neues Signal dafür, daß der ältere Thread wieder
die Kontrolle übernimmt, sobald der neue Systemthread exoscheduler_t
verlassen hat.
Da das Starten und Beenden von Systemthreads auf Dauer zu teuer ist, muß der neu einzuführende
threadpool_t
mehrere Systemthreads parken und auf Abruf bereitstellen.
◂request new ╭──────────────╮1 thread n╭────────────────╮ │ threadpool_t ├─────────────●│ exoscheduler_t │ ╰──────┬1──────╯ ◂release ╰⇡──────┬────────╯ │ ┊ │ ▾run │ ▴signals ┊ │ ╭───────●n──────╮ enter ┊ ... │ System Thread │ ┊ ... ╰───────────────╯ ▴signals ┊ │ ▾calls system exit ┊ │ ╭───────┴──────↓────────╮ │ Blocking Call Wrapper │ ╰──────────────┬────────╯ │ ▾calls ╭──────↓────────╮ │ System/OS API │ ╰───────────────╯