Tafelübung zu BSRvS 1 2. Prozesssynchronisation

Ähnliche Dokumente
2. Prozesssynchronisation

Tafelübung zu BSRvS1. 3. Philosophen. Fortsetzung Grundlagen C-Programmierung

J.1 Überblick. Prototyp. Besprechung 6. Aufgabe (timed) (die 5. Aufgabe wird erst in der nächsten Woche besprochen) select. Shared Memory.

Speicherbasierte Kommunikation (T) Realisierung von Semaphoren (T) Shared Memory (P) Synchronisation mittels Semaphoren (P)

Systemprogrammierung.: unter Linux :.

critical sections und Semaphore

Betriebssysteme (BTS)

Einführung in die Systemprogrammierung unter Linux

Tafelübung zu BS 1. Prozesse verwalten

Lab 13: Multi Processor Systems II

Tafelübung zu BS 1. Prozesse verwalten

Systemnahe Programmierung in C/C++

Dr. Monika Meiler. Inhalt

Organisatorisches. Übungsleiter: Karsten Otto Homepage: Aufgaben

Systemprogrammierung unter Linux eine Einführung S. 1

PROGRAMMIEREN MIT UNIX/Linux-SYSTEMAUFRUFEN

Tafelübung zu BSRvS 1 0. Erste Schritte

Systemprogrammierung unter UNIX System V / Linux

Tafelübung zu BS 4. Speicherverwaltung

Übungen zu Systemprogrammierung 1 (SP1)

Grundlagen der Informatik Vorlesungsskript

Übung zu Grundlagen der Betriebssysteme. 10. Übung

6. Nebenläufigkeit: wechselseitiger Ausschluss und Synchronisation

Linux Prinzipien und Programmierung

Übungspaket 29 Dynamische Speicherverwaltung: malloc() und free()

leave: mov flag, 0 ; 0 in flag speichern: Lock freigeben ret

Systemprogrammierung I - Aufgaben zur Erlangung der Klausurzulassung für Informatiker und Wirtschaftsinformatiker

Softwarepraktikum: Einführung in Makefiles

Tafelübung zu BSRvS 1 6. Sicherheit

Die Programmiersprache C

Interprozesskommunikation (IPC)

FILE *fp; char fname[100];... fp = fopen (fname, rb ); if( fp == NULL ) { perror( fopen );... } // Fehlernachricht auf letzten Fehler, der aufkam

Beispiel 3. Shared Memory und Explizite Synchronisation. Daniel Prokesch. 27. April Überblick. Shared Memory. Semaphore. Ressourcenverwaltung

10. Vorlesung Betriebssysteme

U6-1 Organisatories. U6-2 Motivation von Threads. U6-3 Vergleich von Thread-Konzepten. Organisatorisches

2 UNIX Interprozesskommunikation

Linux Prinzipien und Programmierung

DAP2-Programmierpraktikum Einführung in C++ (Teil 1)

Einführung in die Programmierung Wintersemester 2011/12

Besprechung Aufgabe 5 (crawl) POSIX-Threads. Problem: UNIX-Prozesskonzept ist für viele heutige Anwendungen unzureichend

Dr. Monika Meiler. Inhalt

Präprozessor und make. einfache Makros Makros nehmen eine Textersetzung vor. Erst nach der Ersetzung muss gültiger C-Code vorliegen.

Beispiel für einen IPC-Server, der seinen Dienst über den Global Name Service im Netzwerk bekannt gibt. Header-Dateien einbinden

Systemsoftware (SYS)

Die Anweisungen zweier Prozesse werden parallel bearbeitet, wenn die Anweisungen unabhängig voneinander zur gleichen Zeit ausgeführt werden.

U6-1 Linux-Benutzerumgebung

Betriebssysteme. Tafelübung 0. Erste Schritte. Olaf Spinczyk. Agenda.

Praktikumstermin B-07: make & Makefiles

PThreads. Pthreads. Jeder Hersteller hatte eine eigene Implementierung von Threads oder light weight processes

2. Aufgabenblatt Threads

Tutorium Rechnerorganisation

Eine C-orientierte Einführung in GNU make Version 0.8. Matthias Siemering Universität Osnabrück 27. Oktober 2003

