Vorlesung Betriebssysteme I

Ähnliche Dokumente
Prozesse. Vorlesung Betriebssysteme I. Zustandsmodell eines Prozesses. Virtuelle vs. reale CPU. Zustandsübergänge cont d

Betriebssysteme Kapitel E : Prozesse

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

Dämon-Prozesse ( deamon )

Systemprogrammierung

2Binden 3. und Bibliotheken

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

PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

Prüfung Betriebssysteme 1

Erklären Sie kurz die Begriffe Handle und Prozess/Thread im Kontext von Windows 2000.

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

Rechnerarchitektur und Betriebssysteme (CS201): Frühe Betriebssysteme, geschützte CPU-Befehle, CPU-Modus

Eine Mini-Shell als Literate Program

Was ist ein Prozess?

Bash-Skripting Linux-Kurs der Unix-AG

3. Unix Prozesse. Betriebssysteme Harald Kosch Seite 57

Linux Prinzipien und Programmierung

Bash-Skripting Linux-Kurs der Unix-AG

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

Systeme I: Betriebssysteme Kapitel 4 Prozesse. Wolfram Burgard

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

Prozesse and Threads WS 09/10 IAIK 1

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

Prozesse. Netzwerk - Programmierung. Alexander Sczyrba Madis Rumming

Netzwerk-Programmierung. Prozesse. Alexander Sczyrba Michael Beckstette.

Systeme I: Betriebssysteme Kapitel 4 Prozesse. Maren Bennewitz

Prozesse und Scheduling unter Linux (Kernel 2.4.XX)

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

PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

Betriebssysteme (BS)

Betriebssysteme (BS) Inhalt. Prozesse. Olaf Spinczyk.

U23 - Shellcode. Twix Chaos Computer Club Cologne. Motivation Einstieg Der erste Shellcode Nullbytes, NOP Slides

Prozesse und Threads. Prozess. Trace. Einfachstes Prozessmodell. Traces

Einführung in UNIX 1. Das Betriebssystem UNIX ist fähig, mehrere Aufgaben scheinbar gleichzeitig zu erledigen. Dies wird mit Multitasking bezeichnet.

Shared-Memory Programmiermodelle

Shell-Scripting Linux-Kurs der Unix-AG

Shell-Scripting Linux-Kurs der Unix-AG

Betriebssysteme. Dipl.-Ing.(FH) Volker Schepper

2A Basistechniken: Weitere Aufgaben

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

Modul B-PRG Grundlagen der Programmierung 1

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

Bash-Scripting Linux-Kurs der Unix-AG

Technische Informatik 1

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

Betriebssysteme G: Parallele Prozesse (Teil A: Grundlagen)

Tafelübung zu BS 1. Prozesse verwalten

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

Arithmetik in der tcsh

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

Lab 13: Multi Processor Systems II

Musterlösung Prüfung WS 01/02

Übung zu Grundlagen der Betriebssysteme. 6. Übung

Lösung Übungszettel 6

Verwendung Vereinbarung Wert einer Funktion Aufruf einer Funktion Parameter Rekursion. Programmieren in C

Tafelübung zu BS 1. Prozesse verwalten

Vorlesung Betriebssysteme I

Übung zu Grundlagen der Betriebssysteme. 5. Übung

Dynamische Speicherverwaltung

Betriebssysteme (BS)

Prozesse. Prozesskonzept. Prozess- ein Programm in Ausführung

Einleitung Entwicklung in C Hello-World! Konstrukte in C Zusammenfassung Literatur. Grundlagen von C. Jonas Gresens

C-Kurs 2010 Pointer. 16. September v2.7.3

3.2 Prozessumschaltung

Threads. Netzwerk - Programmierung. Alexander Sczyrba Jan Krüger

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

Systeme I: Betriebssysteme Kapitel 4 Prozesse. Maren Bennewitz

Embedded-Linux-Seminare. Linux als Betriebssystem

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

Betriebssysteme Übung 2. Tutorium System Calls & Multiprogramming

Fortgeschrittene I/O

Probeklausur zu Systemnahe Software II SS 2012 Dr. Andreas Borchert mit Markus Schnalke

Inhaltsverzeichnis. 2.4 Thread-Systeme. 2.1 Was ist ein Prozess? 2.2 Scheduling. 2.3 Interprozesskommunikation

Shell-Scripting Linux-Kurs der Unix-AG

