Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
1
Netzwerk - Programmierung
Prozesse Alexander Sczyrba Madis Rumming
2
Übersicht Prozesse fork() Parents und Children system() und exec()
3
Prozesse moderne Betriebssysteme (UNIX-artige (Linux, OSX, Solaris,[Free— Net—Open]BSD, Windows ab NT/2000) sind multitasking-fähig: mehrere Programme können simultan ablaufen jedes in separatem Prozess das OS bestimmt den Wechsel zwischen den einzelnen Prozessen
4
Multitasking in Perl Perl unterstützt zwei Arten von Multitasking: Fork() basiert auf traditionellem UNIX Multiprozess-Modell erlaubt dem aktuellen Prozess, sich selbst zu klonen Ergebnis: zwei in fast jeder Hinsicht identische Prozesse Multithreading modernes Konzept eines Threads Aufgaben werden in einem einzigen Prozess gehalten einzelnes Programm kann aus nebeneinander ausgeführten Threads bestehen, von denen jeder unabhängig von den anderen läuft
5
fork() jedem Prozess im System wird eine eindeutige pos. Zahl zugeordnet: Prozess-ID oder PID Funktion fork() ist in allen UNIX Versionen von Perl verfügbar erzeugt ein exaktes Duplikat des aktuellen Prozesses, nach dem fork existieren parent und child child-Prozess übernimmt: aktuelle Werte aller Variablen Dateihandles (inkl. Daten in I/O-Puffern) weitere Datenstrukturen Voraussetzung: Parent und Child wissen, wer von ihnen wer ist
6
Welche Informationen liefert ps?
Aufgabe Ermittle, wie viele Prozesse unter Deiner userid laufen. Verwende dazu den Befehl ps mit den entsprechenden Opionen (siehe man ps). Welche Informationen liefert ps? Der Befehl p[s]tree* gibt Informationen über Prozesse, ihre Kinder und Eltern in Baumstruktur aus. Welcher Prozess ist der Parent aller Prozesse? * Solaris/BSD – ptree, Linux/OSX – pstree → unter OSX nicht Teil des Systems
7
fork() $pid = fork verzweigt in einen neuen Prozess Rückgabewert im Parent-Prozess: PID des Child-Prozesses im Child-Prozess: 0 im Falles eines Fehlers: undef Vgl. perldoc -f fork
8
Hilfreiche Funktionen
$pid = getppid() gibt PID des Parent-Prozesses zurück $$ enthält die PID des aktuellen Prozesses $pid = wait() wartet auf die Terminierung eines Child Prozesses und gibt die PID des terminierten Prozesses zurück
9
Beispiel fork() print "PID=$$\n";
my $child = fork(); die "cannot fork: $!" unless defined $child; if ($child == 0) { # child| my $ppid = getppid(); print "Child-Process: PID=$$, Parent=$ppid\n"; exit(0); }else { # Parent my $ppid = getppid(); print "Parent-Process: PID=$$, Child=$child, Parent=$ppid\n"; wait(); }
10
Zombies terminiert der Parent vor dem Child, wird dieser zum ’Waisenkind’ und vom Init-Prozess ’adoptiert’ ein Prozess, der terminiert ist, dessen Parent aber nicht darauf gewartet hat, wird Zombie genannt
11
Aufgabe ändere das fork()-Beispiel so, dass 1. das Child vom init-Prozess übernommen wird 2. das Child zu einem Zombie wird Benutze top, ps, p[s]tree um das Verhalten der Skripte zu analysieren
12
system() und exec() system() führt ein anderes Programm als Unterprozess aus wartet auf dessen Beendigung exec() ersetzt den aktuellen Prozess durch angegeben Befehl bei Erfolg kehrt der Aufruf nie zurück neuer Prozess hat die gleiche PID wie alter Prozess verwendet dieselben STDIN-, STDOUT-, STDERR-Dateihandles
13
Aufgabe Schreibe ein Programm, das alle 5 Sekunden die aktuelle Uhrzeit ausgibt.Verwende dazu: exec() date #!/usr/bin/env perl -w print "$$\n"; for($i=0;$i<5;$i++) { if (fork() == 0) { # child exec("date"); } else { # Parent wait(); Sleep(5); }
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.