Nehmen wir an, ich tippe cd
meine Shell ein. Wird 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 (drücken Sie die Eingabetaste auf einer Shell). Könnten Sie mir bitte sagen, ob es eine Referenz gibt, die dies erklärt?
shell-builtin
Vordenker
quelle
quelle
Antworten:
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 einebash
Instanz bezieht :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 .
quelle
Während ich darauf warte, dass eines der Schwergewichte kommt und eine vollständige historische Perspektive bietet, gebe ich Ihnen mein begrenzteres Verständnis.
Built-in - Befehle wie
alias
,cd
,echo
usw. Teil Ihrer Schale ist (bash
,zsh
,ksh
oder was auch immer). Sie werden zur gleichen Zeit geladen, zu der sich die Shell befindet, und sind einfach interne Funktionen dieser Shell.quelle
Ich habe das folgende Experiment durchgeführt, um zu zeigen, dass die eingebauten Befehle tatsächlich als Teil des exectuable geladen werden
bash
. Daher werden sie Builtins genannt, aber eine Demo ist immer der beste Weg, um etwas zu beweisen.Beispiel
Starten Sie eine neue
bash
Shell und notieren Sie sich deren Prozess-ID (PID):Führen Sie in einem zweiten Terminal den
ps
Befehl aus, damit wir beobachten können, obbash
zusätzlicher Speicher belegt wird:Die Ausgabe sieht folgendermaßen aus:
HINWEIS: Die Speichernutzung wird hier in den SZ- und RSS-Spalten angezeigt.
Starten Sie die Ausführung von Befehlen in der Shell (pid 6402):
Wenn Sie sich in der
cd
Nähe befinden, werden Sie feststellen, dass der Speicher tatsächlich hoch ist. Dies liegt jedoch nicht daran, dass die ausführbare Dateicd
in den Speicher geladen wird, sondern daran, dass die Verzeichnisstruktur auf der Festplatte in den Speicher geladen wird. Wenn Sie weiterhincd
in andere Verzeichnisse wechseln, werden Sie feststellen, dass diese schrittweise weiter steigen.Sie können ausführlichere Tests wie diesen durchführen:
Dieser Befehl wird eine Ebene höher und dann 1000 Mal wieder in das Verzeichnis 90609 verschoben. Wenn Sie dies ausführen und die Speichernutzung im
ps
Fenster überwachen, werden Sie feststellen, dass sich dies nicht ändert. Während Sie so etwas ausführen, sollte keine zusätzliche Speichernutzung bemerkt werden.strace
Hier ist ein weiterer Hinweis, dass es sich eher um eine integrierte Funktion
bash
als um eine tatsächliche ausführbare Datei handelt. Wenn Sie versuchen, es auszuführenstrace cd ..
, wird die folgende Meldung angezeigt:quelle
"Eingebauter Befehl" bezieht sich auf Befehle, die in die Shell eingebaut sind, und nicht auf separate Programme.
ls
Beispielsweise handelt es sich nicht um einen integrierten Befehl, sondern um ein separates Programm. Es wird beim Aufrufen in den RAM geladen, es sei denn, es befindet sich bereits im Festplatten-Cache.Ein Beispiel für einen integrierten Befehl wäre
printf
odercd
. Diese sind Teil der Shell und werden zusammen mit dem Rest der Shell geladen.Standardmäßig sind keine Befehle vorinstalliert, obwohl dafür Systeme erstellt wurden.
quelle