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