# Mehrprozessorsystem

Mehrprozessorsysteme (auch: Multiprozessorsysteme) sind Computer, die zwei oder mehr Prozessoren haben. Sie werden meist als Server oder Hochleistungs-Arbeitsplatzrechner genutzt. Die einzelnen Aufgaben (die Prozesse) werden dann vom Betriebssystem je nach Bedarf den einzelnen Prozessorkernen zugeteilt.
Nach der Flynnschen Klassifikation fallen Mehrprozessorsysteme in die Klasse der eng gekoppelten MIMD-Systeme (MIMD = Multiple Instruction, Multiple Data). Bei dieser verfügen die verschiedenen Prozessoren über einen gemeinsamen Speicher.
In wissenschaftlichen Einrichtungen, in denen große Rechenleistungen benötigt werden, werden auch oft mehrere Rechner zu einem Rechnerverbund zusammengeschlossen, um einen ähnlichen Effekt zu erzielen. Dann spricht man von lose gekoppelten MIMD-Systemen. Oft hat allerdings jeder einzelne Rechner in einem solchen Cluster selbst noch mehrere Prozessoren, ist also für sich genommen wieder ein eng-gekoppeltes MIMD-System.
Mehrprozessorsysteme sind heute sehr verbreitet. Da heute erhältliche x86-Prozessoren meist nicht mehr (wie bis ca. ins Jahr 2000) nur einen Rechenkern besitzen, sondern zumeist zwei oder mehr (Mehrkernprozessor), muss heute deutlicher unterschieden werden zwischen
* Mehrkernprozessor … ein Prozessor mit mehreren Kernen, und
* dem Mehrprozessorsystem im engeren Sinne … ein Computersystem, das mehr als einen Prozessorsockel auf der Multi-Prozessor-Hauptplatine besitzt, und in dem mehr als einer dieser Sockel auch bestückt ist.

## Speicheranbindung

Mitunter sollte das Betriebssystem die Prozesse an einen bestimmten Prozessor vergeben, je nach Art der Speicheranbindung:
* Mit Uniform Memory Access (UMA) wird bezeichnet, wenn alle Prozessoren der Multi-Prozessor-Hauptplatine auf allen dort vorhandenen Arbeitsspeicher „gleichwertig“ zugreifen können.
* Das Gegenkonzept wird Non-Uniform Memory Access (NUMA) genannt. Hierbei besitzt jeder Prozessor „seinen“ Arbeitsspeicher; will ein anderer Prozessor darauf zugreifen, so muss er diesen Zugriff über jenen Arbeitsspeicher-Verwalter anfragen (siehe MESI- und MOESI-Protokoll).
Bei heute verbreitetem NUMA-Aufbau muss das Betriebssystem somit darauf achten, dass Prozesse, die (virtuellen) Arbeitsspeicher anfordern, diesen in jenem realen RAM erhalten, das zu „ihrem“ Prozessor gehört. Umgekehrt muss das Betriebssystem darauf achten, dass ein inaktiver, zur Ausführung bereitstehender Prozess möglichst einem Prozessorkern desjenigen Prozessors zugeteilt wird, in dessen Ram der Prozess liegt.

## Multiprocessing

Der Begriff „Multiprocessing“ bezeichnet die Fähigkeit eines Computers, mehr als einen Handlungsstrang (sogenannter Thread) echt-gleichzeitig zu verarbeiten. In diesem Zusammenhang ist der Begriff des „Multiprocessings“ also aus „Multi“ (mehrere) und „Prozesse“ entstanden. Meist können diese Handlungsstränge auch voneinander abgeschottet verarbeitet werden. Eine Gruppe von Threads, die von allen anderen Threads, jedoch nicht voneinander, abgeschirmt sind (somit „zusammengehörend“), ist ein sogenannter Prozess, oft auch Task genannt.
Für Multiprocessing sind mehrere (mind. zwei), weitgehend unabhängige Prozessorkerne notwendig. Ein Mehrprozessorsystem ist daher immer Multiprocessing-fähig.
Heutzutage wird statt des Begriffs Multiprocessing oft auch der Begriff Multitasking verwendet, der historisch jedoch das Aufteilen nur eines Rechenkerns z. B. im Zeitscheibenverfahren auf mehrere Aufgaben beschreibt. Anstatt mehrere Prozesse echt-gleichzeitig zu verarbeiten, wird also zu jedem Zeitpunkt nur genau ein Prozess verarbeitet; der schnelle Wechsel zwischen mehreren Prozessen (mittels kurzer Zeitscheiben) erscheint dem Benutzer, als würden die Prozesse „gleichzeitig“ verarbeitet.
In modernen Computersystemen werden heutzutage beide Verfahren gleichzeitig eingesetzt: Es sind mehrere Prozessorkerne vorhanden, die echt-gleichzeitig Threads ausführen können (voneinander abgeschottete oder im selben Kontext laufend) – zusätzlich werden jedem Prozessorkern für sich nochmals im Zeitscheibenverfahren Threads oder Prozesse zugeteilt.
Mitunter wird auch von hardwareseitigem Multithreading gesprochen, im Gegensatz zum softwareseitigen Multithreading, bei dem sämtliche Aufteilung der Rechenzeit seitens des Anwendungsprogramms programmiert ist – aus Sicht des Prozessors ist es nur genau ein Thread/Prozess.