dll Library



  • Hallo,

    sagen wir ich benutze ich 2 verschiedenen Programmen die gleiche dll.

    Woher weiss das Betriebssystem jetzt dass diese dll schon im Speicher ist wenn ich das 2.Programm starte ? Hat es eine Tabelle wo das drinsteht oder wie funktioniert das ? Eine .dll wird doch immer nur einmal geladen? Oder heisst dll nur dass sie dazu gelinkt wird ?



  • Wer sagt das sie nur einmal geladen wird?
    Wikipedia : DLL-Konflikt



  • @suchenmachtschlau
    Die Formulierung "wird nur 1x geladen" ist zwar ungenau, beschreibt aber das Wesentliche ganz gut. Was der Begriff "DLL-Konflikt" damit zu tun haben soll verstehe ich nicht ganz. Wenn man voraussetzt dass DLL Files mit identischem Namen in unterschiedlichen Verzeichnissen auf jeden Fall unterschiedliche DLLs sind (auch wenn ihr Inhalt gleich sein sollte), dann machen eventuelle "DLL-Konflikte" da keinen Unterschied. Also bezüglich der Frage wie oft eine DLL geladen wird.

    @Peter_Mueller
    Das OS kann Files von der Disk in den Speicher von Prozessen einblenden. Das nennt man Memory Mapping bzw. Memory Mapped Files.
    Dabei ist das OS schlau genug das File nur 1x zu laden, auch wenn es von mehreren Prozessen (u.U. sogar an verschiedenen Adressen) eingeblendet wird. Bzw. sogar noch eine Stufe schlauer: es werden nur die Bereiche des Files geladen auf die irgendwann mal zugegriffen wurde.
    Bei DLLs wird eine spezielle Variante dieser Technik verwendet, wobei die in dieProzesse eingeblendeten Abbilder der DLL so markiert werden, dass bei Änderungen in diesen Speicherbereichen automatisch eine priavte Kopie für diesen Prozess erstellt wird. Dadurch kann jeder Prozess Änderungen in der eingeblendeten DLL machen, ohne dass diese Änderungen für andere Prozesse sichtbar würden oder gar auf die Disk zurückgeschrieben.
    (Und solche Änderungen zu machen ist oft nötig. Welche Änderungen das sind und warum die nötig sind würde hier aber etwas den Rahmen sprengen.)

    BTW: Genau der selbe Mechanismus wird auch zum Laden von .EXE Files verwendet. D.h. wenn du 2x gleichzeitig die selbe .exe ausführst, dann lädt das OS die auch bloss 1x.

    Wenn dich das genauer interessiert, dann such mal nach Begriffen wie z.B. Virtual Memory, Memory Mapped Files, Portable Executable oder Relocation Table.

    Bei .NET DLLs läuft aber vermutlich alles etwas anders, denn .NET DLLs enthalten kaum direkt ausführbaren Code sondern CIL Code. Dieser muss erstmal von einem JIT Compiler in direkt ausführbaren Code übersetzt werden. Wie das genau läuft und welche Optimierungen es dabei gibt oder nicht gibt, das müsstest du einen .NET Experten fragen.


Log in to reply