Prozesse und Threads. Gliederung. Prozesse und Threads. Wozu Prozesse? Übersicht: 1. Einführung und Übersicht. 2. Prozesse und Threads. 3.



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

Foliensatz 2: Prozesse und Threads. Hans-Georg Eßer, Hochschule München Betriebssysteme I, Sommersemester Folie 3

Threads. Foliensatz 8: Threads Folie 1. Hans-Georg Eßer, TH Nürnberg Systemprogrammierung, Sommersemester 2015

Betriebssysteme Theorie

Betriebssysteme-Theorie, SS 2012, Hans-Georg Eßer

In diesem Teil wird das Prozesskonzept von Unix beschrieben und elementare Kommandos zum Auflisten und Unterbrechen von Prozessen.

8.3 Sonstiges/Signalbehandlung

PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

Systemnahe Programmierung in C/C++

Betriebssysteme BS-C WS 2015/16. Hans-Georg Eßer. Foliensatz C: Prozesse und Threads. v1.2, 2015/08/20

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

Homogene Multi-Core-Prozessor-Architekturen

Betriebssysteme (BS)

Systemprogrammierung

Institut für Informatik der Ludwig-Maximilians-Universität München Systempraktikum Wintersemester 2009/2010 Prof. Dr. Dieter Kranzlmüller Dr. Thomas S

G 5. Übung. G-1 Überblick. Besprechung 3. Aufgabe. Infos zur Aufgabe 5: fork, exec. Rechenzeiterfassung. Ü SoS I G.1

PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

Sequentielle Programm- / Funktionsausführung innerhalb eines Prozesses ( thread = Ausführungsfaden )

Betriebssysteme (BS)

Michael Golm, Universität Erlangen-Nürnberg, IMMD 4, 1999/ / Tafelübung 5. Prozeß2 Prozeß3. Kernel

2Binden 3. und Bibliotheken

Betriebssysteme (BS) Prozesse. Olaf Spinczyk.

Shared-Memory Programmiermodelle

Linux Prinzipien und Programmierung

1. Bedienung der Shell (6 / 80 Punkte)

Threads Einführung. Zustände von Threads

U7 POSIX-Prozesse U7 POSIX-Prozesse

Systemnahe Programmierung in C Übungen Jürgen Kleinöder, Michael Stilkerich Universität Erlangen-Nürnberg Informatik 4, 2011 U7.fm

Dämon-Prozesse ( deamon )

a) Welches der folgenden Zeichen weist im Shell-Prompt darauf hin, dass Sie mit normalen Benutzerrechten (also nicht als root) arbeiten?

Betriebssysteme Kapitel E : Prozesse

Betriebssysteme (BS) Inhalt. Prozesse. Olaf Spinczyk.

PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

Eine Mini-Shell als Literate Program

Übungsbesprechung Blatt 3 Vorlesung Betriebssysteme I (WS 2018/19) Operating Systems And Middleware Group

UNIX - LINUX. Prozesse. Überblick. Prozesse: Start. Prozesszustände. Prozesskontrollblock (Prozesssteuerblock) Prozesszustände

Übungen zu Systemnahe Programmierung in C (SPiC) Inhalt. Moritz Strübe, Rainer Müller (Lehrstuhl Informatik 4) Sommersemester 2014

1. Bedienung der Shell (4 / 65 Punkte)

Vorlesung Betriebssysteme I

Linux und Shell-Programmierung Teil 2

Betriebssysteme SS Hans-Georg Eßer Dipl.-Math., Dipl.-Inform. SB 1 ( ) Überblick zu Betriebssystemen

4.4 Prozesse. H. Weber, HS RM SS 2010 Systemprogrammierung Kap. 4.4 Seite 1 von 22

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

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

Kernel. Prototyp. Besprechung 3. Aufgabe. POSIX-Signale. tms Datenstruktur. Betriebssystem erfasst die Rechenzeit der Prozesse. Prozess3 (SIGUSR1)

Betriebssysteme Teil 3: Systemaufrufe für Prozesse

Echtzeitbetriebssysteme (am Beispiel QNX) Dr. Stefan Enderle HS Esslingen

Systemsoftware (SYS)

