Wann werden die integrierten Befehle in den Speicher geladen?


11

Nehmen wir an, ich tippe cdmeine Shell ein. Wird cdin 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?


1
Ich denke, diese Antwort würde Ihnen helfen zu verstehen, obwohl es kein Duplikat ist.
cjm

@cjm: Danke, es war in der Tat eine gute Erklärung zum Lesen.
Forethinker

Antworten:


9

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 topAusgabe unter Linux, der sich auf eine bashInstanz 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/bashFestplatte 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 .


9

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, echousw. Teil Ihrer Schale ist ( bash, zsh, kshoder was auch immer). Sie werden zur gleichen Zeit geladen, zu der sich die Shell befindet, und sind einfach interne Funktionen dieser Shell.


4

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

  1. Starten Sie eine neue bashShell und notieren Sie sich deren Prozess-ID (PID):

    $ bash
    $ echo $$
    6402
    
  2. Führen Sie in einem zweiten Terminal den psBefehl aus, damit wir beobachten können, ob bashzusätzlicher Speicher belegt wird:

    $ watch "ps -Fp 6402"
    

    Die Ausgabe sieht folgendermaßen aus:

    Every 2.0s: ps -Fp 6402                        Sat Sep 14 14:40:49 2013
    
    UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
    saml      6402  6349  0 28747  6380   1 14:33 pts/38   00:00:00 bash
    

    HINWEIS: Die Speichernutzung wird hier in den SZ- und RSS-Spalten angezeigt.

  3. Starten Sie die Ausführung von Befehlen in der Shell (pid 6402):

    Wenn Sie sich in der cdNähe befinden, werden Sie feststellen, dass der Speicher tatsächlich hoch ist. Dies liegt jedoch nicht daran, dass die ausführbare Datei cdin den Speicher geladen wird, sondern daran, dass die Verzeichnisstruktur auf der Festplatte in den Speicher geladen wird. Wenn Sie weiterhin cdin andere Verzeichnisse wechseln, werden Sie feststellen, dass diese schrittweise weiter steigen.

    Every 2.0s: ps -Fp 30208                        Sat Sep 14 15:11:22 2013
    
    UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
    saml     30208  6349  0 28780  6492   0 15:09 pts/38   00:00:00 bash
    

    Sie können ausführlichere Tests wie diesen durchführen:

    $ for i in `seq 1000`; do cd ..; cd 90609;done
    

    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 psFenster überwachen, werden Sie feststellen, dass sich dies nicht ändert. Während Sie so etwas ausführen, sollte keine zusätzliche Speichernutzung bemerkt werden.

  4. strace

    Hier ist ein weiterer Hinweis, dass es sich eher um eine integrierte Funktion bashals um eine tatsächliche ausführbare Datei handelt. Wenn Sie versuchen, es auszuführen strace cd .., wird die folgende Meldung angezeigt:

    $ strace cd ..
    strace: cd: command not found
    

3

"Eingebauter Befehl" bezieht sich auf Befehle, die in die Shell eingebaut sind, und nicht auf separate Programme. lsBeispielsweise 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 printfoder cd. 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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.