2010-12-11 3 views

Antwort

4

Der Code für die gemeinsam genutzte Bibliothek wird vom Betriebssystem in den Speicher kopiert (oder genauer zugeordnet).

Dann gibt das Betriebssystem jedem der Prozesse Zugriff auf diese eine Kopie im Speicher.

Es ist möglich, dass jeder der Prozesse die Kopie als an einer anderen Speicheradresse als die andere "sehen" wird. Dies wird durch die Speicherverwaltungseinheit der CPU gelöst.

Es kann als dies komplizierter, aber das ist im Grunde, wie die Dinge in Linux arbeiten und anderen Unix-bezogenen Betriebssystemen wie Mac OS X.

29

Auf Unix-basierte Systemen (einschließlich Linux) kann die code segment (.text) sein unter mehreren Prozessen geteilt, weil es unveränderlich ist. Überlappst du diese Überschneidung?

Grundsätzlich hat jede gemeinsam genutzte Bibliothek, die statische Daten enthält (z. B. globale Variablen), eine Global Offset Table (GOT). In Shared Libraries erfolgen alle Verweise auf statische Daten (denken Sie an globale vars) über GOT (sie sind indirekt). Also auch wenn das Code-Segment zwischen mehreren Prozessen gemeinsam genutzt wird, hat jeder Prozess seine exklusive Zuordnung von anderen Segmenten der gemeinsam benutzten Bibliothek, einschließlich dem jeweiligen GOT, deren Einträge werden entsprechend verlegt.

Kurz gesagt, nur Code ist unter den Prozessen, nicht Daten geteilt. Ich denke jedoch, dass Konstanten abhängig von Kompilierungsflags eine Ausnahme darstellen können.

Ich empfehle auch den folgenden Artikel: Dynamic Linking and Loading.

+4

Um diesen Punkt zu betonen, ein Unixy System kann entweder Aktien oder nicht die dynamische Bibliothek teilen, aber vom Standpunkt der Anwendung aus gesehen, gibt es * keine offensichtlichen Unterschiede * zwischen beiden Implementierungen. Fast alle Unix-ähnlichen Systeme teilen den Code zwischen Prozessen, weil es einfach zu machen ist und eine großartige Möglichkeit bietet, RAM praktisch ohne Kosten zu sparen. Die seltenen Ausnahmen sind paranoide Betriebssysteme auf Hardware mit schwacher (oder keiner) MMU, so dass ein gemeinsamer "Text" es einem Prozess ermöglichen könnte, einen anderen zu beschädigen. – SingleNegationElimination

Verwandte Themen