Echtzeitbetriebssysteme Übungen

Slides:



Advertisements
Ähnliche Präsentationen
Einführung in die Programmiersprache C/C++
Advertisements

der Universität Oldenburg
der Universität Oldenburg
10.2 Wechselseitiger Ausschluss in Hardware
Ein- und Ausgabe von Dateien
Wiederholung Betriebssystem bietet eine Abstraktion der Hardware an:
Beim Start eines Prozesses in Windows NT, 2000 wird a der Programmtext aus der exe-Datei ab der dort angegebenen Adresse gespeichert.
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
C Tutorium – Fehlerbehandlung – Knut Stolze. 2 Grundsatz Also ist auch nach jedem Funktionsaufruf auf Fehler zu prüfen!! Jeder(!) Funktionsaufruf kann.
C Tutorium – Semaphoren –
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
6. Der OpenMP Standard Direktiven-basiertes API zur Programmierung von Parallelrechnern mit gemeinsamem Speicher für FORTRAN, C und C++
Vorlesung Echtzeitbetriebssysteme VI. Posix Übung
Semaphore void Passieren (semaphore &s) { if (s > 0) { s--;
Kapitel 6.1 Nebenläufigkeit und wechselseitiger Ausschluss
Kapitel 7.2 Dining philosophers problem
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
FH-Hof Indirekte Adressierung Richard Göbel. FH-Hof Einfache Speicherung von Daten Eine "einfache" Deklaration definiert direkt eine Speicherplatz für.
Java: Grundlagen der Objektorientierung
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Geometrisches Divide and Conquer
1 Named Pipes alias FIFO Haben einen Eintrag im Dateisystem und sind somit durch Zugriffsrechte identifizierbar Ermöglichen die Kommunikation zwischen.
OpenMP Präsentation im Rahmen des Seminars
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 4 Claudio Moraga; Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
Zusammenfassung Vorwoche
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
Vorlesung 10 Mutual Exclusion Peter B. Ladkin Sommersemester 2001 Universität Bielefeld Technische Fakultät.
Institut für Angewandte Mikroelektronik und Datentechnik Fachbereich Elektrotechnik und Informationstechnik, Universität Rostock Vorlesung Echtzeitbetriebssysteme.
Die Skriptsprache Perl (2) Wolfgang Friebel DESY Zeuthen.
DVG Ablaufsteuerung
DVG Methoden 1 Methoden. 2 int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0); dezi = Math.abs(dezi); String Bin = ""; do { } while.
Planung einfache Dateibehandlung (externe Dateien, Öffnen, Lesen/Schreiben, Schließen). Diskussion des Problems, die Wörter in einem gegebenen Text.
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Informatik 1 Übung 2.
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Einführung in die Programmiersprache C 3.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung
Einführung in die Programmiersprache C 4
Auslegung eines Vorschubantriebes
Prozess-synchronisation
C-Einstieg. Agenda 1Vorbereitung 2Aufbau eines Programms 2.1Header 2.2 Methoden 2.3Main 3Datentypen & Variablen 4Operatoren(+, -, *, /) 5Logik 5.1IF 5.2Switch.
Thread Synchronisation in JAVA
Betriebssysteme Übung Tutorium „System Calls & Multipgrogramming“
Betriebssysteme Übung 2. Tutorium. Task 1 – Locks (1) Wozu Locks? Dienen dazu, exklusiven Zugriff auf eine Ressource sicherzustellen Lock = binäre Semaphore.
EPROG Tutorium #3 Philipp Effenberger
BMEVIEEA100 Grundlagen der Programmierung
Vorkurs Programmierungstechnik Einführung in Pascal Michael Gellner Lehrstuhl für Softwaretechnik am Institut für praktische Informatik der Universität.
Java Syntaxdiagramme Buchstabe A B Z a z ... Ziffer
Alois Schütte Advanced System Programming 2 Interprozeßkommunikation  2.1 JVM Ablaufumgebung  2.2 Java Native Interface (JNI)  Verwendung von.
1 // Laengste Zeile bestimmen // // Liest die Eingabe Zeichen fuer Zeichen, bis // das erscheint. // Die laengste Zeile wird ausgegeben (bei.
Autor: Timo Pagel Nutzung: Diese Lernkarten sind für die Nutzung mit OpenCards gedacht Siehe dazu
Java-Kurs - 4. Übung Hausaufgabe Weitere Kontrollstrukturen
Threads in Java Threads  Sprachumfang von Java Der Java-Standard fordert nur die Unterstützung von Thread-Prioritäten. Es gibt keine Forderung bzgl.:
Parallel Programming Semaphores / Reader - Writer - Lock
C Tutorium – Shared Memory – Knut Stolze. 2 Shared Memory Ein Speicherbereich, auf den mehrere Prozesse Zugriff haben – Also kein privater Speicher –
Übung Betriebssysteme, Uni Innsbruck 1 Projekt1: Prozesse unter Unix Teil II Prozesse / Systemaufrufe Fehlerbehandlung.
Funktionen. Aufgabe : Eingabe zweier Zahlen ---> Minimum bestimmen Dann nochmals Eingabe zweier Zahlen ---> Minimum bestimmen.
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
Center for Biotechnology Bielefeld Bioinformatics Service Netzwerk - Programmierung Threads Alexander Sczyrba Jan Krüger.
Aufgaben Semaphore Übersicht (Dijkstra)
 Präsentation transkript:

Echtzeitbetriebssysteme Übungen M.Sc. Alexander Nitsch, M.Sc. Michael Rethfeldt (mit freundlicher Unterstützung von Dr.-Ing. Guido Moritz)

Übungsfahrplan Nr. Beschreibung Inhalte 1 Erzeugen und Starten von Prozessen I Von Threads und Prozessen 2 Erzeugen und Starten von Prozessen II 3 Pipes & Signale Inter-Prozess-Kommunikation (IPC) 4 Messagequeues, Shared Memory 5 POSIX & Threads Inter-Prozess-Synchronisation (IPS) 6 Mutexe, Conditions & Semaphore unter POSIX 7 Synchronisationsprotokolle & Deadlocks Schedulinganalysen 8 Schedulinganalyse Sensornetzwerke: -> Was ist Ubiquitous Computing , Sensorknoten, Sensornetzwerk, Beispiele Herausforderungen: -> Probleme bei der Umsetzung

Ü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 <stdio.h> int main(int argc, char *argv[]) { printf("Hello world!\n"); }

Übung 1 – fork() fork() fork_pid = fork_pid = fork_pid!=0 fork_pid==0 #include <stdio.h> #include <stdlib.h> 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; fork() fork_pid = fork_pid = fork_pid!=0 fork_pid==0 printf() exit() fork_pid!=-1 wait() printf()

Übung 1 – Starten von Prozessen

Übung 1 – Speicherbelegung Code beider Prozesse Code Code Daten Daten Vater Daten des Vaters Daten Daten des Sohnes

Ü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“); default: printf(„Vater\n“); }

