Nehmen wir an, ich tippe eine CD in meine Shell ein. Wird die CD in diesem Moment aus dem Speicher geladen? Meine Intuition ist, dass diese integrierten Befehle nach dem Laden des Kernels in den Systemspeicher vorinstalliert werden, aber jemand bestand darauf, dass sie nur geladen werden, wenn ich den Befehl tatsächlich aufrufe ...
Im Großen und Ganzen sind die anderen Antworten richtig - die integrierten Funktionen werden mit der Shell geladen, die Standalone-Dateien werden beim Aufrufen geladen. Ein sehr klebriger wieselhafter "Jemand" könnte jedoch darauf bestehen, dass es nicht so einfach ist.
In dieser Diskussion geht es etwas darum, wie das Betriebssystem funktioniert und wie verschiedene Betriebssysteme auf unterschiedliche Weise funktionieren, aber ich denke, im Allgemeinen gilt das Folgende wahrscheinlich für alle zeitgenössischen Nixe.
Erstens ist "in den Speicher geladen" eine mehrdeutige Phrase; Wir beziehen uns wirklich darauf, dass der virtuelle Adressraum im Speicher abgebildet ist . Dies ist insofern von Bedeutung, als sich "virtueller Adressraum" auf Dinge bezieht, die möglicherweise in den Speicher gestellt werden müssen, dies jedoch zunächst nicht ist: Meistens wird tatsächlich die Karte selbst in den Speicher geladen - und die Karte ist nicht das Gebiet. Das "Gebiet" wäre die ausführbare Datei auf der Festplatte (oder im Festplatten-Cache), und tatsächlich wird das meiste davon wahrscheinlich nicht in den Speicher geladen, wenn Sie eine ausführbare Datei aufrufen.
Außerdem besteht ein Großteil des "Territoriums" aus Verweisen auf andere Territorien (gemeinsam genutzte Bibliotheken), und nur weil sie erwähnt wurden, bedeutet dies nicht, dass sie auch wirklich geladen sind. Sie werden erst geladen, wenn sie tatsächlich verwendet werden, und dann nur die Teile von ihnen, die tatsächlich geladen werden müssen, damit die "Verwendung" erfolgreich ist.
Hier ist zum Beispiel ein Ausschnitt der top
Ausgabe unter Linux, der sich auf eine bash
Instanz bezieht :
VIRT RES SHR S %CPU %MEM TIME+ COMMAND
113m 3672 1796 S 0.0 0.1 0:00.07 bash
Das 113 MB VIRT ist der virtuelle Adressraum, das ist abgebildet in RAM. RES ist jedoch die tatsächliche Menge an RAM, die vom Prozess verbraucht wird - nur 3,7 kB. Und davon gehört ein Teil des oben genannten gemeinsamen Gebiets - 1,8 kB SHR. Aber meine /bin/bash
Festplatte ist 930 kB groß und die Basisbibliothek, mit der sie verknüpft ist (eine gemeinsam genutzte Bibliothek), ist wieder doppelt so groß.
Diese Shell macht gerade nichts. Angenommen, ich rufe einen integrierten Befehl auf, von dem wir bereits gesagt haben, dass er zusammen mit dem Rest der Shell bereits "in den Speicher geladen" wurde. Der Kernel führt den Code ab, der an einem Punkt in der Karte beteiligt ist, und wenn er einen Verweis auf Code erreicht, der nicht wirklich geladen wurde, lädt er ihn - von einem ausführbaren Image auf der Festplatte -, obwohl er eher ungezwungen ist Diese ausführbare Datei (sei es die Shell, ein eigenständiges Tool oder eine gemeinsam genutzte Bibliothek) wurde bereits "in den Speicher geladen".
Dies wird als Demand Paging bezeichnet .