Ein Prozess (auch Task oder Programminstanz genannt) ist ein Computerprogramm zur Laufzeit. Genauer ist ein Prozess die konkrete Instanziierung eines Programms zu dessen Ausführung innerhalb eines Rechnersystems, ergänzt um weitere (Verwaltungs-)Informationen und Ressourcenzuteilungen des Betriebssystems für diese Ausführung.
Ein Prozess ist die Ablaufumgebung für ein Programm auf einem Rechnersystem sowie der darin eingebettete Binärcode des Programmes während der Ausführung. Ein Prozess wird vom Betriebssystem dynamisch kontrolliert durch bestimmte Aktionen, mit denen das Betriebssystem ihn in entsprechende Zustände setzt. Als Prozess bezeichnet man auch die gesamte Zustandsinformation eines laufenden Programms. Im Gegensatz dazu handelt es sich bei einem Programm um die (statische) Verfahrensvorschrift für eine Verarbeitung auf einem Rechnersystem.
Die Prozesse werden vom Prozess-Scheduler des Betriebssystems verwaltet. Dieser kann einen Prozess entweder so lange rechnen lassen, bis er endet oder blockiert (nicht-unterbrechender Scheduler), oder dafür sorgen, dass nach jeweils einer kurzen Zeitdauer der gerade ablaufenden Prozess unterbrochen wird, und der Scheduler so zwischen verschiedenen aktiven Prozessen hin und her wechseln kann (unterbrechender Scheduler), wodurch der Eindruck von Gleichzeitigkeit entsteht, auch wenn zu jedem Zeitpunkt nicht mehr als nur ein Prozess verarbeitet wird. Letzteres ist die vorherrschende Scheduling-Strategie heutiger Betriebssysteme.
Eine nebenläufige Ausführungseinheit innerhalb eines Prozesses wird Thread genannt. Bei modernen Betriebssystemen gehört zu jedem Prozess mindestens ein Thread, der den Programmcode ausführt. Oftmals werden nun nicht mehr Prozesse nebenläufig ausgeführt, sondern nur die Threads innerhalb eines Prozesses.Christian Ullenboom: Java ist auch eine Insel. Einführung, Ausbildung, Praxis. 11., aktualisierte und überarbeitete Auflage, Galileo Computing: Bonn, 2014, S. 902.
Unterscheidung zwischen Programm und Prozess
Ein Programm ist eine den Regeln einer bestimmten Programmiersprache genügende Folge von Anweisungen (bestehend aus Deklarationen und Instruktionen), um bestimmte Funktionen bzw. Aufgaben oder Probleme mithilfe eines Computers zu bearbeiten oder zu lösen.ISO/IEC 2382-1:1993 definiert „computer program“: „A syntactic unit that conforms to the rules of a particular programming language and that is composed of declarations and statements or instructions needed to solve a certain function, task, or problem.“ Bis 2001 definierte die DIN 44300 „Informationsverarbeitung Begriffe“ identisch. Ein Programm bewirkt nichts, solange es nicht gestartet wurde. Wird ein Programm gestartet – genauer: eine Kopie (im Hauptspeicher) des Programms (auf dem Festwertspeicher), so wird diese Instanz zu einem (Betriebssystem-)Prozess, der zum Ablauf einem Prozessorkern zugeordnet werden muss.
Andrew S. Tanenbaum veranschaulicht den Unterschied zwischen einem Programm und einem Prozess metaphorisch anhand des Prozesses des Kuchenbackens:
Das Rezept für den Kuchen ist das Programm (d. h. ein in einer passenden Notation geschriebener Algorithmus), der Bäcker ist der Prozessorkern und die Zutaten für den Kuchen sind die Eingabedaten. Der Prozess ist die Aktivität, die daraus besteht, dass der Bäcker das Rezept liest, die Zutaten herbeiholt und den Kuchen backt. Es kann nun beispielsweise vorkommen, dass der Sohn des Bäckers wie am Spiess schreiend in die Backstube gelaufen kommt. In diesem Fall notiert sich der Bäcker, an welcher Stelle des Rezeptes er sich befindet (der Zustand des aktuellen Prozesses wird gespeichert) und wechselt in einen Prozess mit höherer Priorität, nämlich „Erste Hilfe leisten“. Dazu holt er ein Erste-Hilfe-Handbuch hervor und folgt den dortigen Anweisungen. Den beiden Prozessen „Backen“ und „Erste Hilfe leisten“ liegt also ein unterschiedliches Programm zu Grunde: Kochbuch und Erste-Hilfe-Handbuch. Nachdem der Bäckersohn medizinisch versorgt wurde, kann der Bäcker zum „Backen“ zurückkehren und an dem Punkt fortfahren, an dem er unterbrochen wurde. Das Beispiel veranschaulicht, dass sich mehrere Prozesse einen Prozessorkern teilen können. Eine Scheduling-Strategie entscheidet, wann die Arbeit an einem Prozess unterbrochen und ein anderer Prozess bedient wird.Tanenbaum: Moderne Betriebssysteme. 3. Aufl., 2009, S. 126–127.
Ein Prozess stellt auf einem Rechnersystem die Ablaufumgebung für ein Programm zur Verfügung und ist die Instanziierung eines Programms. Als ablaufendes Programm beinhaltet ein Prozess dessen Anweisungen – sie sind eine dynamische Folge von Aktionen, die entsprechende Zustandsänderungen bewirken. Als Prozess bezeichnet man auch die gesamte Zustandsinformation eines laufenden Programms.Mandl: Grundkurs Betriebssysteme. 4. Aufl., 2014, S. 78.
mini|Der Aufbau eines Prozesses im Hauptspeicher mit Programmsegment (text), Datensegment (data), Heap und Stack. Im Zusammenhang mit den Speicheradressen, die ein laufendes Programm als Prozess nutzen darf, spricht man auch von einem Prozessadressraum. Damit ein Programm ausgeführt werden kann, müssen ihm bestimmte Ressourcen zugeteilt werden. Dazu gehört u. a. ein ausreichender Anteil des Hauptspeichers, in dem der entsprechende Prozess ausgeführt werden soll. Im Allgemeinen übersetzt der Compiler ein Programm in eine ausführbare Datei, die vom Betriebssystem in den Adressraum eines Prozesses geladen werden kann. Ein Programm kann nur zu einem Prozess werden, wenn die ausführbare Datei in den Hauptspeicher geladen wird. Es gibt zwei übliche Techniken, wie ein Benutzer dem Betriebssystem anweist, eine ausführbare Datei zu laden und zu starten: durch Doppelklick auf ein Icon, das die ausführbare Datei repräsentiert, oder durch Eingabe des Dateinamens in der Kommandozeile.Silberschatz, Galvin, Gagne: Operating System Concepts. 2013, S. 106–107. Außerdem haben laufende Programme auch noch die Möglichkeit, ohne Beteiligung des Benutzers weitere Prozesse mit Programmen zu starten.
Ein Prozess beinhaltet insbesondere den Wert des Befehlszählers, die Inhalte der zum Prozess gehörenden Prozessor-Register, das Programmsegment, das den ausführbaren Code des Programms enthält, das Stack-Segment, das temporäre Daten wie Rücksprungadressen und lokale Variablen enthält, das Datensegment, das globale Variablen enthält, und unter Umständen einen Heap, der dynamisch angeforderten Speicher umfasst, der auch wieder freigegeben werden kann.Silberschatz, Galvin, Gagne: Operating System Concepts. 2013, S. 106.
Auch wenn zwei Prozesse zu demselben Programm gehören, werden sie trotzdem als zwei unterschiedliche Ausführungseinheiten angesehen. So können beispielsweise verschiedene Benutzer verschiedene Kopien eines gleichen Mail-Programms ausführen oder ein einziger Benutzer kann verschiedene Kopien eines Browser-Programms aktivieren. Davon ist jede ein separater Prozess. Auch wenn unter Umständen das Programmsegment bei verschiedenen Instanzen eines Programms dasselbe ist, so unterscheiden sich Daten-, Heap- und Stack-Segmente.Silberschatz, Galvin, Gagne: Operating System Concepts. 2013, S. 107.
Ein Prozess kann seinerseits wieder eine Ausführungsumgebung für anderen Programmcode sein. Ein Beispiel dafür ist die Java-Laufzeitumgebung. Diese besteht üblicherweise aus der Java Virtual Machine (JVM), die für die Ausführung der Java-Anwendungen verantwortlich ist. Mit ihr werden Java-Programme weitgehend unabhängig vom darunter liegenden Betriebssystem ausgeführt. So lässt sich ein kompiliertes Java-Programm Program.class mit dem Kommandozeilenbefehl java Program ausführen. Der Befehl java erzeugt einen gewöhnlichen Prozess für die JVM, welche dann ihrerseits das Java-Programm Program in der virtuellen Maschine ausführt.
Im Zusammenhang mit den Speicherbereichen, die ein laufendes Programm als Prozess nutzen darf, spricht man auch von einem Prozessadressraum. Ein Prozess kann nur Daten verarbeiten, die zuvor in seinen Adressraum geladen wurden; Daten, die momentan von einem Maschinenbefehl verwendet werden, müssen sich zudem im (physischen) Hauptspeicher befinden.Mandl: Grundkurs Betriebssysteme. 4. Aufl., 2014, S. 80. Der Adressraum eines Prozesses ist im Allgemeinen virtuell; der virtuelle Speicher bezeichnet den vom tatsächlich vorhandenen Hauptspeicher unabhängigen Adressraum, der einem Prozess vom Betriebssystem zur Verfügung gestellt wird. Die Memory Management Unit (MMU) verwaltet den Zugriff auf den Hauptspeicher. Sie rechnet eine virtuelle in eine physische Adresse um (siehe dazu auch Speicherverwaltung und Paging).
Prozesszustände
Es wird unterschieden zwischen dem Ausführungszustand eines Prozesses – welche Daten in den Registern stehen, wie viel Speicher er an welchen Adressen besitzt, aktuelle Ausführungsstelle im Programm (Befehlszähler) usw. (Prozesskontext) sowie dem Prozesszustand aus Sicht des Betriebssystems: zum Beispiel „gerade rechnend“, „blockiert“, „wartend“, „fertig“.
Ein Prozessor(kern) kann immer nur einen Prozess gleichzeitig verarbeiten. Bei den ersten Computern wurden daher die Prozesse immer nacheinander als Ganzes verarbeitet, es konnte immer nur ein Prozess zur gleichen Zeit (exklusiv) ablaufen. Um die Wartezeiten beim Zugriff z. B. auf langsame Peripherie-Einheiten nutzen zu können, wurde die Möglichkeit geschaffen, Prozesse nur teilweise auszuführen, zu unterbrechen und später wieder fortzuführen (wieder „aufzusetzen“). Der Begriff Multiprogramming (auch Multiprogrammbetrieb oder Multiprocessing) bezeichnet im Gegensatz zum Einprogrammbetrieb (Singleprocessing) die Möglichkeit der „gleichzeitigen“ oder „quasi-gleichzeitigen“ Ausführung von Programmen/Prozessen in einem Betriebssystem. Die meisten modernen Betriebssysteme wie Windows oder Unix unterstützen den Mehrprozessbetrieb, wobei die Anzahl der nebenläufigen Prozesse meist wesentlich höher ist als die Anzahl der vorhandenen Prozessorkerne.Mandl: Grundkurs Betriebssysteme. 4. Aufl., 2014, S. 35–36.
Ein Prozess durchläuft somit während seiner Lebenszeit verschiedene Zustände. Wenn das Betriebssystem entscheidet, den Prozessor für eine gewisse Zeit einem anderen Prozess zuzuteilen, wird zunächst der aktuell rechnende Prozess gestoppt und in den Zustand rechenbereit versetzt. Danach kann der andere Prozess in den Zustand rechnend versetzt werden. Es kann auch sein, dass ein Prozess blockiert wird, weil er nicht weiterarbeiten kann. Typischerweise geschieht dies durch das Warten auf Eingabedaten, die noch nicht zur Verfügung stehen. Vereinfacht lassen sich vier Zustände unterscheiden:Mandl: Grundkurs Betriebssysteme. 2008, S. 78; Tanenbaum: Moderne Betriebssysteme. 3. Aufl., 2009, S. 131–132.
Rechnend (engl. running, auch aktiv): Der Prozess wird in diesem Moment auf der CPU ausgeführt, d. h. die Programm-Befehle werden abgearbeitet. Einem Prozess im Zustand rechnend kann das Betriebsmittel CPU auch wieder entzogen werden, er wird dann in den Zustand bereit versetzt. (Rechen)bereit (engl. ready): Im Zustand bereit befinden sich Prozesse, die gestoppt wurden, um einen anderen Prozess rechnen zu lassen. Sie können theoretisch ihren Ablauf fortsetzen und warten nun darauf, dass ihnen die CPU wieder zugeteilt wird. Auch wenn ein neuer Prozess erzeugt wird, tritt dieser zunächst in den Zustand bereit ein. Blockiert (engl. blocked): Prozesse im Zustand blockiert warten auf bestimmte Ereignisse, die für den weiteren Prozessablauf notwendig sind. Beispielsweise sind E/A-Geräte im Vergleich zur CPU nur sehr langsam arbeitende Komponenten; hat ein Prozess das Betriebssystem mit einer E/A-Geräte-Kommunikation beauftragt, so muss er warten, bis das Betriebssystem diese abgeschlossen hat. Beendet (engl. terminated): Der Prozess hat seine Ausführung beendet, das Betriebssystem muss noch „aufräumen“.
Dies lässt sich als Zustandsautomat eines Prozesses mit vier Zuständen modellieren:
500px