next up previous contents
Next: Zusammenfassung Up: Das Speichermodell Previous: Speichermodell und Synchronisierung   Inhalt

Das Speichermodell einer Hochsprache

Das Speichermodell ist keinesfalls nur ein hardwarenahes Artefakt der Systemarchitektur, von dem eine Hochsprache abstrahieren kann. Um Objektmanipulationen möglichst einfach und effizient auf Speicheroperationen abzubilden, muß ein weniger intuitives Speichermodell auch in der Hochsprache in Kauf genommen werden. Dieses Modell ist in der Sprachdefinition zu verankern. Durch das Speichermodell eröffnen sich für den Compiler zusätzliche Optimierungsmöglichkeiten. Dieser kann dem Modell genügende Umordnungen vornehmen und infolge dessen z.B. redundante Speicherzugriffe eliminieren.

Die Speicheroperationen objektorientierter Sprachen sind Sondierung und Veränderung von Objektzuständen. Es gilt also zu definieren, welche Transitionen des Objektzustands von anderen Threads beobachtet werden können und wie diese zu beeinflussen sind.

Die Java Sprachdefinition [Gosling et al., 1996] formuliert daher in Textform ein Speichermodell für Java in den Begriffen Objektfeld, Array, Thread und Monitor, welches von der virtuellen Maschine entsprechend implementiert werden muß. In diesem Modell werden eine Reihe von Operationen auf dem globalen Speicher und einem thread-lokalen Arbeitsspeicher sowie die notwendigen Ordnungskriterien auf ihnen definiert. Das Java Speichermodell berücksichtigt also die Speicherhierarchie und sieht die Umordnung von Speicheroperationen vor. Trotzdem hat es sich in seiner jetzigen Form als unvollständig, schwer verständlich und nicht effizient implementierbar erwiesen. Insbesondere widerspricht es einigen gängigen Compileroptimierungen -- und wird in diesen Punkten von den meisten optimierenden dynamischen Compilern verletzt. Als Reaktion wird das Speichermodell daher zur Zeit revidiert. Beispiele und Erläuterungen zu dieser Problematik finden sich in [Pugh, 2000b].

Synchronisierungsoperationen stehen in dem Ruf, ineffizient zu sein. Als Folge existieren in der Literatur eine Zahl von Idiomen, die vor allem auf die Vermeidung solcher Synchronisierungsoperationen hinzielen, z.B. für ,,konstante`` Objekte oder Einmal-Initialisierungen. Da auf diese Weise die impliziten memory barriers entfallen, sind weitreichende Optimierungen auf diesen Konstrukten möglich. Es zeigt sich, daß die meisten dieser Idiome in Unkenntnis oder unter Mißachtung des Speichermodells formuliert sind und daher auf aggressiven Implementierungen nicht funktionieren werden. [Pugh, 2000a] analysiert ``Double-Checked Locking``, ein sehr weit verbreitetes und ebenfalls nicht sicheres Idiom.


next up previous contents
Next: Zusammenfassung Up: Das Speichermodell Previous: Speichermodell und Synchronisierung   Inhalt

2001-02-28