Hallo winter,
daraus und aus dem vorhergehenden Beitrag schließe ich mal,
daß das also nicht auf Ebene des Betriebssystems ‚gemanagt‘
wird. Als Anwendungsprogrammierer kann ich solche Probleme
aber nur bei EIGENEN Threads verhindern, mit entsprechender
Synchronisation. Ich weiß ja nichts von anderen Programmen,
die gerade laufen!
Somit erzeugst du aber auch keine Deadlocks.
Race-Problme löst das BS z.B. beim Drucker, mit einer Queue.
Gut, vielleicht tritt das Problem in der Praxis so gar nicht
auf. Es schreibt ja niemand in absolute Hauptspeicheradressen,
und auch Dateien gleichen Namens auf der Festplatte wird kaum
jemand erzeugen,
temporäre Datein lässt man sich vom BS zuteilen, die müssen ja auch nur maschinenlesbar sein. Als geschikter Programmierer schreibt man seine Dateien am einfachsten in ein eigenes Verzeichnis, dann entstehen dabei auch keine Konflikte.
und auch die anderen vorhandenen Ressourcen
werden kaum in Abhängigkeit voneinander, dazu noch von
unterschiedlichen Programmen zur gleichen Zeit, benutzt
werden.
Doch, der Speicher !!
Besonders zu Zeiten von Win 3.x und Win 95 gab es da „lustige“ Probleme.
Eine DLL besteht aus drei Teilen:
- Einer Initialisierungs-Funtion, welche einmal nach dem Laden aufgerufen wird.
- Den eigentlichen Funktionen.
- aus eine DeInitialisierungsfunktion, welche direkt vor dem entladen aufgerufen wird und unter anderem der bei der Initializierun angeforderten Speicher wieder gesittet freigibt.
Hinzu kommt noch, dass es ein Segment Attribut gibt, welches dem BS gestattet, oder verbietet, Teile der DLL aus dem Speicher zu schmeissen.
Die meisten Programmierer haben diese Konzept irgendwie nicht begriffen und die 3. Funktion war auf „auslagern erlaubt“ eigestellt.
Hat nun irgendein Programm, den gesammten Speicher „aufgebraucht“, irgendwann ist auch einmal der virtuelle Speicher auf der Festplatte „aufgebraucht“ und das Programm versucht einfach in einer Schleife Speicher zu ergattern, steht das System, wenn nicht irgendein Programm Speicher freigibt.
Du hast also eine klassische Deadlock-Situation.
Die einzige Möglichkeit wäre jetzt, irgendein laufendes Program zu beenden damit dies seinen Speicher freigibt. Dazu muss aber erst die DeInitialisierungs-Funktion der DLL aufgerufen werden, was, falls ausgelagert, aber nicht möglich ist, da ja der nötige Speicher fehlt.
…aber es gibt ja noch den Reset-Knopf …
Hier kann das Betriebssystem versuchen, einerseits diese DeInitialisierungs-Funktionen nicht auszulagern (zumindest der Eintrittspunkt ist ja bekannt) und/oder versuchen die DLLs nicht in der umgekehrten Ladereihenfolge zu beenden. Notfalls wird dann einfach ALLES freigegeben, was von dem entsprechenden Task alloziert wurde.
MfG Peter(TOO)