Windows 2000 Scheduler

4. Foliensatz Betriebssysteme und Rechnernetze

Betriebssysteme. Tafelübung 4. Speicherverwaltung. Olaf Spinczyk.

Betriebssysteme. Agenda. Tafelübung 4. Speicherverwaltung. Olaf Spinczyk.

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

Re-Initialisierung. Quantum verbraucht. standby. Ausführung beenden. waiting

Prozesse, Logs und Systemverwaltung

Threads and Scheduling

Der Scheduler von Windows 2000 Konzepte und Strategien

Konzepte von Betriebssystemkomponenten Referat am Thema: Adressräume, Page Faults, Demand Paging, Copy on Write Referent: Johannes Werner

Lösung zur Praktikumsaufgabe 2

Programme werden durch den Ablauf eines oder mehrerer Prozesse (engl.: process, task) von einem Rechner abgearbeitet.

7. Foliensatz Betriebssysteme

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

Beispiel Block 2 Stream I/O Parallele Prozesse: fork, exec und wait Interprozesskommunikation mit Unnamed Pipes

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

Shell-Scripting Linux-Kurs der Unix-AG

Speicherverwaltung in Minix

Systeme I: Betriebssysteme Kapitel 4 Prozesse. Maren Bennewitz

Betriebssysteme (BS)

Sicheres C Programmieren in Embedded Systemen ARM I (ARM7TMDI [1] ) Wintersemester

C und Linux HANSER. Martin Gräfe. Die Möglichkeiten des Betriebssystems mit eigenen Programmen nutzen. Z., erweiterte Auflage

Grundlagen der Informatik für Ingenieure I. 5. Prozessverwaltung - Einführung

Ausgewählte Themen. In diesem Teil werden ausgewählte Themen vorgestellt: Fehlerbehandlung Dämonen Zombies. Inhalt. 1. Fehlerbehandlung...

Concurrent programming Prinzipien und Einführung in Prozesse

Transkript:

1 / 34 Vorlesung Betriebssysteme I Thema 5: Aktivitäten Robert Baumgartl 29. November 2016

2 / 34 Prozesse Def. Ein Prozess ist ein in Ausführung befindliches Programm. Lebenszyklus: Erzeugung Abarbeitung Beendigung benötigt Ressourcen bei Erzeugung (Hauptspeicher, eineindeutigen Identifikator PID, Programmcode) benötigt weitere Ressourcen im Laufe seines Lebens, nicht mehr benötigte Ressourcen gibt er i. a. zurück Jeder Prozess besitzt einen virtuellen Prozessor, d. h. CPU wird zwischen allen Prozessen geteilt (jeder erhält CPU für eine gewisse Zeitspanne, vgl. folgende Abbildung) Hauptmerkmal: Jeder Prozess besitzt einen eigenen Adressraum (jeder Prozess denkt gewissermaßen, er sei allein im System) Jeder Prozess besitzt einen Vaterprozess sowie u. U. Kindprozesse

Virtuelle vs. reale CPU P1...... P2...... P3...... virtuelle CPU virtuelle CPU virtuelle CPU Px... Transformation... reale CPU Abbildung: Virtuelle vs. reale CPU 3 / 34

Zustandsmodell eines Prozesses 4 / 34 Drei grundlegende Globalzustände werden stets unterschieden: aktiv : Prozess wird abgearbeitet. Er besitzt alle angeforderten Ressourcen und die CPU. bereit : Prozess besitzt alle angeforderten Ressourcen jedoch nicht die CPU. wartend : Prozess wartet auf Zuteilung einer durch ihn angeforderten Ressource und wird nicht abgearbeitet. bereit 1 2 aktiv 4 3 wartend

5 / 34 Zustandsübergänge (Transitionen) bei Prozessen 1. aktiv bereit: Aktiver Prozess wird verdrängt (Ursache z. B. höherpriorisierter Prozess wurde bereit oder Zeitscheibe abgelaufen) 2. bereit aktiv: wie 1. 3. aktiv wartend: Aktiver Prozess geht in Wartezustand (er hat eine Ressource angefordert, deren Zuteilung ihm verweigert wurde; er blockiert) 4. wartend bereit: wartender Prozess erhält angeforderte Ressource schließlich zugeteilt.

