Thread Pool

Integration eines Threadpools in ein synchrones,
kooperatives Threadmodell.

Donnerstag, 22. September 2011

Motivation

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 weiterzu­rei­chen. Dieser Nachteil muß in jedem Fall bei blockierenden Systemaufrufen in Kauf ge­nom­men 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 ┊
        └┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┘
Abbildung 1: Scheduler und synchrone, kooperative (exo)Threads

Lösungs Idee

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 │
                                ╰───────────────╯
Abbildung 2: Threads auf Bedarf von Threadpool abrufen