Plan for dagen Dagens sidesprang: Sverres editorer gjennom tidene & verktøyet tinyclip. Meldingsbasert synkronisering & kommunikasjon Ada & Occam (men hopper over occam.) Tilstandsmaskinmodellering Implementasjon i C Objektorientert (Java, Ada, C++) OCCAM POSIX Sverres editorer gjennom tidene Emacs Emacs folding mode CLiP & emacs folding mode tinyclip & emacs folding mode Word-97(!) html-mode & tinyclip Word-97 html-mode & tinyclip & clipprep Emacs, tinyclip & clipprep Nå, Emacs folding mode, tinyclip, clipprep, txt2doc Tinyclip Enkelt verktøy for literate programming Mikser kode og dokumentasjon Kan lette ut koden som en vil (flytte ting som hører sammen, sammen) --> Naturlig å vedlikeholde dokumentasjonen --> Øker vedlikeholdbarhet. Naturlig fokus på leseren istedet for kompilatoren Legger til rette for veldig kraftige makroer. Tinyclip eksempel This is normal text outside of all stubs and will be thrown away. /*** #File "test.txt" ***/ This will be the first line of the generated file test.txt /*** Slot 1 ***/ This is the last line of the file. /*** End of File ***/ OK lets define some stubs going into slot 1 /*** Slot 1 ***/ Text from first stub with name "Slot 1" /*** End of Slot 1 ***/ /*** Slot 1 ***/ Text from second stub with name "Slot 1" /*** End of Slot 1 ***/
Resultat: test.txt --- This will be the first line of the generated file test.txt Text from first stub with name "Slot 1" Text from second stub with name "Slot 1" This is the last line of the file. --- Message-based synchronization klassifiseringssystem The model of synchronization (Asynchroneous, Synchroneous, Remote Invocation) The method of process naming (direct vs. indirect and symetric vs. asymetric) The message structure (to which degree can complex types be sent) Ulemper med asynkrone meldinger Buffere er begrensede! -> Håndtering av fulle buffere (/fullt minne) Utdatert informasjon Håndtering av slike ting: komplekse patterns og protokoller. Umulig å resonnere på riktighet av kode. Fordel: slipper buffer prosesser (???) Synkronisering kan implementeres med hverandre... Synkron ved asynkron P1 P2 send(message) wait(message) wait(ack) send(ack) Remote invocation ved asynkron P1 P2 send(message) wait(message) wait(reply)... Construct reply send(reply)
Message structure Hvordan pakkes data? (endian-ness,typekompatibilitet) Pekere til objekter? Store rammeverk finnes (de blir gjerne store...) Standard Java - serialization (har fordel av standard, - kritisk avhengig av objektversjoner). Ada (Not messages, not remote invocation... -> extended randevous) Exception handling Selective wait (select, guards, terminate) Ada eks med select & terminate (Fra kap 7:) Process termination Completion of procedure body suicide: thread_exit() abort (e.g. from other process) dangerous Untrapped error Never When not needed (Ada's terminate).
Non-determinism and synchronization primitives. Konflikt igjen imellom å anta ikkedeterminisme og å sikre seg mot utsulting (kontekst her skal meldinger leses i rekkefølge? notify? semaforer?) p301: It is inappropriate for the synchronization to attempt to prevent starvation. Løsning: 1: Ikke anta determinisme for å synkronisere! 2:Kjenn scheduleren slik at du ikke programmerer for utsulting! (Vel, i praksis; FIFO...) Tilstandsmaskiner (9 foiler) Tilstandsmaskiner i occam typer -- legal states VAL INT s_play IS 0: VAL INT s_stop IS 1: PROTOCOL StateMachineEventProtocol CASE e_play e_stop : Tilstandsmaskiner i occam - kodestruktur PROC StateMachine(CHAN OF StateMachineEventProtocol events) INT state : SEQ state := s_stop WHILE TRUE SEQ CASE state s_stop events? CASE e_play SEQ #C printf("starting\n");fflush(stdout); state := s_play e_stop SKIP s_play...
State pattern objektorienterte tilstandsmaskiner Baseklasse med tomme virtuelle funksjoner for hvert event En tilstands-variabel som refererer til en instans av denne En instans av hvert tilstandsobjekt hvilket av disse tilstansvariabelen refererer til avgjør hvilken tilstand vi er i. Eventer --> kall til objektet som tilstandsvariabelen peker på. State-pattern implementasjon I class Casette_State { public: virtual void play(){ virtual void stop(){ ; class Casette_State_Stop: public Casette_State { void play() ; class Casette_State_Play: public Casette_State { void stop() ; State-pattern implementasjon II Casette_State_Play g_s_play; Casette_State_Play g_s_stop; Casette_State g_state = g_s_stop; Casette_State_Stop::play(){ printf("playing\n"); g_state = g_s_play; Casette_State_Stop::play(){ printf("stopping\n"); g_state = g_s_stop; POSIX Vi snakker om aksess til operativsystemets scheduler her! Dvs. ikke for cygwin her kjører vi fortsatt under cygwins scheduler. (... og ingen har portet ada hit.) bibliotekskall en API akkurat som win32
Posix threads (pthreads.h) deler: Posix (Foil med Thread-API) Routine Prefix Functional Group pthread_ Threads themselves and miscellaneous subroutines pthread_attr_ Thread attributes objects pthread_mutex_ Mutexes pthread_mutexattr_ Mutex attributes objects. pthread_cond_ Condition variables pthread_condattr_ Condition attributes objects pthread_key_ Thread-specific data keys Posix Eks1 starte tråder: #include <pthread.h> #include <stdio.h> #define NUM_THREADS 5 void *PrintHello(void *threadid) { printf("\n%d: Hello World!\n", threadid); pthread_exit(null); int main(int argc, char *argv[]) { pthread_t threads[num_threads]; int rc, t; for(t=0;t<num_threads;t++){ printf("creating thread %d\n", t); rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t); if (rc){ printf("error; return code from pthread_create() is %d\n", rc); exit(-1); pthread_exit(null); Posix mutex int pthread_mutex_destroy (pthread_mutex_t *); int pthread_mutex_getprioceiling (const pthread_mutex_t *, int *); int pthread_mutex_init (pthread_mutex_t *, const pthread_mutexattr_t *); int pthread_mutex_lock (pthread_mutex_t *); int pthread_mutex_setprioceiling (pthread_mutex_t *, int, int *); int pthread_mutex_trylock (pthread_mutex_t *); int pthread_mutex_unlock (pthread_mutex_t *);
Posix (?) semaphores Posix condition variables int sem_init (sem_t * sem, int pshared, unsigned int value); int sem_destroy (sem_t * sem); sem_t *sem_open (const char *name, int oflag,...); int sem_close (sem_t *sem); int sem_wait (sem_t * sem); int sem_trywait (sem_t * sem); int sem_timedwait (sem_t * sem, const struct timespec *abstime); int sem_post (sem_t * sem); int sem_getvalue (sem_t * sem, int *sval); int pthread_cond_broadcast (pthread_cond_t *); int pthread_cond_destroy (pthread_cond_t *); int pthread_cond_init (pthread_cond_t *, const pthread_condattr_t *); int pthread_cond_signal (pthread_cond_t *); int pthread_cond_timedwait (pthread_cond_t *, pthread_mutex_t *, const struct timespec *); int pthread_cond_wait (pthread_cond_t *, pthread_mutex_t *); POSIX message queues mqueue.h Foil fra boken p. 302 Finnes ikke under cygwin kjør linux... Vel, linux krever 2.6 kjerne...