6 / 34 Zustandsübergänge cont d bereit wartend: unmöglich (ein bereiter Prozess kann nichts tun, also auch keine Ressource anfordern, die ihm verweigert wird) wartend aktiv: nicht sinnvoll (Prozess erhält eine Ressource, auf die er wartet, rückgebender aktiver Prozess würde für Ressourcenrückgabe bestraft ) Es gibt stets einen aktiven Prozess (CPU kann nicht leerlaufen ), falls keine Nutzarbeit anliegt Idle-Prozess Jede Ressourcenanforderung wird irgendwann erfüllt. Prozesszustandsdiagramme in realen Systemen sehen häufig komplexer aus (sind es aber nicht).

Prozesszustände im Linux-Kernel 2.6 existing task calls fork() and creates a new process scheduler dispatches task to run: schedule() calls context_switch() TASK_ZOMBIE (task is terminated) task forks TASK_RUNNING TASK_RUNNING task exits via do_exit() (ready but not running) (running) task is preempted by higher priority task event occurs and task is woken up and placed back on the run queue TASK_INTERRUPTIBLE or TASK_UNINTERRUPTIBLE (waiting) task sleeps on wait queue for a specific event Quelle: Robert Love, Linux Kernel Development, 2005 7 / 34

Prozesszustände im Windows NT/2000/XP Create and initialize thread object Reinitialize Initialized Place in ready queue Terminated Set object to signaled state Ready Execution completes Thread waits on an object handle Waiting Resources unavailable Transition Resources become available Preempt Select for execution Running Preempt (or time quantum ends) Standby Contex switch to it and start its execution (dispatching) Quelle: David Solomon, Inside Windows 2000, Microsoft Press, 2000 8 / 34

Speicherabbild 9 / 34 jeder Prozess besitzt eigenen Adressraum (Größe systemabhängig, typisch 2 32 Bytes) Adressraum ist exklusiv (Ausnahme: Shared-Memory-Segmente) Bestandteile (Abb. 10) eines Adressraums in UNIX: Text: Programmcode Data: initialisierte Daten BSS: uninitialisierte Daten, Heap Stack

Prinzipieller Adressraumaufbau eines Prozesses 10 / 34 High Umgebung, Argumente Stack Heap uninitialisierte Daten (BSS) "break" null initialisiert Low initialisierte Daten Text aus Datei eingelesen durch exec()

11 / 34 Prozessverwaltung Prozesse werden unterbrochen und fortgesetzt (Wechsel zwischen bereit und aktiv) alle Informationen, die für Fortsetzung benötigt werden (= Mikrozustand), müssen archiviert werden Prozesstabelle aka Process Control Block (PCB) konkrete Ausprägung der Parameter stark systemabhängig Beispiel eines Eintrags: Tabelle 1 Linux: struct task_struct in include/linux/sched.h; ca. 1.7 kbytes groß

Mikrozustand eines Prozesses 12 / 34 Prozessverwaltung Speicherverwaltung Dateiverwaltung Register Zeiger auf Text-Segment Wurzelverzeichnis Befehlszeiger Zeiger auf Data-Segment Arbeitsverzeichnis Flagregister Zeiger auf Stack offene Dateideskriptoren Globalzustand User ID Priorität Gruppen-ID Prozess-ID ID des Vaters Zeitstempel erhaltene CPU-Zeit Tabelle: Typischer Eintrag in der Prozesstabelle

13 / 34 Informationen zu Prozessen: das Kommando ps gibt tabellarisch zu jedem Prozess des Nutzers aus PID (Prozess-ID) TTY (das zugehörige Terminal) Zustand (Status) des Prozesses die bislang konsumierte CPU-Zeit das zugrundeliegende Kommando

14 / 34 Kommando ps (Fortsetzung) Kommandoswitches von ps, die Sie brauchen werden: -A listet alle Prozesse r listet alle bereiten Prozesse (, die sich die CPU teilen) X gibt Inhalt des Stackpointers und einiger weiterer Register aus f zeichnet Verwandtschaftsverhältnisse mit ASCII-Grafik (besser: pstree-kdo.) -l langes Format (zusätzlich UID, Parent PID, Priorität, Größe) Ein falscher Kommandozeilenparameter gibt eine kurze Zusammenfassung der gültigen Switches aus. Achtung: Die Syntax der Optionen von ps ist kompliziert; manchmal mit vorangestelltem -, manchmal ohne.

