- Prozess (Informatik)
-
Ein Prozess ist in der Informatik „der Vorgang einer algorithmisch ablaufenden Informationsverarbeitung“. Als Spezialfall „in Betriebssystemen ist ein Prozess ein Vorgang, der durch ein Programm kontrolliert wird, welches zur Ausführung einen Prozessor benötigt“ (Duden Informatik) [1].
Zum Prozess gehören das Programm samt Daten und der Prozesskontext.
Inhaltsverzeichnis
Prozesskontext
Beim Kontext wird zwischen dem Hardwarekontext und dem Softwarekontext unterschieden.
Der Hardwarekontext wird gebildet mit dem Speicherabbild des ausführbaren Programms (Code), Speicher für die Daten, weitere vom Betriebssystem bereitgestellte Betriebsmittel (Ressourcen) und der zugeordnete Prozessor. Ein Prozess nutzt diese Ressourcen exklusiv, d.h. insbesondere, dass sein Adressraum gegenüber anderen Prozessen abgeschottet ist und seine Daten somit nur ihm zugänglich sind (dies ist auch der Hauptunterschied zum Thread, der im gemeinsamen Adressraum seines Gesamtprozesses läuft).
Der Softwarekontext enthält Verwaltungsinformationen, auch über erforderliche Betriebsmittel.
Prozesskommunikation
Selten gibt es mehrere Prozesse zu einem Programm, die je nach Anwendung auch gleichzeitig oder nebenläufig ablaufen. Damit sie zusammenarbeiten können, muss das Betriebssystem Wege zur Interprozesskommunikation anbieten. Im einfachen Fall werden mehrere Prozesse von einem Prozessor abgearbeitet (quasi-gleichzeitig, Multitasking), allgemein werden mehreren Prozessoren mehrere Prozesse zugeordnet (echt gleichzeitig, Multiprocessing). Die Verwendung mehrerer Prozessoren sowie das quasi-gleichzeitige Abarbeiten verschiedener Prozesse auf einer CPU muss von der verwendeten Hard- und Software inklusive Betriebssystem unterstützt sein. Moderne Betriebssysteme kombinieren Multitasking und Multiprocessing.
Prozessmodell
Ein Prozessor kann immer nur einen Prozess verarbeiten. Bei den ersten Computern wurden daher die Programme immer nacheinander als Ganzes verarbeitet, es konnte immer nur ein Programm zur gleichen Zeit (exklusiv) ablaufen. Auch die Benutzer konnten einen Computer nicht gleichzeitig verwenden. Daher wurde die Möglichkeit geschaffen, Prozesse nur teilweise auszuführen, zu unterbrechen, und später wieder aufzusetzen und fortzuführen. Dadurch können mehrere Prozesse quasi gleichzeitig ausgeführt werden. Das Prozessmodell beschreibt die drei wesentlichen Prozesszustände, die je nach Ausgestaltung um weitere ergänzt werden können:
- BEREIT: Der Prozess besitzt alle Ressourcen (bis auf den Prozessor) und wartet auf die Zuteilung eines Prozessors.
- LAUFEND: Der Prozess ist aktuell einem Prozessor zugeordnet und läuft ab.
- WARTEND: Der Prozess wurde durch das Betriebssystem unterbrochen und wartet auf eine Ressource.
Das Betriebssystem ändert eigenständig den Zustand eines jeden Prozesses zwischen BEREIT und LAUFEND hin und her, bis alle abgearbeitet sind. Einzelne Zeitabschnitte des Prozessors werden den Prozessen zugeordnet, die ablaufen wollen.
Ein Prozess kann durch das Betriebssystem auch unterbrochen werden und befindet sich dann im Zustand WARTEND. In diesem Zustand wird er nicht mehr ausgeführt, er wartet auf die Zuteilung von erforderlichen Betriebsmitteln (Ressourcen). Wenn die Zuteilung erfolgt ist, wird er zunächst wieder in den Zustand BEREIT versetzt. Mögliche Ressourcen sind zum Beispiel: Speicher, Zugriff auf Ein-/Ausgabegeräte oder Benutzereingabe.
Betriebssysteme benutzen unterschiedliche Strategien, ihren Prozessen Zeitabschnitte eines Prozessors zuzuordnen, siehe Scheduling und Dispatcher. Weit verbreitet ist das Zeitscheibenverfahren fester Länge verbunden mit einer priorisierten Warteschlange (Vorrangwarteschlange) als Ringpuffer (Round-Robin).
Threads
Ein Thread (auch leichtgewichtiger Prozess genannt) ist eine Erweiterung des Prozessmodells. Er teilt sich mit anderen Threads die Betriebsmittel und den Prozesskontext eines Prozesses und besitzt nur einen eigenen Stapelspeicher (Stack). Bei betriebssystem-unterstützten Threads können diese durch mehrere CPU-Kerne echt parallel ausgeführt werden.
DV-Technik
Prozesse beim Betriebssystem UNIX
Beim Betriebssystem Unix läuft in einem Prozess häufig nur ein einziger Aktivitätsträger (Thread). Die Arbeit mit mehreren Threads wird erst mit der pthreads Bibliothek, normiert als Standard POSIX 1003.1c (Quelle: Galileo Computing), ermöglicht. Hierbei bringt jedes UNIX-System wie beispielsweise Solaris oder Linux eine eigene Implementation dieser Bibliothek mit. Bei der Anzeige der Prozesszustände wird der Zustand des Threads, der den Prozess repräsentiert, angegeben. Das sind folgende:
- dead: Der Prozess wurde beendet, er belegt jedoch noch Speicherplatz.
- ready: Der Prozess wartet auf Zuteilung der CPU (Zeitscheibe). Gibt es den Ready-Zustand, so befinden sich höchstens so viele Prozesse im Zustand running, wie CPUs vorhanden sind.
- running: Entweder genau der Prozess, der gerade bearbeitet wird, oder alle Prozesse, die momentan Rechenarbeit verrichten können.
- sleep: Der Prozess wurde auf eigenen Wunsch zurückgestellt. Er kann Signale entgegennehmen, wie z. B. Timer, oder Ergebnisse von Kindprozessen.
- trace: Der Prozess wurde von außen angehalten, üblicherweise durch einen Debugger.
- wait: Der Prozess wartet auf ein Ereignis, üblicherweise eine Benutzereingabe.
- uninterruptible sleep: Der Prozess wartet auf ein Ereignis, üblicherweise Hardware. Tritt dieses Ereignis ein, ohne dass der anfragende Prozess es entgegennimmt, so kann das System instabil werden.
- zombie: Der Prozess wurde beendet und aus dem Arbeitsspeicher gelöscht, aber noch nicht aus der Prozessliste entfernt.
Unter Unix wird ein neuer Prozess mittels des Systemaufrufs fork (Gabelung) erzeugt. Dabei wird ein zweiter identischer Prozess gestartet, während der erzeugende Prozess (auch Elternprozess genannt) weiterläuft. Alle Daten des ersten Prozesses, beispielsweise auch geöffnete Dateien, werden für den zweiten Prozess kopiert und stehen für diesen nun getrennt zur Verfügung. Jeder Prozess hat seinen eigenen Speicher. Der zweite Prozess ist ein vollwertiger Prozess ohne Einschränkung. Beide Prozesse können dann eigenständig weiterlaufen.
Ein Prozess ist meistens unterteilt in drei Segmente:
- Text-Segment: Hier ist der Code hinterlegt (shareable).
- Data-Segment: Hier liegen die Daten des Threads.
- Stack-Segment: Hier sind die Stacks des Threads gespeichert.
Ein typisches Code-Segment eines Prozesses sieht folgendermaßen aus (symbolischer Code):
Process p { result = fork(); if(result==0) { // wird von child ausgeführt } else { // wird von parent ausgeführt } }
Der Aufruf von
fork()
überschreibt den Rückgabewert des Parent-Prozesses mit der PID des Child-Prozesses, während der Child-Prozess den Rückgabewert 0 erhält.Prozesse beim Betriebssystem Windows
Unter Windows heißen Prozesse Tasks. In neuen Windows-Versionen ist es üblich, mit mehreren Aktivitätsträgern (Threads) zu arbeiten. Der sogenannte „Task-Manager“ (seit Windows NT 4.0) zeigt bei entsprechender Aktivierung der Anzeigespalte die Anzahl der zugehörigen Aktivitätsträger zu jedem Prozess.
Microsoft Windows NT seit Version 4.0 teilt den linearen Adressraum in der 32-Bit-Version, bedingt durch eine Limitierung der MIPS-Architektur, in zwei jeweils 2 GB große Teile. Die unteren 2 GB des Virtuellen Adressraumes stehen dem jeweiligem User-Mode-Prozess zur freien Verfügung (User Space), die oberen 2 GB sind für das System (Kernel Space), wie den Kernel, den physikalischen Speicher und in den Speicher „gemappte“ I/O-Adressbereiche wie z. B. PCI-Geräte, reserviert. Allerdings ist es möglich, diese Einteilung auf 3 GB Userspace und 1 GB Kernelspace zu verändern. Auf einem 32-Bit-System sind somit maximal 3 GB virtuellen Adressraums für einen Benutzerprozess bei knapp unter 1 Gigabyte Hauptspeicher verwendbar. Bei 2 Gigabyte RAM reduziert sich dieser Anteil auf knapp 2 GB virtuellen Adressraums. (Quelle: Inside Microsoft Windows 2000, 3rd Ed. Microsoft Press)
Die Art der Prozesserzeugung hängt nun davon ab, in welchem Subsystem von Windows der Prozess erzeugt wird. Wird ein Prozess aus einem Unix-Executable erzeugt, wird das Posix-Subsystem (Posix.exe) gestartet und ein Prozess mit Hilfe von
fork.exe
erzeugt.Es läuft immer genau ein Thread im Windows-Subsystem, alle anderen Subsysteme müssen „manuell“ gestartet werden um Ressourcen zu sparen.
Ein Prozess wird automatisch beendet, wenn sein letzter Thread beendet ist.
Beenden von Prozessen
Prozesse können auf verschiedene Weise beendet werden. Wird ein Programm erfolgreich aufgerufen, so werden dessen Instruktionen nacheinander abgearbeitet.
- Natürliches Ende
Am Ende, nachdem alle Anweisungen ausgeführt wurden, wird das Programm normalerweise durch einen
exit()
Aufruf terminiert.- Beenden durch äußere Einflüsse
Der Benutzer kann einen Prozess vorzeitig durch Senden von Signalen beenden. In Unix geschieht dies durch den Befehl
kill
.- Vorzeitige Beendigung durch Programmfehler
Programmfehler führen oft zur Beendigung eines laufenden Prozesses. Programmfehler können sein:
-
- unerlaubter Speicherzugriff
- arithmetische Fehler wie z. B. Division durch 0
- unerlaubte Maschinenbefehle.
- Systembedingtes Beenden
Das Betriebssystem kann ebenfalls einen Prozess vorzeitig beenden, wenn zum Beispiel kein freier Speicher mehr verfügbar ist, oder wenn ein unerwarteter Fehler in der Hardware oder im Betriebssystem aufgetaucht ist.
Einzelnachweis
- ↑ Duden Informatik ISBN 3-411-05232-5
Weblinks
Siehe auch
Leerlaufprozess, Nebenläufigkeit, Prozesskontrollblock, Bernstein-Bedingung
Kategorien:- Betriebssystemtheorie
- Parallelverarbeitung
Wikimedia Foundation.