Betriebssysteme (BS)

Übungen zu Systemprogrammierung 1 (SP1)

3. Unix Prozesse. Betriebssysteme Harald Kosch Seite 57

Prozesse and Threads WS 09/10 IAIK 1

I 7. Übung. I-1 Überblick. Besprechung Aufgabe 5 (mysh) Online-Evaluation. Posix Threads. Ü SoS I I.1

Betriebssysteme BS-H WS 2014/15. Hans-Georg Eßer. Foliensatz H: Zusammenfassung. Dipl.-Math., Dipl.-Inform. v1.0, 2015/01/10

Lösung von Übungsblatt 7

Aufgabenblatt 6 Musterlösung

Linux Prinzipien und Programmierung

Legende: Running Ready Blocked P1 P2 P3. t[ms] 1 Prozesse und Scheduling (16 Punkte)

Aufgabenblatt 5 Musterlösung

Linker: Adreßräume verknüpfen. Informationen über einen Prozeß. Prozeß-Erzeugung: Verwandtschaft

Systeme I: Betriebssysteme Kapitel 4 Prozesse. Wolfram Burgard

Prozesszustände (1a)

Das Signalkonzept (T) Signale und Signalbehandlung (P)

4 Threads. FH Regensburg BT/SS04 Betriebssysteme Wirtschaftsinformatik. 4.1 Allgemein

Betriebssysteme 1 BS1-B SS Prof. Dr.-Ing. Hans-Georg Eßer Fachhochschule Südwestfalen. Foliensatz B: Kurze Einführung in C Prozesse Threads

Betriebssysteme (BS) Prozesse. Olaf Spinczyk.

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

Übungen zu Systemprogrammierung 1 (SP1)

Netzwerk-Programmierung. Prozesse. Alexander Sczyrba Michael Beckstette.

Kernel. G.2 Rechenzeiterfassung (2) G.2 Rechenzeiterfassung. G.1 Überblick. 1 Kommunikation zwischen Prozessen. Prototyp. Besprechung 3.

Single- und Multitasking

Kommunikation von Prozessen: Signale und Pipes

Übungen zu Systemprogrammierung 1

Computernutzung für Experimentalphysiker Frei progammierbare Rechner als Werkzeuge in der Experimentalphysik Teil 2

2 Systemdienste. Wiederholungsempfehlung: Rechnerorganisation

Betriebssysteme (BS) Prozesse. Olaf Spinczyk.

Taskservice. Stefan Brähler, Martin Kiefel. June 4, 2009 SDI2

Was ist ein Prozess?

POSIX-Threads. Aufgabe 9 SP - Ü U10.1

Betriebssysteme: UNIX-Operationen zur Prozesskontrolle

Prozesse erzeugen, überwachen, killen und Prozessprioritäten ändern

Betriebssysteme 1. Kurze Einführung in C. Einführung in C (1) Vorab das wichtigste: Einführung in C (2)

Betriebssysteme 1. Kurze Einführung in C. Einführung in C (1) Vorab das wichtigste: Einführung in C (2)

VORSTELLUNG DER DIPLOMARBEIT

Fakultät für Informatik der Technischen Universität München. Kapitel 3. Nebenläufigkeit

Betriebssysteme G: Parallele Prozesse (Teil A: Grundlagen)

Prozesse, Logs und Systemverwaltung

Prozesse. Netzwerk - Programmierung. Alexander Sczyrba Madis Rumming

Fallbeispiel Unix. Betriebssysteme. Hermann Härtig TU Dresden

Betriebssysteme 1 BS1-B SS Prof. Dr.-Ing. Hans-Georg Eßer Fachhochschule Südwestfalen. Foliensatz B: Kurze Einführung in C Prozesse Threads

Kurzanleitung zum Editor vi

U6 POSIX-Prozesse. U6-1 Prozesse: Überblick. U6-1 UNIX-Prozesshierarchie. U6-2 POSIX Prozess-Systemfunktionen. Prozesse

U8-1 Motivation von Threads. U8-2 Vergleich von Thread-Konzepten. U8-2 Vergleich von Thread-Konzepten (2) Motivation

