|
|
Der Titel dieses Artikels ist mehrdeutig. Weitere Bedeutungen werden unter Prozess (Begriffsklärung) aufgeführt. |
Der Prozess in der Informatik ist ein ablaufendes Programm.
Zum Ablauf ist das Speicherabbild des ausführbaren Programms (Code), Speicher für die Daten, weitere vom Betriebssystem bereitgestellte Betriebsmittel (Ressourcen) und ein Prozessor notwendig. Ein Prozess nutzt diese Ressourcen exklusiv. Notwendige Betriebsmittel zusammen mit Verwaltungsinformationen definieren den Prozesskontext.
Aus der Definition folgt: Es kann mehrere Prozesse zu einem Programm geben, die je nach Anwendung auch gleichzeitig oder nebenläufig ablaufen. Im einfachen Fall werden mehrere Prozesse von einem Prozessor abgearbeitet, allgemein werden mehreren Prozessoren mehrere Prozesse zugeordnet. Die Verwendung mehrerer Prozessoren muss von der verwendeten Hard- und Software inklusive Betriebssystem unterstützt sein.
Inhaltsverzeichnis |
Ein Prozessor kann immer nur einen Prozess verarbeiten. Bei den ersten Computern wurden daher Programme immer nacheinander als Ganzes verarbeitet, es konnte immer nur ein Programm zur gleichen Zeit (exklusiv) ablaufen. Auch 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, was im Prozessmodell beschrieben wird.
Das Prozessmodell beschreibt die drei wesentlichen Zustände eines Prozesses:
Ein Betriebssystem benutzt eine bestimmte Strategie um Zeitabschnitte des Prozessors den Prozessen zuzuordnen, die ablaufen wollen. Dabei ändert das Betriebssystem eigenständig den Zustand eines jeden Prozesse zwischen WARTEND und LAUFEND hin und her, bis alle abgearbeitet ist; pro Zeiteinheit ist immer nur ein Prozess im Zustand LAUFEND.
Andere Prozesse können ebenfalls einen Prozess unterbrechen. Er ist dann im Zustand UNTERBROCHEN und wird vom Betriebssystem auch nicht mehr zeitweise in den Zustand LAUFEND versetzt. Erst wenn ein anderer Prozess den Prozess wieder aufsetzt und in den Zustand WARTEND bringt, ist das wieder der Fall.
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 (auch „leichtgewichtige Prozesse“ genannt) haben zwar eigene Stapelspeicher, besitzen jedoch im Gegensatz zu Prozessen keine eigenen Betriebsmittel wie Speicher oder geöffnete Dateien. Sie laufen als Teil eines Prozesses und verwenden dessen Betriebsmittel.
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 ChildProzess 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 2000) 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 32Bit-System sind somit maximal 3G virtuellen Adressraums für einen Benutzerprozess bei knapp unter 1 Gigabyte Hauptspeicher verwendbar. Bei 2 Gigabyte RAM reduziert sich dieser Anteil auf knapp 2G 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
stock | retire | vm
Why are we here?
All text is available under the terms of the GNU Free Documentation License
This page is cache of Wikipedia. History