Übung 1 – Wieviele Söhne werden erzeugt? Vater Vater Sohn1 Sohn1 1. fork() 1. fork() printf() Sohn2 Sohn3 2. fork() 2. fork() Sohn2 2. fork() printf() printf() ENDE

Übung 2 Sohn 3 Sohn 1 PID: 2 Sohn 4 PID: 4 Vater PID=1 Sohn 5 Sohn 2 Frage: Kann es sein, dass PID=3 und PID=4 zweimal vergeben werden?

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 10341 ? Ss 0:00 \_ sshd: bj [priv] 10343 ? S 0:00 | \_ sshd: bj@pts/3 10344 pts/3 Ss+ 0:00 | \_ -bash 27959 ? Ss 0:00 \_ sshd: bj [priv] 27961 ? S 0:00 \_ sshd: bj@pts/4 27962 pts/4 Ss 0:00 \_ -bash 28213 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 -- 4682 ? 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 27995 ? S 0:00 \_ /usr/sbin/smbd -D -s /etc/samba/smb.conf

Übung 2 #include <stdio.h> 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); fprintf( stderr, "Fehler beim 2. fork()!\n"); return 0;

Ü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

Übung 2: Execl() Vater fork() Vater Sohn fork() Vater Externes Programm

Ü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

Execl()-Parametermapping int execl(const char *path, const char *arg, ...); Execl-Parameter Argument der Main-Funktion Anzahl der Parameter-1 argn const char *arg argv[0] …. argv[1] Ausführbare Datei int execl(“/bin/ls”, “ls”, “-lias”, NULL); Argument der Main-Funktion Argumente argn 2 argv[0] ls argv[1] -lias