U8 POSIX-Threads U8 POSIX-Threads

Transkript:

Gliederung 1. Einführung und Übersicht Prozesse und Threads 2. Prozesse und Threads 3. Interrupts 4. Scheduling 5. Synchronisation 6. Interprozesskommunikation 7. Speicherverwaltung Prozesse & Threads Cl. Schnörr / HM 1 Gliederung Cl. Schnörr / HM 2 Prozesse und Threads Wozu Prozesse? Übersicht: Prozesse: Wozu Prozesse? Was ist ein Prozeß Verwaltung von Prozessen Prozeßzustände Prozesslisten Prozesshierarchien Praxisbeispiele + Ergänzungen Threads: Was ist ein Thread? Thread-Realisierungen Prozesse und Threads erzeugen Unterschiede Prozesse / Threads ULT KLT Thread-Zustände Prozesse und Threads Praxisbeispiele + Ergänzungen Prozesserzeugung Threads im Kernel Single-Tasking / Multitasking: Wie viele Programme laufen gleichzeitig? Beispiel MS-DOS: 1 Programm - Betriebssystem startet und aktiviert Shell: COMMAND.COM - Eingabe von Befehlen - falls kein interner Befehl: Programm laden und ausführen Return zu COMMAND.COM nach Ende ==> Kein Wechsel zwischen Programmen ==> Keine Nutzung mehrerer CPUs möglich Single-Processing / Multi-Processing: Neuere BS fähig zu Multi-Tasking/-Processing und können mehrere CPUs nutzen (Concurrency) ==> Konzept eines Prozesses notwendig Prozesse & Threads Cl. Schnörr / HM 3 Cl. Schnörr / HM 4

Was ist ein Prozeß? Verwaltung von Prozessen Prozess: Prozess im Detail Prozesslisten/-tabelle: ein Programm ausgeführt/laufend im Rechner (Task) abgeschottet von anderen Prozessen erfordert zusätzliche Verwaltungsdaten das BS wählt Prozesse aus und weist ihnen CPUs zu (Scheduling) Weitere Vorteile von Prozessen: übersichtlichere Programmstruktur Besitz von Ressourcen (ressource ownership) Privilegien- und Rechtevergabe eigener (virtueller) Adressraum Programmkode aktuelle Daten: Programmvariable Konstanten Befehlszähler Programm-Counter (PC) Stacks und Stack-Pointer Inhalt der Hardware-Register (Prozess-Kontext) Heap-Speicher Informationen über alle Prozesse und ihre Zustände je Prozess ein Process-Control-Block (PCB): Identifier (PID) Registerwerte inkl. PC Speicherbereich Liste offener Dateien und Sockets Informationen wie Vater-PID letzte Aktivität Gesamtlaufzeit Priorität... Stack freier Speicher Daten Programm Daten: dynamisch erzeugt Stack: Verwaltung der Funktionsaufrufe Stack und Daten wachsen aufeinander zu Cl. Schnörr / HM 5 Cl. Schnörr / HM 6 Prozeßzustände Prozeßlisten Prozesszustände: Zustandsübergänge: running PCB (1 CPU) laufend / running: gerade aktiv bereit / ready: blockiert/blocked: würde gerne laufen wartet auf I/O suspendiert: vom Anwender unterbrochen schlafend/sleeping: wartend auf Signal (IPC) ausgelagert / swapped: Daten nicht im RAM BS wählt anderen Prozeß ready running BS wählt diesen Prozeß I/O fertig warten auf Ende von I/O-Operation blocked ready PCB PCB PCB PCB blocked PCB PCB PCB Nächsten Prozess aktivieren running PCB (1 CPU) ready PCB PCB PCB PCB blocked PCB PCB PCB Cl. Schnörr / HM 7 Cl. Schnörr / HM 8

