Es gibt eine große und wachsende Zahl von Systemen, bei denen ein extremes Maß an statischer Verknüpfung enorme positive Auswirkungen auf Anwendungen und Systemleistung haben kann.
Ich beziehe mich auf die so genannten "eingebetteten Systeme", von denen viele jetzt zunehmend Allzweck-Betriebssysteme verwenden, und diese Systeme werden für alles Erdenkliche eingesetzt.
Ein sehr häufiges Beispiel sind Geräte, die GNU/Linux-Systeme mit Busybox . Ich habe das auf die Spitze getrieben mit NetBSD indem ein bootfähiges i386 (32-Bit)-Systemabbild erstellt wird, das sowohl einen Kernel als auch sein Root-Dateisystem enthält, wobei letzteres ein einzelnes statisch verlinktes (durch crunchgen
) Binärdatei mit harten Links zu allen Programmen, die ihrerseits Folgendes enthält todo (bei der letzten Zählung 274) der standardmäßigen Systemprogramme mit vollem Funktionsumfang (die meisten außer der Toolchain), und es sind weniger als 20 mega Bytes groß (und läuft wahrscheinlich sehr bequem auf einem System mit nur 64MB Speicher (sogar mit dem Root-Dateisystem unkomprimiert und komplett im RAM), obwohl ich nicht in der Lage war, ein so kleines System zu finden, um es zu testen).
In früheren Beiträgen wurde bereits erwähnt, dass die Startzeit einer statisch verknüpften Binärdatei schneller ist (und es kann eine Los schneller), aber das ist nur ein Teil des Bildes, vor allem, wenn der gesamte Objektcode in dieselbe Datei gelinkt wird, und noch mehr, wenn das Betriebssystem die Auslagerung von Code direkt aus der ausführbaren Datei unterstützt. In diesem idealen Szenario ist die Startzeit von Programmen buchstäblich vernachlässigbar, da sich fast alle Codeseiten bereits im Speicher befinden und von der Shell verwendet werden (und und und init
alle anderen Hintergrundprozesse, die möglicherweise laufen), selbst wenn das angeforderte Programm seit dem Booten noch nie ausgeführt wurde, da vielleicht nur eine Seite des Speichers geladen werden muss, um die Laufzeitanforderungen des Programms zu erfüllen.
Doch das ist noch nicht alles. Ich baue und verwende normalerweise auch die NetBSD-Betriebssysteminstallationen für meine vollständigen Entwicklungssysteme, indem ich alle Binärdateien statisch verlinkt habe. Obwohl dies eine enorme Menge an Festplattenspeicher benötigt (~6,6 GB insgesamt für x86_64 mit allem, einschließlich Toolchain und X11 statisch verlinkt) (vor allem, wenn man volle Debug-Symboltabellen für alle Programme zur Verfügung hält, weitere ~2,5 GB), läuft das Ergebnis insgesamt schneller und verbraucht für einige Aufgaben sogar weniger Speicher als ein typisches dynamisch verlinktes System, das vorgibt, Bibliotheksseiten zu teilen. Festplatten sind billig (sogar schnelle Festplatten), und Speicher zum Zwischenspeichern häufig verwendeter Festplattendateien ist ebenfalls relativ billig, aber CPU-Zyklen sind es wirklich nicht, und die Zahlung der ld.so
Anlaufkosten für jeden Prozess, der gestartet wird jede Die Zeit, die für das Starten eines Programms benötigt wird, nimmt stundenlang CPU-Zyklen von Aufgaben weg, die das Starten vieler Prozesse erfordern, insbesondere wenn dieselben Programme immer wieder verwendet werden, wie z.B. Compiler auf einem Entwicklungssystem. Statisch verknüpfte Toolchain-Programme können die Gesamt-OS-Multi-Architektur-Build-Zeiten für meine Systeme wie folgt reduzieren Stunden . Ich muss die Toolchain noch in meine Single einbauen. crunchgen
Aber ich vermute, wenn ich das tue, wird es mehr Stunden an Bauzeit sparen, weil ich den CPU-Cache gewonnen habe.