Vorige                       Inhoud                      Volgende
_________________________________________________________________

TS                      860409          (c) 1986 by ORD-GROUP  33


initialiseert het systeem en start console en login processen op.

Multiprocessing en synchronisatie
Multiprocessing  is  gerealiseerd  met behulp  van  conventionele
processen. Binnen de TS kernel zijn het eigenlijk geen processen,
doch slechts coroutines.  Deze coroutines geven de CPU alleen  op
door  een expliciete actie,  namelijk een aanroep van de  routine
"sleep". Omdat er slechts een processor is, hebben coroutines dus
de CPU (en de datastructuren van TS) voor zich alleen. De uitzon-
deringen  op deze situatie zijn de interrupts.  Wanneer ook  deze
niet toegestaan zijn (bijvoorbeeld tijdens het veranderen van een
kritieke datastructuur) worden de interrupts ge-disabled.

TS  coroutines  kunnen  in diverse toestanden  verkeren.  In  een
aantal  toestanden  staan ze op een "queue".  De  queues  die  TS
bijhoudt  zijn  de "user queue",  de "system queue" en de  "sleep
queue". De user queue bevat gebruikers processen, de system queue
processen  in de systeem fasen.  De sleep queue bevat  "slapende"
coroutines  (routines  die  de  subroutines  "sleep"  aan  hebben
geroepen). Het actieve proces (of coroutine) staat op geen enkele
queue.

Coroutines hebben de hoogste prioriteit: zolang er nog coroutines
op de system queue staan,  komen gebruikers processen niet aan de
beurt.  Wanneer  de  system queue leeg is,  wordt de  user  queue
geconsulteerd.  Is  die ook leeg,  dan krijgt het speciale "null"
process  de  processor.  Dit proces doet niets,  op een  speciale
manier.  Met behulp van de machine instructie HALT wordt  gewacht
op   de  eerstvolgende  interrupt.   Daarna  wordt  de  processor
vrijgegeven.

Synchronisatie tussen coroutines vindt plaats door te wachten  op
"events".  Een  event  is  een  willeurige  16-bits  waarde,  bij
conventie  het  adres van een tabel geassocieerd met de  conditie
waarop gesynchroniseerd wordt.  Een coroutine die besluit te gaan
wachten  roept  de subroutine "sleep" aan met  als  argument  het
event waarop gewacht moet worden. De coroutine wordt dan inactief
(op  de sleep queue geplaatst) tot het moment dat er een "wakeup"
plaatsvindt  op dat event.  De subroutine "wakeup" accepteert  op
gelijke wijze een event als argument.  Alle coroutines die op dat
event  aan  het wachten waren worden van de sleep queue  naar  de
system queue verplaatst.

Wanneer  een  "sleep"  aanroep  terugkeert,  is  er  echter  geen
garantie  dat de gewenste conditie bestaat.  Er  kunnen  namelijk
andere  coroutines uitgevoerd zijn tussen de bijbehorende  wakeup
en het terugkeren van de "sleep" aanroep. Dus, sleep/wakeup biedt
mogelijkheden tot synchronisatie, maar is niet voldoende.

Dit  wordt  ondervangen  door in plaats van een  simpele  "sleep"
aanroep  een  lus te gebruiken van de vorm "WHILE  conditie  niet
waar DO sleep(wachtpunt) OD".

Het  bovenbeschreven probleem kan nog verergerd worden  door  het
bestaan van "signals".  Signals vertellen een proces of coroutine
om  iets  te  doen.  Signals  kunnen  onder  andere  zijn  "Breek

_________________________________________________________________

Vorige                       Inhoud                      Volgende