Prozeßhierarchien Prozesse erzeugen einander Erzeuger heißt Vaterprozess (parent) der andere Kindprozess (child) Kinder sind selbständig (eigener Adreßraum etc.) Nach Prozess-Ende: Rückgabewert an Vater Beispiel: Start von emacs auf der bash-shell (cygwin) PID = 5016 PPID = 4908 = PID der bash (Vater) schnoerr@clsnb: ~ 3% emacs test.txt & [1] 5016 schnoerr@clsnb: ~ 4% ps PID PPID PGID WINPID TTY UID STIME COMMAND 4908 1560 4908 2956 pty1 1001 02:24:51 /usr/bin/bash 2820 4908 2820 3260 pty1 1001 02:31:37 /usr/bin/ps 5016 4908 5016 1036 pty1 1001 02:31:33 /hd/textverarbeitung/emacs/bin/emacs Praxisbeispiele und Ergänzungen Cl. Schnörr / HM 9 Prozesse & Threads Cl. Schnörr / HM 10 Beispiel: &, ps, pstree, jobs, fg, bg, ctrl-z Praxis: einige Kommandos schnoerr@clsnb: ~ 16% emacs test.txt & [3] 6032 schnoerr@clsnb: ~ 17% ps PID PPID PGID WINPID TTY UID STIME COMMAND 6032 5016 6032 5148 pty1 1001 10:10:43 /hd/textverarbeitung/emacs/bin/emacs 5016 5152 5016 5060 pty1 1001 10:02:28 /usr/bin/bash 6012 5016 6012 1092 pty1 1001 10:10:52 /usr/bin/ps 5152 2260 5152 2460 pty0 1001 10:02:27 /usr/bin/rxvt I 2260 932 2260 5528 pty0 1001 10:01:49 /usr/bin/bash 932 1 932 932? 1001 10:01:49 /usr/bin/mintty schnoerr@clsnb: ~ 18% pstree -Glsp?(1)---mintty(932)---bash(2260)---rxvt(5152)---bash(5016)- -emacs(6032) --pstree(5284) schnoerr@clsnb: ~ 19% ps grep emacs 6032 5016 6032 5148 pty1 1001 10:10:43 /hd/textverarbeitung/emacs/bin/emacs schnoerr@clsnb: ~ 20% jobs [3]+ Running emacs test.txt & schnoerr@clsnb: ~ 21% fg 3 emacs test.txt ctrl-z: suspendiert Job im Vordergrund, mit bg dann wieder running Signale: Praxis: Signale schnoerr@clsnb: ~ 26% kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGEMT 8) SIGFPE 9) SIGKILL 10) SIGBUS 11) SIGSEGV 12) SIGSYS 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGURG 17) SIGSTOP 18) SIGTSTP 19) SIGCONT 20) SIGCHLD 21) SIGTTIN 22) SIGTTOU 23) SIGIO 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGPWR 30) SIGUSR1 31) SIGUSR2 32) SIGRTMAX schnoerr@clsnb: ~ 30% kill -s 9 6032 schnoerr@clsnb: ~ 31% [1]+ Killed emacs test.txt Signale: STOP: CONT: TERM: KILL: disown: unterbrechen fortsetzen beenden abschießen Verbindung zum Vater lösen weitere Infos: ManPages man signal man kill Cl. Schnörr / HM 11 Cl. Schnörr / HM 12

Praxis: fork (1) Praxis: fork (2) Neuer Prozess: fork() Start eines Programms mit fork() und exec(): int pid = fork() //Kindprozess (Child) erzeugen if ( pid == 0 ) { printf( Ich bin das Kind mit pid=%d\n, getpid() ); else if ( pid > 0 ) { printf( Ich bin der Vater, mein Kind hat die pid=%d\n, pid ); else { printf( Error: fork() war nicht erfolgreich\n ); int pid = fork() //Kindprozess (Child) erzeugen if ( pid == 0 ) { execl( /usr/bin/gedit, /etc/fstab, (char *)0 ); //Kind startet gedit else if ( pid > 0 ) { printf( Ich bin der Vater, es sollte der Editor starten\n, pid ); else { printf( Error: fork() war nicht erfolgreich\n ); > pstree grep simple... -bash---simplefork---simplefork Syntax: exec( filename, argv, envp ) <-> Child: main( argc, argv ) > ps -w grep simple 25684 pts/16 S+ 0:00./simplefork 25685 pts/16 S+ 0:00./simplefork Andere Betriebssysteme oft nur spawn, z.b. WinExec( notepad.exe, SW_NORMAL); //Sohnprozess abspalten Cl. Schnörr / HM 13 Cl. Schnörr / HM 14 Praxis: fork (3) Praxis: fork (4) Warten auf Kind-Prozess: wait() Abfrage, ob Programmstart über fork(), exec() erfolgreich war: int pid = fork() //Kindprozess (Child) erzeugen int status; if ( pid == 0 ) { printf( Ich bin das Kind mit pid=%d\n, getpid() ); else if ( pid > 0 ) { printf( Ich bin der Vater, mein Kind hat die pid=%d\n, pid ); wait( & status ); //exit status des Kind-Prozesses else { printf( Error: fork() war nicht erfolgreich\n ); #include <errno.h> int pid = fork(); int errno2; if ( pid == 0 ) { execl( /bin/date, 0 ); errno2 = errno; perror(); printf( Fehlerkode errno = %d\n, errno2); else... - siehe auch waitpid(): warten auf Kinder aus eigener Prozessgruppe - perror(): Fehlermeldung in lesbarem Format - errno: globale Fehlervariable Cl. Schnörr / HM 15 Cl. Schnörr / HM 16