15 / 34 Weitere wichtige Prozess-Kommandos top - kontinuierliche Prozessbeobachtung pstree - (text-)grafische Veranschaulichung von Prozessverwandschaften pgrep - Suche nach Prozessen mittels regulärer Ausdrücke Beispiel: pgrep -l "[[:alpha:]]*d\>" listet die PID und Namen aller Daemon-Prozesse nice - Setzen der Prozesspriorität kill - Senden von Signalen

Erzeugung von Prozessen 16 / 34 Nur ein Prozess kann einen anderen Prozess erzeugen (lassen), z. B. durch Doppelklick auf ein Icon Eingabe eines Kommandos Abarbeitung eines Skriptes Bootvorgang des Rechners Mechanismus: Systemruf UNIX: fork() Win32: CreateProcess() erzeugter Prozess landet zunächst im Bereit-Zustand

Beispiel: Prozesserzeugung im Shellskript 17 / 34 #!/bin/bash # number of xterms to start if [ "$1" == "" ] then iterations=1 else iterations=$1 fi # do the (dirty) work for (( count=0; count < $iterations; count++)) do xterm & done # finish(ed) exit 0

Erzeugung eines Unix-Prozesses mittels fork() 18 / 34 pid_t fork (void) ; erzeugt identische Kopie des rufenden Prozesses, mit differierendem PID und PPID (Parent Process Identificator) beide Prozesse setzen nach fork() fort und sind fortan unabhängig voneinander Es ist nicht vorhersehbar, ob Vater oder Sohn zuerst fork() verlassen Resultat: Vater: -1 im Fehlerfalle, PID des Sohnes ansonsten Sohn: 0 Vater-Sohn-Verwandschaft Vater und Sohn arbeiten identischen Code ab, haben aber private Variablen