Variablen. Deklaration: «Datentyp» «Variablenname» Datentyp bestimmt Größe in Bytes: sizeof Beispiel: long int v; Größe: 4 Bytes

Advanced Programming in C

Linux Prinzipien und Programmierung

Hello world. Sebastian Dyroff. 21. September 2009

Malware. Carlo U. Nicola 09. Dezember Die Struktur eines (harmlosen) aber echten Virus-Programmes analysieren;

Klausur: Grundlagen der Informatik I, am 05. Februar 2008 Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.: Punkte:

Softwaresysteme I Übungen Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2007 U9.fm

Einführung in die Programmiersprache C

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

Betriebssysteme (BS)

3. Grundlagen der Systemprogrammierung

Übungen zu Softwaresysteme I Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2004 E-Uebung3.fm

Lösung Übungszettel 6

Übung zur Vorlesung Programmieren in C

Klausur Programmieren in C Sommersemester 2007 Dipl. Biol. Franz Schenk 13. April 2007, Uhr Bearbeitungszeit: 105 Minuten

Crashkurs: Von Java nach C

1 Organisatorisches. 2 Compilezeit- und Laufzeitfehler. 3 Exceptions. 4 Try-Catch-Finally

Parallele Prozesse. Prozeß wartet

Nachname:... Vorname:... MatrNr.:... Klausur PR2. Erstellen Sie eine Struktur für eine Komplexe Zahl mit den Elementen real und imag vom Typ double.

U9-3 Vergleich von Thread-Konzepten. U9-2 Motivation von Threads. U9-3 Vergleich von Thread-Konzepten (2) U9-1 Überblick

Zeiger und dynamischer Speicher

Versuchsziele. Grundlagen. Überblick: FB Automatisierung und Informatik Betriebssysteme Thema: Bounded-Buffer-Problem. 3.

Grundlagen der Programmierung

THE GO PROGRAMMING LANGUAGE. Michael Karnutsch & Marko Sulejic

2Binden 3. und Bibliotheken

Praxis der Programmierung

Kompaktkurs C-Programmierung

18. Bitmanipulationen. Bitoperationen Bitmasken

2 UNIX Interprozeßkommunikation. 2.1 Prozesse erzeugen und beenden

Grundlagen der Informatik 11. Zeiger

Einführung in die C-Programmierung

Systeme I: Betriebssysteme Kapitel 5 Nebenläufigkeit und wechselseitiger Ausschluss. Maren Bennewitz

1. Übung: Betriebssysteme Labor Prof. Kremer SS : Musterlösungen Patrick Lipinski

Inhaltsverzeichnis. Carsten Vogt. Nebenläufige Programmierung. Ein Arbeitsbuch mit UNIX/Linux und Java ISBN:

Übung 9. Quellcode Strukturieren Rekursive Datenstrukturen Uebung 9

Übung zu Grundlagen der Betriebssysteme. 6. Übung

C++ Klassen, Vererbung. Philipp Lucas. Sebastian Hack. Wintersemester 2008/09. saarland.

Tafelübung zu BS 4. Interprozesskommunikation

Die Programmiersprache C Eine Einführung

Das Build Tool Ant. Sebastian Mancke,

Elementare Konzepte von

Dr. Monika Meiler. Inhalt

RO-Tutorien 3 / 6 / 12

GI Vektoren

Versuchsziele Konzepte der parallelen Programmierung am Beispiel von Threads anwenden können. Einbau von Kontrollmechanismen mittels Semaphore.

Software ubiquitärer Systeme

S. d. I.: Programieren in C Folie 4-1. im Gegensatz zu Pascal gibt es in C kein Schlüsselwort "then"

fork () Hans-Georg Eßer, Hochschule München Betriebssysteme I, SS Prozesse (2/2) Folie 4

Transkript:

Tafelübung zu BSRvS 1 2. Prozesssynchronisation Olaf Spinczyk Arbeitsgruppe Eingebettete Systemsoftware Lehrstuhl für Informatik 12 TU Dortmund olaf.spinczyk@tu-dortmund.de http://ess.cs.uni-dortmund.de/~os/ http://ess.cs.tu-dortmund.de/de/teaching/ss2009/bsrvs1/ 1