Übung 3 Prozess A Prozess B Betriebssystem Fork() erzeugt Kopie aller Daten des Prozesses A Direkter Datenaustausch zwischen Prozessen nicht möglich Ausweg: Pipe des Betriebssystems

Übung 3 Prozess A Prozess B Betriebssystem write(fd[1]); read(fd[0]); 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]

Übung 3 Prozess A Prozess B Initialisieren einer Pipe fd[2], File-Zähler=2 pipe(fd) Erzeugen des Sohn-Prozesses, File-Zähler=4 fork() Schließen des Lesedescriptors (fd[0]) und des Schreibdescriptors (fd[1]), File-Zähler=2 close(fd[0]) close(fd[1]) write(fd[1]) read(fd[0]) Datenaustausch über Pipe

Idealer Programmverlauf Unterbrochener Programmverlauf Übung 3 Idealer Programmverlauf Unterbrochener Programmverlauf Signale können jederzeit auftreten Nebenläufige Fehlerbehandlung erfolgt in Signal-Handlern Behandlung des Signals, sodass Hauptprogramm fehlerfrei weiterläuft ! Signal Signal-behandlung

Übung 4 Prozess A Prozess B Prozess C Betriebssystem ftok(…,1) msgget() msgrcv(); ftok(…,1) ftok(…,2) msgget() msgsnd() Proj_id=1 Proj_id=2 Prozess C ftok(…,2) msgget() msgrcv(); Systemweiten eindeutigen Key erzeugen Öffnen der Nachrichtenwarteschlange (Messagequeue) Projektidentifier proj_id kennzeichnet Nummer der Pipe

Übung 4 Was ist an welcher Schreibweise günstiger? 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); } default: {

Ü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; thread_start, 0); void* thread_start(void *ptr) return 0; Linke Variante ist inkorrekt, da Rückgabetyp von thread_start falsch ist!

Übung 5 – Typen von Funktionszeigern Zeigerübergabe von Funktionen ohne typedef Zeigerübergabe von Funktionen mit typedef #include <stdio.h> 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); typedef int (*CALLBACK)(const char *ptr); void thread1(CALLBACK function); void thread2(CALLBACK); void thread1(CALLBACK function) void thread2(CALLBACK function)

Übung 6 – Condition Variablen Aktives Warten Warten mit Conditionvariablen void* reader_function(void *ptr) { char a=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; while ( buffer_has_item != 1) pthread_cond_wait( &cond_buffer_full, &mutex); a=buffer; pthread_cond_signal( &cond_buffer_empty);

Ü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

Übung 7 – Prioritäteninversion Ein höher priorisierter Thread wird durch einen niedriger priorisierten Thread unterbrochen. Bezeichnung: Direct Blocking

Übung 7 – Pass Through Blocking Prozess Priorität Periode Offset Deadline Rechenzeit Auslastung PH 3 (hoch) 120 20 30 0,25 PM 2 (mittel) 40 PL 1 (niedrig) 50 0,42

Übung 7 – Priority Inheritance Protocol PL wird auf Priorität von PH angehoben, wenn PH das Mutex anfordert PM kommt nicht zum Zuge Zeit im kritischen Abschnitt wird verringert Keine Kenntnis der nutzenden Threads nötig

Übung 7 – Priority Ceiling Protocol (PCP) 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. 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

Übung 7 – Beispiel PCP P0 P1 P2 3 Prozesse (P0, P1 & P2) konkurrieren über 3 Semaphoren (S0, S1 & S2) Prozess Priorität Periode Offset Deadline Rechenzeit Auslastung P0 3 (hoch) 150 50 40 0,27 P1 2 (mittel) 20 30 0,2 P2 1 (niedrig) 70 0,47  Statische Prio S*=2 S*=0 S*=0 S*=0 Prio 3 2 1 S*=3 Prio-Vererbung P1P2 S*=2 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*)

Übung 7 – Deadlockvermeidung Prio(P1) = Prio(P2) = 1 C(S1) = C(S2) = 1