Typischer Einsatz von fork() 19 / 34 int main(int argc, char* argv[]) { pid_t ret; ret = fork(); if (ret == -1) { printf("fork() failed. Stop.\n"); exit(exit_failure); if (ret == 0) { /* Sohn */ printf("ich bin der Sohn!\n"); exit(exit_success); else { /* Vater */ printf("ich bin der Vater!\n"); printf("der PID des Sohnes betraegt %d.\n", ret); exit(exit_success);

Wieviel Prozesse schlafen? 20 / 34 #include <unistd.h> int main(void) { fork(); fork(); fork(); sleep(60); return 0;

Variablen sind privat int var = 42; int main(int argc, char* argv[]) { pid_t ret; if ((ret = fork())== -1) { printf("fork() failed. Stop.\n"); exit(exit_failure); if (ret == 0) { /* Sohn */ var = 32168; printf("sohns var hat den Wert %d.\n", var); sleep(5); printf("sohns var hat (immer noch) den Wert %d.\n", var); exit(exit_success); else { /* Vater */ sleep(2); printf("vaters var hat den Wert %d.\n", var); exit(exit_success); 21 / 34

22 / 34 Die Bibliotheksfunktion system() int system (const char string) ; führt das Kommando string mittels /bin/sh -c aus string kann Kommando und dessen Parameter enthalten kehrt erst zurück, wenn Kommando beendet wurde kombiniert fork() und exec()

23 / 34 Überlagerung des Prozessabbilds mittels execl() execl() übernimmt (u. a.) eine Pfadangabe einer ausführbaren Binärdatei als Parameter ersetzt den aktuell abgearbeiteten Programmcode durch diese Binärdatei springt diesen Code sofort an und beginnt, diesen abzuarbeiten kehrt nur im Fehlerfalle zurück (z. B. bei falscher Pfadangabe) Rückkehr in Ausgangsprozess unmöglich (!) Systemruf-Familie: 5 Rufe mit sehr ähnlicher Semantik (execl(), execle(), execv(), execlp() und execvp()) erzeugt keinen neuen Prozess

Überlagerung des Prozessabbilds mittels execl() 24 / 34 #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) { int ret; printf("%s vor Aufruf von execl()\n", argv[0]); ret = execl("/bin/ls", "ls", NULL); if (ret == -1) { printf("execl() ging schief. Und nun?\n"); exit (EXIT_FAILURE); /* wird nicht erreicht! */ printf("%s nach Aufruf von execl()\n", argv[0]); exit (EXIT_SUCCESS);

Beendigung von Prozessen 25 / 34 Beendigung kann selbst oder durch anderen Prozess erfolgen (falls dieser die Rechte dazu besitzt) Selbstbeendigung: Verlassen von main(), return innerhalb von main(), exit() an beliebiger Stelle im Programm, z. B. als Folge eines Fehlers Fremdbeendigung: Zustellung eines Signals durch anderen Prozess fataler Fehler durch den Prozess selbst (Division durch Null, illegale Instruktion, Referenz eines ungültigen Zeigers,... )

Möglichkeit zur Beendigung: durch das System 26 / 34 #include <stdio.h> int main(int argc, char* argv[]) { int ret = 42; int x = 0; ret = ret / x; printf("geschafft!\n"); return 0; Abarbeitung: robge@ilpro121:~>./div-by-zero Gleitkomma-Ausnahme

Möglichkeit der Beendigung: exit (mit Rückkehrcode) 27 / 34 Listing 1: Generierung eines Rückkehrcodes (retval.c) #include <stdlib.h> int main(int argc, char* argv[]) { if (argc==2) { exit (atoi(argv[1])); else { exit(42); Listing 2: Abfrage des Rückkehrcodes im Shellskript #!/bin/bash./retval 14 echo $?./retval echo $?

Synchronisation mittels wait() 28 / 34 pid_t wait( int status) ; bringt den rufenden Prozess in den Wartezustand dieser wird (automatisch) wieder verlassen, wenn ein (beliebiger) Kindprozess terminiert falls kein Kindprozess existiert, wird einfach fortgesetzt status enthält Statusinformationen zum Kindprozess (u. a. Rückkehrcode) Resultat: -1 bei Fehler PID des beendeten Kindprozesses ansonsten zur Synchronisation zwischen Vater und Sohn nutzbar

Beispiel 1 zu wait() 29 / 34 #include <sys/types.h> #include <sys/wait.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char* argv[]) { pid_t ret; ret = fork(); if (ret == -1) { perror("fork"); exit(exit_failure); if (ret == 0) { /* Sohn */ printf("sohn geht schlafen...\n"); sleep(10); printf("sohn erwacht und endet.\n"); exit(exit_success); else { /* Vater */ printf("vater wartet auf Sohns Ende.\n"); ret = wait(null); if (ret == -1) { perror("wait"); exit(exit_failure); printf("vater endet (nach Sohn).\n"); exit(exit_success);

Beispiel 2 zu wait() 30 / 34 #include <stdio.h> #include <unistd.h> #include <sys/wait.h> int main(int argc, char* argv[]) { sleep(20); fork(); /* 1. */ sleep(20); fork(); /* 2. */ wait(null); sleep(20); fork(); /* 3. */ sleep(20); return 0; Wann sind welche Prozesse im System?

fork(), exec() und wait() zusammen: eine Shell Eine Shell tut im Prinzip nichts weiter als: 1: loop 2: Kommando von stdin einlesen 3: fork() 4: Sohnprozess überlagert sich selbst mit Kommando && Vater wartet auf die Beendigung des Sohnes 5: end loop Beispiel: minishell.c (extern, da zu groß) 31 / 34

Windows: CreateProcess() 32 / 34 keine Verwandtschaft zwischen Prozessen keine Hierarchie legt neuen Adressraum an ( neuer Prozess) startet in diesem einen Thread, der das angegebene Programm ausführt gewissermaßen Hintereinanderausführung von fork() und exec() BOOL CreateProcess ( LPCTSTR lpapplicationname, // pointer to name of executable module LPSTR lpcommandline, // pointer to command line string LPSECURITY_ATTRIBUTES lpprocessattributes, LPSECURITY_ATTRIBUTES lpthreadattributes, BOOL binherithandles, // handle inheritance flag DWORD dwcreationflags, LPVOID lpenvironment, // pointer to new environment block LPCTSTR lpcurrentdirectory, // pointer to current directory name LPSTARTUPINFO lpstartupinfo, LPPROCESS_INFORMATION lpprocessinformation );

33 / 34 Ist das alles zu Aktivitäten? Mitnichten! vfork(), clone(),... Threads Coroutinen und Fibers Kommunikation Synchronisation

34 / 34 Was haben wir gelernt? 1. Begriff des Prozesses 2. Zustände und Transitionen zwischen ihnen 3. Prozesserzeugung in Unix mittels fork() 4. Überlagerung des Prozessabbilds mittels exec() 5. Methoden der Prozessbeendigung 6. einfache Synchronisation mittels wait()