Praxis: fork (5) Threads Abbruch aller Kind-Prozesse: 1. Shell wird mit exit verlassen: -> Kind-Prozesse laufen weiter 2. Shell wird gewaltsam geschlossen (z.b. kill, Fenster schließen) --> Kind-Prozesse werden auch beendet Was ist ein Thread? Aktivitätsstrang in einem Prozess einer von mehreren gemeinsamer Zugriff auf Daten des Prozesses aber: separat pro Thread Befehlszähler (PC) Stack Stack Pointer (SP) Hardware-Register Thread im Detail gemeinsam mit Prozess: Adressraum Programmkode aktuelle Daten: Programmvariable Konstanten separat je Thread: Befehlszähler Programm-Counter (PC) Stacks und Stack-Pointer Kernel-Threads: Prozess-Scheduler verwaltet diese User-Level-Threads: User-Level-Bibliothek verwaltet diese Inhalt der Hardware-Register (Thread-Kontext) Heap-Speicher Cl. Schnörr / HM 17 Cl. Schnörr / HM 18 Prozesse und Threads Prozesse und Threads erzeugen Warum Threads? Multi-Prozessor-System: mehrere Threads echt gleichzeitig aktiv ist ein Thread durch I/O blockiert, arbeiten andere weiter Logisch parallele Abläufe --> einfachere Programmstruktur mit Threads möglich aber: gesonderte Behandlung gemeinsamer Daten notwendig Compiler kann logische Fehler aus Nebenläufigkeit nicht erkennen --> Verantwortung des Entwicklers Cl. Schnörr / HM 19 Cl. Schnörr / HM 20

