Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik Universität Rostock 3. April 2015.

Ähnliche Präsentationen


Präsentation zum Thema: "Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik Universität Rostock 3. April 2015."—  Präsentation transkript:

1 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik Universität Rostock 3. April 2015 Echtzeitbetriebssysteme Übungen M.Sc. Alexander Nitsch, M.Sc. Michael Rethfeldt (mit freundlicher Unterstützung von Dr.-Ing. Guido Moritz)

2 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 2 Übungsfahrplan Nr.BeschreibungInhalte 1Erzeugen und Starten von Prozessen I Von Threads und Prozessen 2Erzeugen und Starten von Prozessen II 3Pipes & Signale Inter-Prozess-Kommunikation (IPC) 4Messagequeues, Shared Memory 5POSIX & Threads Inter-Prozess-Synchronisation (IPS) 6Mutexe, Conditions & Semaphore unter POSIX 7Synchronisationsprotokolle & Deadlocks Schedulinganalysen 8Schedulinganalyse

3 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 3 Übung 1 – Hello World ////////////////////////////////////////////////////////// // Veranstaltung: Echtzeitbetriebssysteme // Dozent: Dr.-Ing. Frank Golatowski // Übungsleiter: Dipl.-Ing. Guido Moritz // Übung: 1 // Aufgabe: 1 // Name: aufgabe1.c // Beschreibung: Hello World Ausgabe ////////////////////////////////////////////////////////// #include int main(int argc, char *argv[]) { printf("Hello world!\n"); }

4 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik Übung 1 – fork() #include int main(void) { int status; int fork_pid; fork_pid=fork() ; if ( fork_pid == 0 ) { printf("* Ich bin der Sohn. *\n"); exit(3); } else if (fork_pid == -1) { printf("Aufruf von fork() gescheitert!\n"); exit(2); } wait(&status);// warten auf Ende des Sohnes printf("wait-Status: 0x%x | 0x%x | 0x%x |\n", status, (status>>8) & 0xff, status & 0xff); return 0; } 4 fork() fork_pid = fork_pid!=0 fork_pid==0 printf() exit() fork_pid!=-1 wait() printf()

5 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 5 Übung 1 – Starten von Prozessen

6 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 6 Übung 1 – Speicherbelegung Vater Code Daten Speicher Code Daten Speicher Daten Daten des Vaters Daten des Sohnes Code beider Prozesse

