Diskussion:Static (Schlüsselwort)
static und Prozess
[Quelltext bearbeiten]Eine statische Variable gehört zu einem Prozess. In Windows-Worten: Läuft ein Programm (typischerseise eine EXE) in 2 Instanzen, gibt es auch diese statische Variable zweimal (auf diesem Windows-PC), während der Maschinencode nur 1x im Speicher geladen steht. Der Task-Umschalter tauscht die darunter liegende Seite beim Kontextwechsel aus, daher dürfen die beiden Variablen die gleiche Adresse haben.
Ein Gegenbeispiel wäre Thread Local Storage (TLS); eine solche Variable gehört zu einem Thread. Da ein Prozess mindestens einen Thread haben muss, gibt es mindestens eine Variable pro Prozess. Derartige Variablen werden vom Linker so platziert, dass die darunter liegende Seite bei Threadumschaltung ausgetauscht wird (wie die am Stack beteiligten Seiten, falls so implementiert).
In der anderen Richtung gibt es „shared“-Variablen (sorry für das schlechte Deutsch), die prozessübergreifend sind: Läuft ein Programm in 2 Instanzen, gibt es die Variable nur einmal. Mit Windows-Compilern wird das in der Regel per #pragma gelöst:
#pragma bss_seg(".shared") DWORD sharedvar; #pragma bss_seg()
sowie einer Linker-Einstellung, die der betreffenden Speicherseite das Attribut "read+write+shared" verpasst. Eine solche Speicherseite wird dann nicht beim Kontextwechsel umgeschaltet; genauso wie die Seiten mit dem Maschinencode (Attribut zumeist "exec+read+shared"). Grundsätzlich werden damit Probleme der Interprozesskommunikation gelöst; allerdings nur zwischen gleichnamigen Prozessen (in Windows: Dieselbe EXE-Datei). Benötigt wird so etwas für die Implementierung von Hooks sowie für die Nachbildung gewisser Eigenheiten von 16-bit-Windows, etwa dem MDI.
Alle diese 3 Arten von statischen Variablen werden vom Betriebssystem bereitgestellt und per Konvention mit Null initialisiert.
Automatische (Stack-)Variablen sind zur Genüge erläutert. Sie kommen nicht vom Betriebssystem und sind daher zufällig gefüllt. Debug-Schalter von Compilern „initialisieren“ solche Variablen gern mit Stuss, etwa 0xBAADF00D („schleechtes Futter“) oder 0xDEADBEEF („totes Rindfleisch“). Da der Stack zum Thread gehört, sind solche Variablen auch thread-lokal.
Heap-Speicher kommt je nach Implementierung vom Betriebssystem oder von der Laufzeitumgebung. Moderne Betriebssysteme stellen Speicher grundsätzlich mit Null gefüllt zur Verfügung, um zu verhindern, dass Müll im Freispeicher von anderen Prozessen durchkommt, etwa Passwörter.