Diciamo che se scrivo cd nella mia shell. Il cd è stato caricato dalla memoria in quel momento? La mia intuizione è che questi comandi integrati sono precaricati nella memoria di sistema dopo che il kernel è stato caricato, ma qualcuno ha insistito sul fatto che sono caricati solo quando invoco effettivamente il comando ...
In termini generali le altre risposte sono corrette: gli built-in vengono caricati con la shell, gli stand-alone vengono caricati quando vengono invocati. Tuttavia, un "qualcuno" molto appiccicoso potrebbe insistere sul fatto che non è così semplice.
Questa discussione riguarda in qualche modo il funzionamento del sistema operativo e i diversi sistemi operativi funzionano in modi diversi, ma penso che in generale quanto segue sia probabilmente vero per tutti i * nix contemporanei.
Innanzitutto, "caricato nella memoria" è una frase ambigua; veramente ciò a cui ci riferiamo è che il suo spazio di indirizzi virtuale è mappato nella memoria . Ciò è significativo perché "spazio di indirizzi virtuali" si riferisce a elementi che potrebbero dover essere inseriti in memoria, ma in realtà non lo è inizialmente: principalmente ciò che viene effettivamente caricato in memoria è la mappa stessa - e la mappa non è il territorio. Il "territorio" sarebbe l'eseguibile su disco (o nella cache del disco) e, in effetti, la maggior parte di ciò probabilmente non viene caricata in memoria quando si richiama un eseguibile.
Inoltre, gran parte del "territorio" fa riferimento ad altri territori (librerie condivise) e, di nuovo, solo perché sono stati indicati non significa che siano realmente caricati. Non vengono caricati fino a quando non vengono effettivamente utilizzati, e quindi solo i pezzi che devono effettivamente essere caricati per qualsiasi "utilizzo" abbia successo.
Ad esempio, ecco uno snippet di top
output su linux che fa riferimento a bash
un'istanza:
VIRT RES SHR S %CPU %MEM TIME+ COMMAND
113m 3672 1796 S 0.0 0.1 0:00.07 bash
VIRT da 113 MB è lo spazio di indirizzi virtuale, che è mappato nella RAM. Ma RES è la quantità effettiva di RAM consumata dal processo - solo 3,7 kB. E di ciò, alcuni fanno parte del territorio condiviso sopra citato - 1,8 kB SHR. Ma il mio /bin/bash
su disco è 930 kB e la libc di base a cui si collega (una lib condivisa) di nuovo doppiamente grande.
Quella shell non sta facendo nulla in questo momento. Diciamo che invoco un comando integrato, che abbiamo detto prima era già "caricato in memoria" insieme al resto della shell. Il kernel esegue qualunque codice sia coinvolto a partire da un punto della mappa e quando raggiunge un riferimento a un codice che non è stato realmente caricato, lo carica - da un'immagine eseguibile su disco - anche se in modo più casuale intendo, quel file eseguibile (che si tratti della shell, di uno strumento autonomo o di una libreria condivisa) era già "caricato in memoria".
Questo è chiamato paging della domanda .