Beispiele (1) Beispiele (2) Zwei Aktivitätsstränge: Serverprozess, der viele Anfragen bearbeitet: Ohne Threads: while ( 1 ) { rechne_etwas(); if ( benutzereingabe(x) ) { bearbeite_eingabe( x ); Mit Threads: T1: while ( 1 ) { rechne_alles(); T2: while ( 1 ) { if ( benutzereingabe(x) ) { bearbeite_eingabe( x ); Prozess öffnet Port Für jede eingehende Verbindung: erzeuge Thread, der die Anfrage bearbeitet Nach Verbindungsabbruch: Thread beenden Vorteil: keine aufwendige Erzeugung von Prozessen notwendig! Cl. Schnörr / HM 21 Cl. Schnörr / HM 22 Unterschiede Prozesse / Threads (1) Unterschiede Prozesse / Threads (2) Parallelverarbeitung wahlweise mit mehreren Prozessen / Threads Zwei Prozesse: Zwei Threads: Unterschiede: Aufwand zur Prozesserzeugung vergleichsweise hoch Code P1 Code P2 Code T1 Austausch / Kommunikation untereinander: Prozesse: - kein gemeinsamer Speicher - Austausch z.b. über Nachrichten, IPC, Dateizugriffe - Shared-Memory (muss extra angelegt und verwaltet werden) freier Speicher Daten P1 Ok?? freier Speicher Daten P2 Code T1 freier Speicher gemeinsame ok ok Threads: Programm Programm Daten - gemeinsamer Speicher - Austausch z.b. durch direkte Zugriffe auf gemeinsame Variablen Cl. Schnörr / HM 23 Cl. Schnörr / HM 24

Vorteile UL-Thread-Bibliotheken Welche Vorteile bieten ULT noch? weit verbreitet und standardisiert, z.b. Posix-Threads (libpthread.a) Thread-Klasse im neuen C++-Standard vereinheitlichtes API für multithreaded-anwendungen (<-> Portierbarkeit) einfache Variation von Scheduling-Parametern: Kontext zur Verteilung der CPU-Zeit: Prozess- oder System-weit Thread-Priorität Scheduling-Politik: prioritäts- oder auch zeitgesteuert Nachteile: zeitgesteuertes Scheduling effizient nur mittels Systemaufrufe Cl. Schnörr / HM 28

Thread-Zustände Prozesse und Threads Thread-Zustände: Keine Vater- oder Kind-Threads Posix- vs. Kernel-Thread: laufend, bereit, blockiert wie bei Prozessen Prozess-Zustände suspended, sleeping, swapped etc nicht auf Threads übertragbar darum nur drei Thread-Zustände ready running blocked POSIX-Threads kennen keine Verwandtschaft zum Warten auf Thread ist Thread-Variable notwendig Unterschiedliche Semantik Prozess erzeugen mit fork(): erzeugt zwei (fast) identische Prozesse beide setzen Ausführung an gleicher Stelle fort (nach fork()) clone() erzeugt einen Kernel-Thread. Dieser ist nicht gleich einem Posix- Thread Posix-Bibliothek muss gewünschtes Standard-Verhalten über Linux-Kernel- Threads implementieren Thread erzeugen mit pthread_create(..., fkt,...): Thread springt in angegebene Funktion erzeugender Prozess fährt nach pthread_create() fort Cl. Schnörr / HM 29 Cl. Schnörr / HM 30 Andere Thread-APIs (6) Spezialitäten: Prozesserzeugung Prozess mit mehreren Threads OMP-Threads: #pragma omp parallel for num_threads(ncpu) schedule(static,chunksize) for ( long i = 0; i < elems; ++i ) {... Thread-Klasse im C++0x-Standard Abbildung auf pthreads oder andere betriebssystemspezifische Threads --> einheitliches API Java-Threads Wichtigste Datei in Kernelquellen: kernel/fork.c (enthält u.a. copy_process()) Aufrufkette: fork() -> clone() -> do_fork() -> copy_process() task_struct enthält Prozessliste copy_process(): dup_task_struct(): neuer Kernel-Stack thread_info Struktur task_struct-eintrag Kind-Status auf TASK_UNINTERRUPTIBLE copy_flags(): PF_FORKNOEXEC get_pid(): neue PID für Kind vergeben je nach clone()-parametern offene Dateien, Signal-Handler, Prozess-Speicherbereiche etc. kopieren oder gemeinsam nutzen verbleibende Rechenzeit aufteilen (-> Scheduler) danach: aufwecken, starten (Kind kommt vor Vater dran) Cl. Schnörr / HM 31 Cl. Schnörr / HM 32

Spezialitäten: Threads im Kernel (1) Linux verwendet gleiche Verwaltungsstrukturen (task list) für Prozesse und Threads Thread: Prozess, der sich mit anderen Prozessen bestimmte Ressourcen teilt:, z.b. virtueller Speicher offene Dateien Jeder Thread hat task_struct und sieht für Kernel wie ein Prozess aus Thread-Erzeugung: auch über clone() einfach andere Aufrufparameter: Prozess: clone( SIGCHLD, 0 ); Spezialitäten: Threads im Kernel (2) Thread: clone( CLONE_VM CLONE_FS CLONE_FILES CLONE_SIGHAND, 0 ); - vm: virtual memory - fs: z.b. Arbeitsverzeichnis, umask, root-verzeichnis des Prozesses - files: offene Dateien - sighand: Signal Handler Cl. Schnörr / HM 33 Cl. Schnörr / HM 34 Praxis: Linux pthreads (1) pthread-bibliothek (POSIX-Threads/Standard): Thread Prozess Erzeugen pthread_create() fork() Auf Ende warten pthread_join() wait() Praxisbeispiele Neuer Thread: pthread_create() erhält als Argument eine Funktion, die eigenständig in neuem Thread läuft Auf Thread-Ende warten: pthread_join() wartet auf bestimmten Thread Deklarationen einfügen: #include <pthread.h> Kompilieren und einbinden: g++ -lpthread -o prog prog.cc Anm.: Portierungen auch für Windows / Praxis Cl. Schnörr / HM 35 / Praxis Cl. Schnörr / HM 36

Praxis: Linux pthreads (2) Praxis: Linux pthreads (3) pthread-bibliothek: pthread_create(): 1. Thread-Funktion definieren: void * thread_fkt( void * arg ) {... return...; 2. Thread erzeugen und starten: pthread_t thread; if ( pthread_create( &thread, NULL, thread_fkt, NULL ) ) { printf( Fehler bei Thread_Erzeugung\n ); abort(); pthread-bibliothek: pthread_join(): 1. Thread-Funktionen definieren: void * thread_fkt_1( void * arg ) {... void * thread_fkt_2( void * arg ) {... 2. Threads erzeugen und starten: pthread_t tid1, tid2; pthread_create( &tid1, NULL, thread_fkt_1, NULL ) ); pthread_create( &tid2, NULL, thread_fkt_2, NULL ) ); 3. Auf Ende der Threads warten: pthread_join( tid1, NULL ); pthread_join( tid2, NULL ); //thread_1 beendet //thread_2 beendet / Praxis Cl. Schnörr / HM 37 / Praxis Cl. Schnörr / HM 38 Praxis: Linux pthreads (4) Praxis: Linux pthreads (5a) Beispiel zur Verkehrsanalyse: while (...) { Object * ptr = new Object(); // Receive data from another process and store it in *ptr while ( (rc = pthread_create( &thread_id, NULL, thr_proc, (void *)ptr )) ) { // error treatment /*while*/ pthread_detach( thread_id ); /*while*/ void * thr_proc( void * ptr ) { // process data in *ptr // transmit result to next process delete (Object *)ptr; return NULL; T1 P1 P2 T2 T3 P3 Was gehört nicht zum Thread-Kontext? int thread_cnt = 0; while (...) { Object * ptr = new Object[100]; while ( thread_cnt > 20 ) sleep( 1 ); pthread_create( &thread_id, NULL, thr_proc, (void *)ptr ); pthread_detach( thread_id ); /*while*/ void * thr_proc( void * ptr ) { static int i; thread_cnt++; //ist zu synchronisieren for ( i=0; i < 100; ++i ) ((Object *)ptr)[i].init();... delete [] (Object *)ptr; thread_cnt--; //ist zu synchronisieren return NULL; / Praxis Cl. Schnörr / HM 39 / Praxis Cl. Schnörr / HM 40

Praxis: Linux pthreads (5b) Praxis: Linux pthreads (6) Was gehört nicht zum Thread-Kontext? int thread_cnt = 0; while (...) { Object * ptr = new Object[100]; while ( thread_cnt > 20 ) sleep( 1 ); pthread_create( &thread_id, NULL, thr_proc, (void *)ptr ); pthread_detach( thread_id ); /*while*/ ptr verweist auf Heap (Prozess- Kontext), Nutzung per Programmlogik ausschließlich in jeweils einem Thread static Variablen nicht auf Stack void * thr_proc( void * ptr ) { thread_cnt und ptr global definiert static int i; thread_cnt++; //ist zu synchronisieren for ( i=0; i < 100; ++i ) ((Object *)ptr)[i].init();... delete [] (Object *)ptr; thread_cnt--; //ist zu synchronisieren return NULL; Prozess mit mehreren Threads nur ein Eintrag in normaler Prozessliste Status: l, multi-threaded über 'ps -elf' Thread-Informationen NLWP: Number of light weight processes LWP: Thread ID / Praxis Cl. Schnörr / HM 41 / Praxis Cl. Schnörr / HM 42