RTP Real-Time Programmatuur hoofdstuk 7: concurrent programming Yolande Berbers Programmatuur voor real-time controle slide 1 RTP kenmerken van een RTS (copie van slide van H1) verschillende software componenten zijn gelijktijdig actief de apparaten in de omgeving werken gelijktijdig deze gelijktijdigheid wordt het best gerealiseerd door gelijktijdig uitvoerende software componenten meer en meer real-time systemen zijn gedistribueerde systemen dit vraagt ondersteuning van programmeertalen en/of systemen Yolande Berbers Programmatuur voor real-time controle slide 2 RTP gelijktijdigheid: inleiding Multiprogrammatie gelijktijdige processen processen: onafhankelijk of samenwerkend Monoprocessor multiplexing van de CPU Multiprocessor processen voeren echt gelijktijdig uit Yolande Berbers Programmatuur voor real-time controle slide 3 RTP samenwerkende processes samenwerkende processen: elke proces wordt beïvloed door of beïnvloed andere processen ze delen informatie (gegevens, toestandsinformatie, …) veronderstelt “communicatie mechanisme” voordelen: modulariteit versnelling monoprocessor: als ene moet wachten kan andere verder multiprocessor: werkelijk in parallel Yolande Berbers Programmatuur voor real-time controle slide 4 RTP communicatie mechanismen gedeeld geheugen (zie H8) booschappen (zie H9) zenden - ontvangen sturen van events (zie H11) asynchroon Yolande Berbers Programmatuur voor real-time controle slide 5 RTP gedeeld geheugen processen delen stuk van geheugen besturingssyst.oproepen voor export / import geheugen communicatie zonder tussenkomst besturingssysteem Yolande Berbers Process A Process B Import Export Store Ri,xyz Load Rj,xyz Programmatuur voor real-time controle slide 6 RTP communicatie met boodschappen geen gedeeld geheugen besturingssysteemoproepen voor zenden / ontvangen van boodschappen Process A Send Yolande Berbers besturingssysteem Process B Receive Programmatuur voor real-time controle slide 7 RTP events (zie H11) vergelijkbaar met interrupts besturingssyst.oproep voor signaleren van event (kill) / voor aanduiden van handler (signal) (volgt het resumptionmodel) Process A Kill Yolande Berbers Process B Signal Programmatuur voor real-time controle slide 8 RTP concurrent programming: inleiding concurrent programming = notaties en technieken voor uitdrukken van potentieel parallellisme oplossen van synchronisatie en communicatie concurrent programming biedt abstractiemechanismen om parallellisme te beschrijven onafhankelijk van de implementatiedetails de implementatie van parallellisme onderwerp van computersystemen (hardware en software) is onafhankelijk van concurrent programming Yolande Berbers Programmatuur voor real-time controle slide 9 RTP seq. vs concurrent prog. talen sequentiële prog.talen: Pascal, C, C++, Fortran, COBOL programma’s hebben slechts 1 controledraad (Engels: thread) ze voeren uit, bevel per bevel, totdat het programma eindigt het pad door het programma kan variëren al naar gelang de invoer, maar bij gelijke invoer heb je een gelijk pad ‘concurrent’ programmeertalen (programmeertalen voor gelijklopende onderdelen) bevatten de notie van proces elke proces heeft (tenminste) 1 controledraad implementatie van processen: uitvoering op 1 enkele processor (multiprogrammatie) uitvoering op multiprocessor (met gedeeld geheugen) uitvoering op multicomputer (met gescheiden geheugen) concurrent slaat op potentieel parallellisme Yolande Berbers Programmatuur voor real-time controle slide 10 RTP een proces en zijn levencyclus niet bestaand niet bestaand Proces Code PC Data + Stack gecreëerd initialiserend beëindigd uitvoerbaar Yolande Berbers Programmatuur voor real-time controle slide 11 RTP seq. vs concurrent prog. talen RTSS (run-time support system) heeft de taak van het creëren en initialiseren van een proces eventueel ook van het schedulen van de verschillende controledraden wordt meestal door de compiler gegenereerd alternatief voor concurrent programmeertalen gescheiden processen schrijven met een sequentiële taal de mogelijkheden van het besturingssysteem gebruiken om gelijktijdige uitvoering te bekomen Yolande Berbers Programmatuur voor real-time controle slide 12 RTP proces, controledraad processen worden voorzien in alle besturingssystemen elke proces voert uit in een eigen virtuele machine, zonder interferentie van andere processen (logisch gezien alsof ze het enige proces zijn) controledraden (threads) soort subproces binnen een klassiek proces alle controledraden hebben toegang tot hele virtuele machine de programmeur en de taal moeten de controledraden voor elkaar beschermen Yolande Berbers Programmatuur voor real-time controle slide 13 RTP Threads Process Threads Code Code PC PC PC PC Data + Stack Data + Stack Thread, LWP (Lightweight Process) Yolande Berbers Programmatuur voor real-time controle slide 14 RTP Threads Process Process Registers Registers Registers PC Code Data Registers Registers Registers Other state ... Stack PC Code Data Other state ... PC Stack Stack Registers Registers Registers Other state ... Resources Resources Yolande Berbers Programmatuur voor real-time controle slide 15 RTP Threads Thread own state IC, registers, CC, …, stack (+ SP) code, data, other resources: shared Disadvantage no protection between threads of 1 task Advantages: context switch = less overhead thread creation / termination = cheap Yolande Berbers Programmatuur voor real-time controle slide 16 RTP Threads Implementation User-Level Threads Supported by OS Library Routines SVC CREATE-THREAD Switching = Fast! More Overhead Blocking SVC! threads blocked! Blocking SVC other threads still run Scheduling (process) Scheduling (thread) E.g. Unix E.g. OS/2, Solaris, ... Yolande Berbers Programmatuur voor real-time controle slide 17 RTP Threads Client Server Client Client Server Client Yolande Berbers Programmatuur voor real-time controle slide 18 RTP Kernel Threads Switch Blocking SVC Sched. Multi-CPU Overhead Switch thread by kernel: Fair (?) # in Parallel Lib. Fast! Routine (user level) Yolande Berbers Wait (block Progr. (do process) it yourself) Programmatuur voor real-time controle Max. 1 slide 19 RTP Threads Kernel (OS): single-threaded vs multi-threaded single-thread: at most 1 process active in kernel multi-thread: many processes active in kernel synchronization! (shared data structures) Yolande Berbers Programmatuur voor real-time controle slide 20 RTP seq. vs concurrent prog. talen discussie: op welk niveau moet concurrency aangeboden worden: door de taal of door het besturingssysteem ? Ada en Java bieden concurrency in de taal C en C++ niet Yolande Berbers Programmatuur voor real-time controle slide 21 RTP seq. vs concurrent prog. talen voordelen van concurrent programmeertalen beter leesbare en onderhoudbare code draagbaarder over meerdere besturingssystemen heen soms is er geen besturingssysteem op een real-time systeem de compiler kan op een aantal zaken testen voordelen combinatie sequentiële taal + besturingssyst gemakkelijker om programma's geschreven in verschillende talen te combineren op sommige besturingssystemen is het moeilijk om sommige concurrent taalmodellen te implementeren omdat er standaarden zijn voor besturingssystemen, zijn de programma's draagbaarder Yolande Berbers Programmatuur voor real-time controle slide 22 RTP constructies voor concurrent programmeren 3 fundamentele faciliteiten uitdrukken van gelijktijdig uitvoeren (door de notie van proces) synchronisatie tussen processen communicatie tussen processen 3 verschillende soorten relaties onafhankelijk samenwerkend in competitie Yolande Berbers Programmatuur voor real-time controle slide 23 RTP gelijktijdig uitvoeren verschillen tussen procesmodellen structuur niveau granulariteit initialisatie beëindiging relaties tussen gecreëerd proces en andere voorstelling Yolande Berbers Programmatuur voor real-time controle slide 24 RTP gelijktijdig uitvoeren structuur statisch aantal processen is vast dit aantal is gekend tijdens compilatie dynamisch aantal processen kan variëren van uitvoering tot uitvoering niveau vlak processen enkel gedefinieerd op hoogste niveau genest processen kunnen een hiërarchie vormen: processen kunnen andere processen starten (vader/kind) Yolande Berbers Programmatuur voor real-time controle slide 25 RTP gelijktijdig uitvoeren granulariteit fijn het is ‘goedkoop’ om processen te creëren in een typisch programma worden er veel gecreëerd voor telkens een hele kleine taak grof het is ‘duur’ om een proces te creëren er worden geen grote aantallen processen gecreëerd initialisatie parameters doorgeven expliciete communicatie na creatie Yolande Berbers Programmatuur voor real-time controle slide 26 RTP gelijktijdig uitvoeren beëindiging beëindigen van de code door uitvoering van een specifiek ‘zelfmoord’ bevel expliciete moord door een ander proces uitvoering van een niet-opgevangen uitzondering nooit (oneindige lus) wanneer niet meer nodig (geen communicatie meer mogelijk) relatie tussen gecreëerd proces en andere vader/kind: vader (creërend proces) wacht tot het kind gecreëerd en geïnitialiseerd is hoeder/afhankelijke: hoeder kan niet het blok verlaten waarin de afhankelijke is gecreëerd, voordat de afhankelijke beëindigd is vader en hoeder kunnen maar hoeven niet zelfde proces te zijn Yolande Berbers Programmatuur voor real-time controle slide 27 RTP Process States niet bestaand niet bestaand gecreëerd wacht op init kind Yolande Berbers initialiserend beëindigd uitvoerbaar wacht op afhank. einde Programmatuur voor real-time controle slide 28 RTP gelijktijdig uitvoeren terminologie bij object-georiënteerde systemen elke proces is een object (maar niet omgekeerd) actieve objecten: nemen spontaan acties reactieve objecten reageren enkel op invocaties (= operaties die uitgevoerd worden op een object) bv resources (hulpmiddelen) passieve objecten reactieve objecten waarvan de operaties altijd kunnen uitgevoerd worden beschermde resource: beschermd door passieve entiteit server: resource waarbij de controle actief is (proces is nodig) Yolande Berbers Programmatuur voor real-time controle slide 29 RTP gelijktijdig uitvoeren voorstelling: 4 basis mechanismen co-routines fork/join cobegin/coend expliciete procesdeclaratie Yolande Berbers Programmatuur voor real-time controle slide 30 RTP procesvoorstelling: co-routines controle wordt expliciet doorgegeven (sleutelwoord resume): er is geen return-bevel relatie is symmetrisch een routine A voert ‘resume B’ uit routine A stopt uitvoeren routine B voert uit vanaf het punt waar het vroeger gestopt was routine A bewaart alle statusinformatie, zodat het later op hetzelfde punt kan verder gezet worden Yolande Berbers Programmatuur voor real-time controle slide 31 RTP procesvoorstelling: co-routines Co-routine A 1 6 Co-routine B 2 3 resume B 7 resume B 12 11 Co-routine C 4 resume C 8 10 5 resume A 9 resume A 6 13 14 12 resume B 15 resume C Yolande Berbers Programmatuur voor real-time controle slide 32 RTP procesvoorstelling: fork en join methode: C := fork F join C; een nieuw proces start de uitvoering van F oproepend proces gaat ook verder oproepend proces wacht op einde F gebruikt in POSIX bij fork kun je parameters doorgeven met wait wacht je, 1 waarde keert terug flexibel maar niet erg gestructureerd geven gemakkelijk aanleiding tot fouten hoeder moet bv expliciet wachten op al zijn kinderen Yolande Berbers Programmatuur voor real-time controle slide 33 RTP procesvoorstelling: fork en join tijdsas fork fork P F P F join join vaderproces voert join uit voordat kind beëindigd is Yolande Berbers kindproces heeft gedaan voordat vader join uitvoert Programmatuur voor real-time controle slide 34 RTP procesvoorstelling: cobegin/coend na cobegin (of parbegin) staan een aantal blokken die in parallel uitgevoerd worden (ze worden allemaal samen opgestart) het vaderproces wacht, of voert 1 van de blokken uit bij coend (of parend) wordt er gewacht tot alle blokken beëindigd zijn Yolande Berbers Programmatuur voor real-time controle slide 35 RTP procesvoorstelling: cobegin/coend tijdsas cobegin coend Yolande Berbers Programmatuur voor real-time controle slide 36 RTP procesvoorstelling: ex-/impliciete procesdeclaratie expliciete procesdeclaratie routines geven tekstueel aan of ze door een apart proces uitgevoerd worden (modula 1) het is niet meer de oproeper van de routine die aangeeft dat een nieuw proces gecreëerd moet worden impliciete procesdeclaratie alle processen die gedeclareerd worden binnen een blok beginnen in parallel uit te voeren bij begin van het blok (Ada) Yolande Berbers Programmatuur voor real-time controle slide 37 RTP gelijktijdige uitvoering in Ada benaming voor sequentieel proces: task kan gedeclareerd worden wordt gecreëerd wanneer declaratie zichtbaar wordt: impliciet procedure eenvoudige_taak eindigt niet voordat task A eindigt procedure eenvoudige_taak is task A; task body A is -- lokale declaraties begin -- bevelen van de taak A end A; begin ... -- taak A begint met uitvoeren voor het eerste bevel in dit blok end eenvoudige_taak; Yolande Berbers Programmatuur voor real-time controle slide 38 RTP gelijktijdige uitvoering in Ada het is mogelijk een task-type te definiëren maakt het mogelijk om een rij van taken te declareren task type T; type Long is array (1..100) of T; L: Long; task body T is -- lokale declaraties begin -- bevelen van de taak T end T; Yolande Berbers Programmatuur voor real-time controle slide 39 RTP gelijktijdige uitvoering in Ada parameters kunnen doorgegeven worden bij initialisatie procedure Main is type Dimension is (Xplane, Yplane); task type Control (Dim: Dimension); C1: Control(Xplane); C2: Control(Yplane); task body Control is -- lokale declaraties begin -- bevelen van de taak Control (zie in boek) end Control; begin null; end Main; Yolande Berbers Programmatuur voor real-time controle slide 40 RTP gelijktijdige uitvoering in Ada uitzonderingen bij initialisatie: de creërende taak krijgt de uitzondering ‘Tasking_error’ tijdens uitvoering: de nieuwe taak mag de uitzonderingen opvangen niet opgevangen uitzondering: nieuwe taak wordt beëindigd beëindiging van een taak de taak beëindigt zijn uitvoering (normaal of door uitzondering) de taak voert het bevel ‘terminate’ uit (zie later) de taak is gestopt door een andere taak (via abort) Yolande Berbers Programmatuur voor real-time controle slide 41 RTP gelijktijdige uitvoering in POSIX twee mechanismen voor processen fork() creëert een exacte copie van het oproepende proces met wait() kan het oproepende proces wachten op het gecreëerde voor threads allerhande routines voor creatie en beheer van threads vaak met veel parameters nogal complex beide mechanismen situeren zich op het niveau van het besturingssysteem (zijn dus niet in een taal geïntegreerd) Yolande Berbers Programmatuur voor real-time controle slide 42 RTP gelijktijdige uitvoering in POSIX threads in POSIX alle threads hebben attributen (vb stack size) attribute object om deze attributen te manipuleren typedef … pthread_t; typedef … pthread_attr_t; int pthread_attr_init (pthread_attr_t *attr); /* initializes a thread attribute pointed at by attr to default values */ int pthread_setstacksize (pthread_attr_t *attr, size_t stacksize); /* set the stack size of a thread attributed */ int pthread_attr_setstrackaddr (pthread_attr_t *attr, void *stackaddr); /* set the stack address of a thread attribute */ Yolande Berbers Programmatuur voor real-time controle slide 43 RTP gelijktijdige uitvoering in POSIX threads in POSIX alle threads hebben een identifier, uniek in het proces thread kan deze identifier bekomen via pthread_self typedef … pthread_t; pthread pthread_self (void); /* return the thread_id of the calling thread */ int pthread_equal (pthread_t t1, pthread_t t2); /* compare two thread ids */ Yolande Berbers Programmatuur voor real-time controle slide 44 RTP gelijktijdige uitvoering in POSIX threads in POSIX thread is klaar om uit te voeren na creatie pthread_create, 4 argumenten: thread identifier, attributes, functie met de code, parameters die doorgegeven moeten worden int pthread_create (pthread_t *thread, const pthread_attr_t *attr, void * (*start_routine) (void*), void *arg); /* create a new thread with the given attributes and call the given start_routine with the given argument */ Yolande Berbers Programmatuur voor real-time controle slide 45 RTP gelijktijdige uitvoering in POSIX threads in POSIX thread kan eindigen door oproep van pthread_exit bij ontvangst van een signal (zie hoofdstuk 10) gestopt door pthread_cancel int pthread_exit (void *value_ptr); /* terminate the calling thread and make the pointer value_ptr available to any joining thread */ Yolande Berbers Programmatuur voor real-time controle slide 46 RTP gelijktijdige uitvoering in POSIX threads in POSIX wachten op het einde van een andere thread: pthread_join int pthread_join (pthread_t thread, void **value_ptr); /* suspends the calling thread until the named thread has terminated, and returned values are pointed at by value_ptr */ Yolande Berbers Programmatuur voor real-time controle slide 47 RTP gelijktijdige uitvoering in POSIX threads in POSIX opkuisen na uitvoering en vrijgave van geheugen: bij join met detach attribute: geen join nodig int pthread_attr_setdetachstate (pthread_attr_t *attr, int *detachstate); /* set the detach state of the attribute */ int pthread_detach (pthread_t thread); /* the storage space associated with the given thread may be reclaimed when the thread terminates */ Yolande Berbers Programmatuur voor real-time controle slide 48 RTP Robot Arm in C/POSIX #include <pthread.h> pthread_attr_t attributes; pthread_t xp, yp, zp; typedef enum {xplane, yplane, zplane} dimension; int new_setting(dimension D); void move_arm(int D, int P); void controller(dimension *dim) { int position, setting; position = 0; while (1) { setting = new_setting(*dim); position = position + setting; move_arm(*dim, position); }; /* note, process does not terminate */ } Yolande Berbers Programmatuur voor real-time controle slide 49 int main() { dimension X, Y, Z; void *result; Need JOIN as when a process terminates, all its threads are forced to terminate X = xplane, Y = yplane; Z = zplane; PTHREAD_ATTR_INIT(&attributes); /* set default attributes */ PTHREAD_CREATE(&xp, &attributes, (void *)controller, &X); PTHREAD_CREATE(&yp, &attributes, (void *)controller, &Y); PTHREAD_CREATE(&zp, &attributes, (void *)controller, &Z); PTHREAD_JOIN(xp, &result); /* need to block main program */ exit(-1); /* error exit, the program should not terminate */ } SYS_CALL style indicates a call to sys_call with a check for error returns RTP Threads in Java Two techniques: subclassing Thread and overriding run Implementing Runnable Interface for classes that extend another class no multiple inheritence Yolande Berbers Programmatuur voor real-time controle slide 51 RTP Threads in Java class FirstThread extends Thread { public FirstThread (String str) { super(str); } public void run () { … what the thread should do … } } class SecondThread extends Thread { public SecondThread (String str) { super(str); } public void run () { … what this thread should do … } } public class TwoThreadsTest { public static void main (String [] args) { new FirstThread(“First”).start(); new SecondThread(“Second”).start(); } Yolande Berbers Programmatuur voor real-time controle slide 52 RTP Threads in Java class Name extends Whatever implements Runnable { public Name (...) { ... } public void run () { … what the thread should do … } } public class ThreadsTest { public static void main (String [] args) { Name obj = new Name (…); Thread objThread = new Thread(obj, “NameThread”); objThread.start(); } } Yolande Berbers Programmatuur voor real-time controle slide 53 RTP Threads in Java Lifecycle of a thread yield( ) start( ) new Thread Runnable block on I/O sleep( millisec ) wait for a condition Not Runnable run() terminates Dead Yolande Berbers Programmatuur voor real-time controle slide 54 RTP Robot Arm Example public class UserInterface { public int newSetting (int Dim) \{ ... \} ... } public class Arm { public void move(int dim, int pos) \{ ... \} } UserInterface UI = new UserInterface(); Arm Robot = new Arm(); Yolande Berbers Programmatuur voor real-time controle slide 55 RTP Robot Arm Example public class Control extends Thread { private int dim; public Control(int Dimension) // constructor { super(); dim = Dimension; } public void run() { int position = 0; int setting; while(true) { Robot.move(dim, position); setting = UI.newSetting(dim); position = position + setting; } Yolande Berbers} Programmatuur voor real-time controle slide 56 RTP Robot Arm Example final int xPlane = 0; final int yPlane = 1; final int zPlane = 2; // final indicates a constant Control C1 = new Control(xPlane); Control C2 = new Control(yPlane); Control C3 = new Control(zPlane); C1.start(); C2.start(); C3.start(); Yolande Berbers Programmatuur voor real-time controle slide 57 RTP Alternative Robot Control public class Control implements Runnable { private int dim; public Control(int Dimension) { dim = Dimension; } // constructor public void run() { int position = 0; int setting; while(true) { Robot.move(dim, position); setting = UI.newSetting(dim); position = position + setting; } } Yolande } Berbers Programmatuur voor real-time controle slide 58 RTP Alternative Robot Control final int xPlane = 0; final int yPlane = 1; final int zPlane = 2; Control C1 = new Control(xPlane); // no thread created yet Control C2 = new Control(yPlane); Control C3 = new Control(zPlane); // constructors passed a Runnable interface and threads created Thread X = new Thread(C1); Thread Y = new Thread(C2); Thread Z = new Thread(C2); X.start(); // thread started Y.start(); Z.start(); Yolande Berbers Programmatuur voor real-time controle slide 59 RTP Java Thread States non-existing Create thread object new start executable run method exits stop, destroy blocked Yolande Berbers dead Programmatuur voor real-time controle slide 60 RTP Points about Java Threads Java allows dynamic thread creation Java (by means of constructor methods) allows arbitrary data to be passed as parameters Java allows thread hierarchies and thread groups to be created but there is no master or guardian concept; Java relies on garbage collection to clean up objects which can no longer be accessed The main program in Java terminates when all its user threads have terminated (see later) One thread can wait for another thread (the target) to terminate by issuing the join method call on the target's thread object. The isAlive method allows a thread to determine if the target thread has terminated Yolande Berbers Programmatuur voor real-time controle slide 61 RTP A Thread Terminates: when it completes execution of its run method either normally or as the result of an unhandled exception; via its stop method — the run method is stopped and the thread class cleans up before terminating the thread (releases locks and executes any finally clauses) the thread object is now eligible for garbage collection. if a Throwable object is passed as a parameter to stop, then this exception is thrown in the target thread; this allows the run method to exit more gracefully and cleanup after itself stop is inherently unsafe as it releases locks on objects and can leave those objects in inconsistent states; the method is now deemed obsolete (depreciated) and should not be used by its destroy method being called -- destroy terminates the thread without any cleanup (never implemented in JVM) Yolande Berbers Programmatuur voor real-time controle slide 62 RTP Daemon Threads Java threads can be of two types: user threads or daemon threads Daemon threads are those threads which provide general services and typically never terminate When all user threads have terminated, daemon threads can also be terminated and the main program terminates The setDaemon method must be called before the thread is started (Daemon threads provide the same functionality as the Ada ``or terminate'' option on the select statement) Yolande Berbers Programmatuur voor real-time controle slide 63 RTP Thread Exceptions IllegalThreadStateException is thrown when: start method is called and thread has already been started the setDaemon method has been called and the thread has already been started SecurityException is thrown by security manager when: a stop or destroy method has been called on a thread for which the caller does not have the correct permissions for the operation requested NullPointerException is thrown when: A null pointer is passed to the stop method InterruptException is thrown if a thread which has issued a join method is woken up by the thread being interrupted rather than the target thread terminating Yolande Berbers Programmatuur voor real-time controle slide 64 RTP Ada, Java and C/POSIX Ada and Java provide a dynamic model with support for nested tasks and a range of termination options. POSIX allows dynamic threads to be created with a flat structure; threads must explicitly terminate or be killed. Yolande Berbers Programmatuur voor real-time controle slide 65 RTP een eenvoudig real-time systeem aflezen van temperatuur en aanpassen van verwarming aflezen van druk en aanpassen van pomp telkens de waarden ook op het scherm printen thermokoppel T drukmeter P verwarming S pomp scherm Yolande Berbers Programmatuur voor real-time controle slide 66 RTP een eenvoudig real-time systeem 3 implementatiemethoden 1 sequentieel programma houdt geen rekening met het feit dat T, P en S logisch gezien gelijktijdig en onafhankelijk van elkaar zijn vraagt geen ondersteuning van het run-time- of besturingssysteem 3 sequentiële programma's T, P en S zijn geschreven in een sequentiële taal met primitieven van het besturingssysteem worden 3 processen hiervoor gecreëerd 1 concurrent programma T, P en S zijn 3 threads run-time ondersteuning is nodig Yolande Berbers Programmatuur voor real-time controle slide 67 RTP een eenvoudig real-time systeem 1 sequentieel programma, houdt geen rekening met feit dat T, P en S logisch gezien gelijktijdig en onafhankelijk van elkaar zijn procedure Controller is TR : Temp_Reading; PR : Pressure_Reading; HS : Heater_Setting; PS : Pressure_Setting; begin loop Read(TR); Temp_Convert(TR, HS); Write(HS); Write(TR); Read(PR); Pressure_Convert(PR, PS); Write(PS); Write(PR); end loop; end Controller; Yolande Berbers Programmatuur voor real-time controle slide 68 RTP een eenvoudig real-time systeem 1 sequentieel programma: bespreking temperatuurmetingen en drukmetingen gebeuren met gelijke intervallen (misschien hoeft dat niet in de praktijk) mogelijke oplossing: een aantal if-then-else bevelen toevoegen wanneer het programma bezig is met temperatuur kan er geen aandacht gegeven worden aan de druk en vice-versa als probleem met lezen van 1 van de 2 metingen blokkeert het geheel (dus ook het deel dat daar niets mee te maken heeft) mogelijke oplossing: testen of er kan gelezen worden (p. 195) nadeel is hier wel dat men test via ‘polling’ (busy waiting) dit vraagt veel processortijd belangrijkste opmerking: geen weerspiegeling van werkelijkheid, waar temperatuur en druk volledig onafhankelijke subsystemen zijn Yolande Berbers Programmatuur voor real-time controle slide 69 RTP een eenvoudig real-time systeem 3 sequentiële programma's (met primitieven van het besturingssysteem worden 3 processen hiervoor gecreëerd) package Operating_System_Interface is type Thread_Id is private; type Thread is access procedure; function Create_Thread (Code: Thread) return Thread_Id; ... end Operating_System_Interface; package processes is procedure Temp_Controller; procedure Pressure_Controller; end processes; package body processes is ... Yolande Berbers Programmatuur voor real-time controle slide 70 RTP een eenvoudig real-time systeem 3 sequentiële programma's (met primitieven van het besturingssysteem worden 3 processen hiervoor gecreëerd) procedure Controller is TC, PS: Thread_Id; begin TC := Create_Thread (Temp_Controller’Access); PC := Create_Thread (Pressure_Controller’Access); end Controller; bespreking doordat de taal geen ondersteuning biedt is dit moeilijk te schrijven en te onderhouden (zeker voor grotere systemen) bv niet erg duidelijk uit de code welke procedures nu gewone zijn en welke bedoeld zijn om als proces uit te voeren Yolande Berbers Programmatuur voor real-time controle slide 71 RTP een eenvoudig real-time systeem 1 concurrent programma waarbij T, P en S 3 threads zijn procedure Controller is task Pressure_Controller; task Temp_Controller; task body Temp_Controller is begin loop Read(TR); Temp_Convert(TR, HS); Write(HS); Write(TR); end loop; end Temp_Controller ; task body Pressure_Controller is ... begin null; end Controller ; Yolande Berbers Programmatuur voor real-time controle slide 72 RTP een eenvoudig real-time systeem 1 concurrent programma: bespreking de logica van de toepassing is mooi zichtbaar in de code dit maakt het geheel leesbaar en onderhoudbaar probleem dat telkens genegeerd werd: synchronisatie van de data die naar het scherm gestuurd worden (zie hoofdstuk 8) Yolande Berbers Programmatuur voor real-time controle slide 73 RTP seq. vs concurrent prog. talen voordelen van concurrent programmeertalen beter leesbare en onderhoudbare code draagbaarder over meerdere besturingssystemen heen soms is er geen besturingssysteem op een real-time systeem de compiler kan op een aantal zaken testen voordelen combinatie sequentiële taal + besturingssyst gemakkelijker om programma's geschreven in verschillende talen te combineren op sommige besturingssystemen is het moeilijk om sommige concurrent taalmodellen te implementeren omdat er standaarden zijn voor besturingssystemen, zijn de programma's draagbaarder Ada/Java: voordelen groter dan nadelen Yolande Berbers Programmatuur voor real-time controle slide 74