7 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 7 Übung 1 – Wieviele Söhne werden erzeugt? int main(int argc, char *argv[]) { fork(); } int main(int argc, char *argv[]) { switch ( fork() ) { case 0:printf(„Sohn erzeugt\n“); break; default:switch ( fork() ) { case 0: printf(„Sohn erzeugt\n“); break; default:printf(„Vater\n“); break; } break; }

8 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik Übung 1 – Wieviele Söhne werden erzeugt? 8 1. fork() printf() Vater Sohn2 2. fork() Sohn1 2. fork() Sohn3 ENDE printf() Vater Sohn2 Sohn1 1. fork() 2. fork()

9 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 9 Übung 2 Vater PID=1 Sohn 1 PID: 2 Sohn 2 PID: 3 Sohn 3 PID: 3 Sohn 4 PID: 4 Sohn 5 PID: 4 Sohn 6 PID: 5 Frage: Kann es sein, dass PID=3 und PID=4 zweimal vergeben werden?

10 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 10 Typischer Prozessbaum 3774 ? Ss 0:00 /usr/sbin/privoxy --user privoxy privoxy --pidfile 3779 ? Ss 0:00 /usr/sbin/sshd -o PidFile=/var/run/sshd.init.pid ? Ss 0:00 \_ sshd: bj [priv] ? S 0:00 | \_ sshd: pts/3 Ss+ 0:00 | \_ -bash ? Ss 0:00 \_ sshd: bj [priv] ? S 0:00 \_ sshd: pts/4 Ss 0:00 \_ -bash pts/4 R+ 0:00 \_ ps -fax 3834 ? S 0:00 /bin/sh /usr/bin/mysqld_safe --user=mysql 4016 ? S 0:00 \_ /usr/sbin/mysqld --basedir=/usr ? S 0:00 /usr/lib/AntiVir/antivir --updater-daemon 4770 ? Ss 0:00 /usr/sbin/cupsd 4815 ? Ss 0:01 /usr/sbin/nscd 4835 ? Ss 0:00 /usr/sbin/smbd -D -s /etc/samba/smb.conf 4842 ? S 0:00 \_ /usr/sbin/smbd -D -s /etc/samba/smb.conf 7378 ? S 0:04 \_ /usr/sbin/smbd -D -s /etc/samba/smb.conf ? S 0:00 \_ /usr/sbin/smbd -D -s /etc/samba/smb.conf

11 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 11 Übung 2 #include int main(void) { int var; printf(“PID(Father)=%d, var=%d\n", getpid(), var); if ( fork() == -1 ) { fprintf( stderr, "Aufruf fork() gescheitert!\n" ); } else { var++; printf(“PID=%d, var=%d\n", getpid(), var); if ( fork() == -1 ) { fprintf( stderr, "Fehler beim 2. fork()!\n"); } else { var++; printf(“PID=%d, var=%d\n", getpid(), var); } return 0; }

12 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 12 Übung 2 Typische Ausgaben nach stdout PID(Father): 5179, var=0 PID=5180, var=1 PID=5181, var=2 PID=5180, var=2 PID=5179, var=1 PID=5182, var=2 PID=5179, var=2

13 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 13 Übung 2: Execl() Vater fork() VaterSohn fork() Externes Programm Vater

14 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 14 Übung 2: Execl Fork() dient der Prozessverzweigung Execl() dient dem Starten des externen Programmes Nebeneffekt: –Alle Daten des Vaters werden gelöscht –Alle Filedescriptoren des Vaters werden freigegeben Anwendung: –Starten von Programmen, z.B. init

15 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 15 Execl()-Parametermapping int execl(const char *path, const char *arg,...); Ausführbare Datei Execl-ParameterArgument der Main- Funktion Anzahl der Parameter-1 argn const char *argargv[0] ….argv[1] int execl(“/bin/ls”, “ls”, “-lias”, NULL); Argument der Main-FunktionArgumente argn2 argv[0]ls argv[1]-lias

16 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 16 Übung 3 Fork() erzeugt Kopie aller Daten des Prozesses A Direkter Datenaustausch zwischen Prozessen nicht möglich Ausweg: Pipe des Betriebssystems Prozess AProzess B Betriebssystem

17 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 17 Übung 3 Array aus zwei File-Descriptoren: int fd[2] Erzeugen der Pipe mit pipe() Vererbung von fd[2] durch fork() an Sohn Lesen: fd[0] Schreiben: fd[1] Schließen der korrespondierenden File-Descriptoren –Writer schließt fd[0] –Reader schließt fd[1] Prozess AProzess B Betriebssystem write(fd[1]); read(fd[0]);

18 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 18 Übung 3 Prozess A Prozess B pipe(fd) fork() Initialisieren einer Pipe fd[2], File-Zähler=2 close(fd[0])close(fd[1]) Schließen des Lesedescriptors (fd[0]) und des Schreibdescriptors (fd[1]), File-Zähler=2 Erzeugen des Sohn- Prozesses, File-Zähler=4 write(fd[1])read(fd[0]) Datenaustausch über Pipe

19 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 19 Übung 3 Idealer Programmverlauf Unterbrochener Programmverlauf Signal Signale können jederzeit auftreten Nebenläufige Fehlerbehandlung erfolgt in Signal- Handlern Behandlung des Signals, sodass Hauptprogramm fehlerfrei weiterläuft ! Signal- behandlung

20 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 20 Übung 4 Systemweiten eindeutigen Key erzeugen Öffnen der Nachrichtenwarteschlange (Messagequeue) Projektidentifier proj_id kennzeichnet Nummer der Pipe Prozess AProzess B ftok(…,1) ftok(…,2) msgget() msgsnd() ftok(…,1) msgget() msgrcv(); Prozess C Betriebssystem Proj_id=2 ftok(…,2) msgget() msgrcv(); Proj_id=1

21 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 21 Übung 4 void main(void) { pid_t p=getpid(); switch ( fork() ) { case 0:printf(„The son!\n“); break; default: printf(„The father!\n“); printf(„pid: %d\n“,p); break; } void main(void) { switch ( fork() ) { case 0:printf(„The son!\n“); break; default: { pid_t p=getpid(); printf(„The father!\n“); printf(„pid: %d\n“,p); } break; } Was ist an welcher Schreibweise günstiger?

22 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 22 Übung 5 – Casting von Funktionszeigern Casting notwendig:Kein Casting notwendig: int main(int argc, char *argv[]) { … pthread_create( &thread, &attr, (void*)&thread_start, 0); … } void thread_start(void *ptr) { return; } int main(int argc, char *argv[]) { … pthread_create( &thread, &attr, thread_start, 0); … } void* thread_start(void *ptr) { return 0; } Linke Variante ist inkorrekt, da Rückgabetyp von thread_start falsch ist!

23 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 23 Übung 5 – Typen von Funktionszeigern Zeigerübergabe von Funktionen ohne typedefZeigerübergabe von Funktionen mit typedef #include int printme(const char *msg); void thread1(int (*function)(const char *ptr) ); void thread2(int (*)(const char *ptr) ); int main(int argc, char *argv[]) { thread1(printme); thread2(printme); return 0; } void thread1(int (*function)(const char *ptr) ) {function("Hans im Glück\n"); } void thread2(int (*function)(const char *ptr) ) {function("Der Wolf im Schafspelz\n"); } int printme(const char *msg) {printf(msg); return 0; } #include typedef int (*CALLBACK)(const char *ptr); int printme(const char *msg); void thread1(CALLBACK function); void thread2(CALLBACK); int main(int argc, char *argv[]) { thread1(printme); thread2(printme); return 0; } void thread1(CALLBACK function) {function("Hans im Glück\n"); } void thread2(CALLBACK function) {function("Der Wolf im Schafspelz\n"); } int printme(const char *msg) {printf(msg); return 0; }

24 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 24 Übung 6 – Condition Variablen Aktives WartenWarten mit Conditionvariablen void* reader_function(void *ptr) { chara=0; while( a!= 'q' ) { pthread_mutex_lock( &mutex ); if ( buffer_has_item == 1) { a=buffer; if ( a != 'q' ) consume_item(a,count); buffer_has_item = 0; } pthread_mutex_unlock( &mutex ); } return 0; } void* reader_function(void *ptr) { chara=0; while( a!= 'q' ) { pthread_mutex_lock( &mutex ); while ( buffer_has_item != 1) pthread_cond_wait( &cond_buffer_full, &mutex); a=buffer; buffer_has_item = 0; pthread_cond_signal( &cond_buffer_empty); pthread_mutex_unlock( &mutex ); } return 0; }

25 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 25 Übung 7 – Deadlock Zwei Prozesse betreten in unterschiedlicher Reihenfolge zwei kritische Abschnitte Kritischer Punkt: Threadumschaltung, wenn einer der Threads in einem kritischen Abschnitt ist  DEADLOCK

26 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 26 Übung 7 – Prioritäteninversion Ein höher priorisierter Thread wird durch einen niedriger priorisierten Thread unterbrochen. Bezeichnung: Direct Blocking

27 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 27 Übung 7 – Pass Through Blocking ProzessPrioritätPeriodeOffsetDeadlineRechenzeitAuslastung PHPH 3 (hoch) ,25 PMPM 2 (mittel) ,25 PLPL 1 (niedrig) ,42

28 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 28 Übung 7 – Priority Inheritance Protocol P L wird auf Priorität von P H angehoben, wenn P H das Mutex anfordert P M kommt nicht zum Zuge Zeit im kritischen Abschnitt wird verringert Keine Kenntnis der nutzenden Threads nötig

29 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 29 Übung 7 – Priority Ceiling Protocol (PCP) Vermeidung von Deadlocks und Mehrfachvererbungen (Chained Blocking) [Raj91] Einführung einer Ceiling-Konstanten c(Sj) pro Semaphor Sj –c(Sj) = Priorität des höchst-prioren Prozesses, der das Semaphor nutzen wird –Prozess P kann ein Semaphor S nur setzen, wenn seine Priorität größer als die der Ceiling-Konstanten aller nicht von P zur Zeit belegten Semaphoren ist (außer er besitzt bereits das höchst-priore Semaphor) –Kann ein Prozess ein Semaphor nicht setzen, wird die Priorität des unterbrochenen Prozesses auf die des unterbrechenden Prozesses erhöht Einführung einer System-Ceiling-Konstanten S* zur einfacheren Berechnung  Maximum aller Semaphor-Ceiling-Konstanten, die gerade genutzt werden Der Grundgedanke bei PCP ist, sicherzustellen, dass ein Prozess, der andere Prozesse in kritischen Abschnitten unterbricht und einen eigenen betritt, eine höhere Priorität in diesem Abschnitt garantieren muss als die Prioritäten aller unterbrochenen kritischen Abschnitte. Kann diese Bedingung nicht erfüllt werden, wird der Prozess blockiert.

30 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 30 Übung 7 – Beispiel PCP ProzessPrioritätPeriodeOffsetDeadlineRechenzeitAuslastung P0P0 3 (hoch) ,27 P1P1 2 (mittel) ,2 P2P2 1 (niedrig) ,47 3 Prozesse (P 0, P 1 & P 2 ) konkurrieren über 3 Semaphoren (S 0, S 1 & S 2 )  Statische Prio P0P1 P2 Prio Prio-Vererbung P1  P2 S*=2 S*=3 S*=0 S*=2 S*=0 Da alle Semaphore anfangs noch komplett frei sind, ist die Ceiling des Systems S* noch 0  P2 bekommt in jedem Fall S2  danach ist S* = S2 = 2 (S2 ‚begründet‘ S*)

31 Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik 31 Übung 7 – Deadlockvermeidung Prio(P1) = Prio(P2) = 1 C(S1) = C(S2) = 1


Herunterladen ppt "Universität Rostock, Fakultät für Informatik und Elektrotechnik Institut für Angewandte Mikroelektronik und Datentechnik Universität Rostock 3. April 2015."

Ähnliche Präsentationen


Google-Anzeigen