Der Prozess bezeichnet in der Informatik ein im Ablauf befindliches Computerprogramm.
Zum Prozess gehören das Programm samt Daten und der 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.
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.
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:
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).
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.
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:
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:
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.
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.
Prozesse können auf verschiedene Weise beendet werden. Wird ein Programm erfolgreich aufgerufen, so werden dessen Instruktionen nacheinander abgearbeitet.
Am Ende, nachdem alle Anweisungen ausgeführt wurden, wird das Programm normalerweise durch einen exit()
Aufruf terminiert.
Der Benutzer kann einen Prozess vorzeitig durch Senden von Signalen beenden. In Unix geschieht dies durch den Befehl kill
.
Programmfehler führen oft zur Beendigung eines laufenden Prozesses. Programmfehler können sein:
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.
Leerlaufprozess, Nebenläufigkeit, Prozesskontrollblock, Bernstein-Bedingung