In Linux, Ich habe eine gemeinsame Bibliotheksdatei namens foo.so Wenn ich 2 verschiedene Prozess p1, p2, die beide foo.so. Wird dieses foo.so von diesen beiden Prozessen überlappt?Wie wird eine gemeinsam genutzte Bibliotheksdatei von zwei verschiedenen Prozessen in Linux aufgerufen?
Antwort
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.
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.
- 1. NodeJs gemeinsam genutzte Objekte zwischen Prozessen
- 2. Gemeinsam genutzte Vektoren in OpenMP
- 3. Linux, Mono, gemeinsam genutzte Bibliotheken und unaufgelöste Symbole
- 4. ALLGEMEINEN Block gemeinsam genutzte Variablen
- 5. Gemeinsam genutzte Einstellungen lesen
- 6. Wie Laufzeit gemeinsam genutzte Bibliotheken debuggen?
- 7. Gemeinsam genutzte Festplatten mit COMPS
- 8. Eine dynamisch verknüpfte gemeinsam genutzte Bibliothek erweitern?
- 9. Wie Sie eine gemeinsam genutzte Bibliothek in C++ einbinden? libORB_SLAM
- 10. Gemeinsam genutzte Bibliothek Name Kollisionen
- 11. Können dieselben DLL-Daten von zwei verschiedenen Prozessen gemeinsam genutzt werden?
- 12. speichern Hashzuordnung Gemeinsam genutzte Einstellungen
- 13. Linux: Wie können Versionsinformationen in eine gemeinsam genutzte Bibliothek und Binärdatei eingebettet werden?
- 14. Dilemma über gemeinsam genutzte Bibliotheken unter Unix
- 15. Gemeinsam genutzte Modellvariable in inkompatiblem Format
- 16. embedding absoluter Pfad für gemeinsam genutzte Bibliotheken
- 17. Gemeinsam genutzte Vektorvariablen unter mehreren C++ - Dateien
- 18. Gemeinsam genutzte Bibliothek für MonoDroid und MonoTouch
- 19. Wie ein Ereignis fd zwischen zwei Prozessen in Linux übergeben
- 20. Können konkurrierende Prozesse in eine gemeinsam genutzte Datenbank schreiben?
- 21. Android Speichern Gemeinsam genutzte Einstellungen Backup Agent
- 22. Wie gemeinsam genutzte Daten in Meteor cordova mobile app
- 23. Crystal Reports, Unterberichte, und gemeinsam genutzte Variablen
- 24. Android Studio, zum Einrichten von Projekten für gemeinsam genutzte Bibliotheken
- 25. Zugriff auf eine gemeinsam genutzte Ordner (die geschützt ist)
- 26. Android: makeSceneTransition für mehr als eine gemeinsam genutzte Elemente
- 27. Unter Linux, warum wird der Destruktor zweimal auf gemeinsam genutzte Instanz der globalen Variablen in C++ ausgeführt?
- 28. Wie wird der dynamische Linkerpfad für eine gemeinsam genutzte Bibliothek festgelegt?
- 29. Gemeinsam genutzte Bibliothek für verschiedene Versionen von Ubuntu verwalten
- 30. Logging von zwei gleichzeitigen Prozessen
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