Agenda Besprechung Aufgabe 1: At Fortsetzung Grundlagen C-Programmierung Aufgabe 2: Prozesssynchronisation Erzeuger-/Verbraucher-Problem Wiederholung Semaphore (P, V / wait, signal) System V Semaphore (sem*-funktionen) Gemeinsamer Speicher Makefiles BSRvS 1: U2 Prozesssynchronisation 2

Besprechung Aufgabe 1 Foliensatz Besprechung BSRvS 1: U2 Prozesssynchronisation 3

Grundlagen C-Programmierung Foliensatz C-Einführung (Folie 36-47) BSRvS 1: U2 Prozesssynchronisation 4

Erzeuger-/Verbraucher-Problem... mit einelementigem Puffer (Pseudocode!) Erzeuger/Verbraucher nicht synchronisiert Warum ist das ein Problem? Element gemeinsamerpuffer; /* Erzeuger und Verbraucher laufen parallel! */ erzeuger() { while (1) { Element e = produziereelement(); gemeinsamerpuffer = e; /* schreibe in gemeinsamen Puffer */ verbraucher() { while (1) { Element e; e = gemeinsamerpuffer; /* lies aus gemeinsamem Puffer */ verbraucheelement(e); BSRvS 1: U2 Prozesssynchronisation 5

Erzeuger-/Verbraucher-Problem... mit einelementigem Puffer (Pseudocode!) Erzeuger/Verbraucher nicht synchronisiert Elemente gehen verloren oder werden mehrfach verwendet! Element gemeinsamerpuffer; /* Erzeuger und Verbraucher laufen parallel! */ erzeuger() { while (1) { Element e = produziereelement(); gemeinsamerpuffer = e; /* schreibe in gemeinsamen Puffer */ verbraucher() { while (1) { Element e; e = gemeinsamerpuffer; /* lies aus gemeinsamem Puffer */ verbraucheelement(e); BSRvS 1: U2 Prozesssynchronisation 6

E. Dijkstra: Semaphor (semaphore) Eine nicht-negative ganze Zahl, für die zwei unteilbare Operationen definiert sind: P (hol. prolaag, erniedrige ; auch down, wait) -1 hat der Semaphor den Wert 0, wird der laufende Prozess blockiert ansonsten wird der Semaphor um 1 dekrementiert V (hol. verhoog, erhöhe ; auch up, signal) +1 auf den Semaphor ggf. blockierter Prozess wird deblockiert ansonsten wird der Semaphor um 1 inkrementiert Eine Betriebssystemabstraktion zum Austausch von Synchronisationssignalen zwischen nebenläufig arbeitenden Prozessen. BSRvS 1: U2 Prozesssynchronisation 7

Erzeuger-/Verbraucher-Problem... mit einelementigem Puffer mit zwei Semaphore synchronisiert, Operationen P/V (Pseudocode!) Element gemeinsamerpuffer; Semaphore sem_frei = 1, sem_belegt = 0; /* Erzeuger und Verbraucher laufen parallel! */ erzeuger() { while (1) { Element e = produziereelement(); P(sem_frei); gemeinsamerpuffer = e; /* schreibe in gemeinsamen Puffer */ V(sem_belegt); verbraucher() { while (1) { Element e; P(sem_belegt); e = gemeinsamerpuffer; /* lies aus gemeinsamem Puffer */ V(sem_frei); verbraucheelement(e); BSRvS 1: U2 Prozesssynchronisation 8

Erzeuger-/Verbraucher-Problem Was muss man ändern, wenn der Puffer mehr als ein Element aufnehmen kann (z.b. Ringpuffer)? Element gemeinsamerpuffer; Semaphore sem_frei = 1, sem_belegt = 0; /* Erzeuger und Verbraucher laufen parallel! */ erzeuger() { while (1) { Element e = produziereelement(); P(sem_frei); gemeinsamerpuffer = e; /* schreibe in gemeinsamen Puffer */ V(sem_belegt); verbraucher() { while (1) { Element e; P(sem_belegt); e = gemeinsamerpuffer; /* lies aus gemeinsamem Puffer */ V(sem_frei); verbraucheelement(e); BSRvS 1: U2 Prozesssynchronisation 9

Semaphore, semget(2) int semget(schlüssel, Anzahl, Optionen); Weiterverwenden oder Erzeugen von Semaphormengen Schlüssel = Schlüssel, der mit einer Semaphormenge im System assoziiert ist Anzahl = Anzahl der Semaphore in der Menge Optionen = IPC_CREAT, IPC_EXCL, Zugriffsrechte; mit bitweisem ODER ( ) verknüpft Semaphore werden nicht automatisch initialisiert! Rückgabewert: -1: Fehler bei der Ausführung (z.b. eine gesuchte Semaphormenge nicht gefunden), Fehlercode in errno abgelegt id: Identifier, der von den weiteren sem* Funktionen verwendet wird benötigte Header: sys/types.h, sys/ipc.h, sys/sem.h BSRvS 1: U2 Prozesssynchronisation 10

Semaphore, semget(2), Beispiel #include <sys/types.h> #include <sys/sem.h> #include <sys/ipc.h> #include <stdio.h> #include <errno.h> #define KEY 0xcaffee /* ein Schlüssel zur Suche nach Sem.-Mengen */ #define RIGHTS 0600 /* volle Zugriffsrechte für den Besitzer*/ int main() { int semid = 0; /* gibt es schon eine Semaphorenmenge zu diesem Schlüssel? */ semid = semget(key, 0, 0); if (semid < 0) { /* nein, also erzeuge eine Menge mit einem Semaphor... */ printf( create new semaphore\n ); semid = semget(key, 1, IPC_EXCL IPC_CREAT RIGHTS); if (semid < 0) { perror( semget ); return -1; return 0; pohl@host:~/# ipcs -s ------ Semaphore Arrays -------- key semid owner perms nsems 0xcaffee 13172741 pohl 600 1 pohl@host:~/# BSRvS 1: U2 Prozesssynchronisation 11

Semaphore, semctl(2) int semctl(semid, SemNr, Kommando,...); Initialisieren, Abfragen von Semaphoren Kommandos (Auswahl): SETVAL/GETVAL Setzen/Abfragen des Semaphor SemNr SETALL/GETALL Setzen/Abfragen aller Semaphore in der Menge IPC_RMID Freigeben einer Semaphormenge Rückgabewerte: -1: Fehler während der Ausführung, errno enthält Fehlercode >=0: je nach Kommando erwarteter Rückgabewert BSRvS 1: U2 Prozesssynchronisation 12

Semaphore, semctl(2) Beispiel #include <sys/types.h> #include <sys/sem.h> #include <sys/ipc.h> #include <stdio.h> #include <errno.h> #define KEY 0xcaffee /* ein Schlüssel zur Suche nach Sem.-Mengen */ int main() { int semid = 0, retval = 0; /* gibt es schon eine Semaphorenmenge zu diesem Schlüssel? */ semid = semget(key, 0, 0); if (semid > 0) { /* ja, dann initialisieren wir mit 1*/ retval = semctl(semid, 0, SETVAL, (int) 1); if (retval < 0) { perror( semctl SET ); return -1; retval = semctl(semid, 0, GETVAL); if (retval < 0) { perror( semctl GET ); return -1; printf( Semaphore hat Wert %d\n, retval); semctl(semid, 0, IPC_RMID); /* Semaphormenge entfernen */ return 0; BSRvS 1: U2 Prozesssynchronisation 13

Semaphore, semop(2) int semop(semid, *Operationen, AnzahlOPs); Kann eine oder mehrere Operationen auf den Semaphoren einer Semaphormenge ausführen Atomar entweder alle Operationen, oder keine! Rückgabewerte: -1: Fehler während der Ausführung, errno enthält Fehlercode 0: Ausführung erfolgreich Zentrale Struktur: struct sembuf struct sembuf { unsigned short sem_num; /* Semaphor Nr. */ short sem_op; /* Operation auf Semaphor */ short sem_flg; /* optionale Flags */ BSRvS 1: U2 Prozesssynchronisation 14

Semaphore, semop(2), Beispiel 3 Arten von Operationen definiert: sem_op > 0: addiere Wert von sem_op auf den aktuellen Wert des Semaphors Operation wird immer durchgeführt sem_op = 0: sog. wait-for-zero Schlafen bis Semphor = 0 sem_op < 0: - Semaphor >= sem_op Operation wird direkt fortgesetzt, und sem_op vom aktuellen Wert des Semaphors abgezogen - Semaphor < sem_op Operation muss warten Hiermit können wir Dijkstras P() und V() implementieren! struct sembuf sop; sop.sem_num = <Nummer innerhalb der Semaphore-Menge>; sop.sem_op = <siehe oben>; sop.sem_flg = <optionales Flag, siehe Manpage>; if (semop(semid, &sop, 1) == -1) { perror( semop ); exit(-1); BSRvS 1: U2 Prozesssynchronisation 15

Gemeinsamer Speicher 0x00000000 Prozess 1 Prozess 2 0x00000000 0x45a33b1c Shared Memory Segment 0x5516a388 0xffffffff 0xffffffff Systemaufrufe: shmget(2), shmctl(2), shmat(2), shmdt(2) Bereits in der Vorgabe zu A2! BSRvS 1: U2 Prozesssynchronisation 16

Makefiles Bauen von Projekten mit mehreren Dateien Makefile Informationen wie eine Projektdatei beim Bauen des Projektes zu behandeln ist # -= Variablen =- # Name=Wert oder auch # Name+=Wert für Konkatenation CC=gcc CFLAGS=-Wall -ansi -pedantic -D_XOPEN_SOURCE -D_POSIX_SOURCE # -= Targets =- # Name: <benötigte Dateien und/oder andere Targets> # <TAB> Kommando # <TAB> Kommando... (ohne <TAB> beschwert sich make!) all: program1 program2 # erstes Target = Default-Target program1: prog1.c prog1.h $(CC) $(CFLAGS) -o program1 prog1.c program2: prog2.c prog2.h program1 # Abhängigkeit: benötigt program1! $(CC) $(CFLAGS) -o program2 prog2.c BSRvS 1: U2 Prozesssynchronisation 17

Targets & Abhängigkeiten program1 program2 prog1.c prog1.h prog2.c prog2.h # target program1 program1: prog1.c prog1.h... # target program2 program2: prog2.c prog2.h program1... Vergleich von Änderungsdatum der Quell- und Zieldateien Quelle jünger? Neu übersetzen! make durchläuft Abhängigkeitsgraph Java-Pendant: Apache Ant BSRvS 1: U2 Prozesssynchronisation 18

Beispiel: Vorgabe von Aufgabe A2 # -= Variablen =- # Name=Wert oder auch # Name+=Wert für Konkatenation CC=gcc CFLAGS=-Wall -ansi -pedantic -D_XOPEN_SOURCE -D_POSIX_SOURCE # -= Targets =- # Name: <benötigte Dateien und/oder andere Targets> # <TAB> Kommando # <TAB> Kommando... (ohne <TAB> beschwert sich make!) all: primserv primeat # erstes Target = Default-Target primserv: primserv.c primshm.c primshm.h sync.c sync.h $(CC) $(CFLAGS) -o primserv primserv.c primshm.c sync.c primeat: primeat.c primshm.c primshm.h sync.c sync.h $(CC) $(CFLAGS) -o primeat primeat.c primshm.c sync.c clean: rm -f primserv primeat *.o test: all./primserv& sleep 2./primeat.PHONY: clean test # unechte (phony) Targets BSRvS 1: U2 Prozesssynchronisation 19

Makefiles und make(1) rhodos:~/a2 $ make clean rm -f primserv primeat *.o rhodos:~/a2 $ make gcc -Wall -ansi -pedantic -D_XOPEN_SOURCE -D_POSIX_SOURCE -o primserv primserv.c primshm.c sync.c gcc -Wall -ansi -pedantic -D_XOPEN_SOURCE -D_POSIX_SOURCE -o primeat primeat.c primshm.c sync.c rhodos:~/a2 $ touch primserv.c rhodos:~/a2 $ make gcc -Wall (...) -o primserv primserv.c primshm.c sync.c rhodos:~/a2 $ make make: Nothing to be done for `all'. rhodos:~/a2 $ touch sync.h rhodos:~/a2 $ make gcc -Wall (...) -o primserv primserv.c primshm.c sync.c gcc -Wall (...) -o primeat primeat.c primshm.c sync.c rhodos:~/a2 $ Makefiles ausführen mit make <target> bei fehlendem <target> wird das Default-Target (das 1.) ausgeführt Optionen - -f: Makefile angeben; make -f <makefile> - -j: Anzahl der gleichzeitig gestarteten Jobs, z.b. make -j 3 BSRvS 1: U2 Prozesssynchronisation 20