Der englische Begriff Shared Memory bedeutet übersetzt Gemeinsam genutzer Speicher. Mehrere Prozesse sollen also vom Betriebssystem die Möglichkeit zur Verfügung gestellt bekommen, dass bestimmte Speicherbereiche gemeinsam genutzt werden können.
Wer sich noch an das Kapitel Limitregister zum Speicherschutz erinnert, dem ist sicher auch noch bewußt, dass die Nutzung eines Speicherbereichs durch mehrere Prozesse eigentlich gar nicht erwünscht war, und unbedingt unterbunden werden sollte. (Was durch den Einsatz des Limitregisters ja auch realisiert wurde.)
Wenn also Shared Memory jetzt als Betriebssystemkonzept eingeführt wird, dann muss es dafür gute Gründe geben.
Ein Grund ist bereits im Kapitel Interprozesskommunikation angeklungen: Der Austausch von Informationen zwischen verschiedenen Prozessen. Etwas weiter unten in diesem Abschnitt wird dieses nochmals aufgegriffen.
Es gibt jedoch noch einen weiteren sehr guten Grund, der für den Einsatz von gemeinsam genutztem Speicher spricht:
Der (physikalische) Arbeitsspeicher ist seit jeher eine knappe Ressource. Wenn es also Möglichkeiten gibt, durch geschickte Ausnutzung von Dingen, die sowieso vorhanden sind, "gefühlt mehr RAM" zur Verfügung zu haben, dann macht es Sinn, diese Möglichkeiten auch zu nutzen.
Ein Beispiel aus der Praxis:
Wenn ein Programm gestartet, und dadurch zum Prozess wird, dann muss sein ausführbarer Maschinencode (der Programmtext) im (physikalischen) Speicher zur Verfügung stehen, damit er auf der CPU ausgeführt werden kann. (Durch die virtuelle Speicherverwaltung reicht es bekanntlich, dass nur ein Teil des Programmtextes eingelagert ist.)
Was passiert nun, wenn das gleiche Programm mehrmals gestartet wird?
Dann resultieren daraus auch mehrere Prozesse.
Wenn jetzt für jeden Prozess immer der gleiche Programmtext in unterschiedliche Bereiche des Hauptspeichers eingelagert werden müsste, so ergäbe sich eine Redundanz, die letztlich einer vermeidbaren Speicherverschwendung entspricht.
Windows-User kennen vielleicht DLL-Dateien (Dynamic Link Libraries). Unter Unix/Linux gibt es etwas Gleichwertiges mit den sogenannten Shared Libraries.
In beiden Fällen enthalten diese Dateien ausführbaren Code, der von vielen Prozessen genutzt wird. Wenn dieser Code nur einmal im Hauptspeicher vorgehalten werden muss, dann wird eine signifikante Einsparung von benutztem Hauptspeicher erzielt.
Dabei ist die Umsetzung des Shared Memory Konzepts ganz einfach:
Man nehme die virtuelle Speicherverwaltung mit ihren Seitentabellen. Das Betriebssystem kann dann für eine beliebige Anzahl (mindestens zwei) an Prozessen das Shared Memory Konzept durch geschickte Einträge in den Seitentabellen der beteiligten Prozesse realisieren.
Der gemeinsam genutzte Speicher entspricht dann einem bestimmten Seitenrahmen des physikalischen Speichers. Hier könnten beispielsweise DLL-Dateien oder Shared Libraries eingelagert sein.
Dieser eine Seitenrahmen kann nun sehr einfach in alle virtuellen Adressräume der beteiligten Prozesse eingebunden werden. Nötig ist dazu allein ein entsprechender Eintrag in allen betreffenden Seitentabellen.
Bedenke: Jeder Prozess besitzt seinen eigenen virtuellen Speicher und damit auch seine eigene Seitentabelle!
Wie einfach die Realisierung von Shared Memory tatsächlich ist, wird durch die folgende Aufgabe klar:
Fertige eine Skizze an.
Anhand der Skizze sollst du für zwei Prozesse mit ihren Seitentabellen erklären, wie ein physikalischer Seitenrahmen in den jeweiligen virtuellen Adressraum der beiden Prozesse eingebunden wird.
Warum eine Skizze? Weil ein Bild immer mehr sagt, als 1.000 Worte.
Erläutere deine Skizze!
Aber denke daran: Du brauchst keine 1.000 Worte mehr...
Was denkst du:
Können durch den Einsatz von Shared Memory Seitenfehler (Page faults) vermieden werden?
Erläutere deine Meinung!
Bislang wurde in diesem Abschnitt davon ausgegangen, dass Programmtext in den gemeinsam genutzten Speicher eingelagert ist. Da Programmtext für alle Prozesse "read only" ist, sich insbesondere also zur Laufzeit nicht verändert, ist das unkritisch.
Man kann dieses Konzept aber auch auf gemeinsam genutze Datenbereiche anwenden.
Erläutere was passieren kann, wenn Shared Memory auf einen gemeinsam genutzten Datenbereich angewendet wird. Der Datenbereich darf dabei von allen beteiligten Prozessen ausgelesen und beschrieben (read/write) werden.
Welche bereits bekannten Mechanismen helfen dabei Probleme zu vermeiden?
Gib mindestens ein Praxisbeispiel an, bei dem mehrere Prozesse auf einen gemeinsamen Datenbereich zugreifen.
Diese Seite steht unter der Creative Commons Namensnennung 3.0 Unported Lizenz http://i.creativecommons.org/l/by/3.0/80x15.png