Powiedzmy, że jeśli napiszę cd w mojej powłoce. Czy płyta CD jest w tej chwili ładowana z pamięci? Moją intuicją jest to, że te wbudowane polecenia są wstępnie ładowane do pamięci systemowej po załadowaniu jądra, ale ktoś nalegał, że są ładowane tylko wtedy, gdy faktycznie wywołuję polecenie ...
W szerszym ujęciu pozostałe odpowiedzi są poprawne - wbudowane są ładowane z powłoką, autonomiczne są ładowane po wywołaniu. Jednak bardzo kleisty łasica „ktoś” mógłby upierać się, że nie jest to takie proste.
Ta dyskusja dotyczy nieco tego, jak działa system operacyjny, a różne systemy operacyjne działają w różny sposób, ale myślę, że ogólnie rzecz biorąc, prawdopodobnie wszystkie poniższe * prawdy są prawdziwe.
Po pierwsze, „załadowany do pamięci” jest niejednoznacznym zwrotem; tak naprawdę mamy na myśli mapowanie wirtualnej przestrzeni adresowej do pamięci . Jest to istotne, ponieważ „wirtualna przestrzeń adresowa” odnosi się do rzeczy, które mogą wymagać umieszczenia w pamięci, ale w rzeczywistości nie są początkowo: głównie to, co jest faktycznie ładowane do pamięci, to sama mapa - a mapa nie jest terytorium. „Terytorium” byłoby plikiem wykonywalnym na dysku (lub w pamięci podręcznej dysku) i w rzeczywistości większość z nich prawdopodobnie nie jest ładowana do pamięci po wywołaniu pliku wykonywalnego.
Ponadto znaczna część „terytorium” to odniesienia do innych terytoriów (bibliotek współdzielonych), i ponownie, tylko dlatego, że zostały one przywołane, nie oznacza, że są one naprawdę załadowane. Nie są ładowane, dopóki nie zostaną faktycznie użyte, a następnie tylko te części, które faktycznie muszą zostać załadowane, aby jakiekolwiek „użycie” miało się powieść.
Na przykład, oto fragment top
wyniku w Linuksie odnoszący się do bash
instancji:
VIRT RES SHR S %CPU %MEM TIME+ COMMAND
113m 3672 1796 S 0.0 0.1 0:00.07 bash
113 MB VIRT to wirtualna przestrzeń adresowa odwzorowana w pamięci RAM. Ale RES to faktyczna ilość pamięci RAM zużywanej przez proces - tylko 3,7 kB. Część tego stanowi część wspomnianego wyżej wspólnego terytorium - 1,8 kB SHR. Ale mój /bin/bash
dysk ma pojemność 930 kB, a podstawowa biblioteka libc, z którą się łączy (biblioteka współdzielona) jest dwukrotnie większa.
Ta skorupa nic teraz nie robi. Powiedzmy, że wywołuję wbudowane polecenie, które, jak powiedzieliśmy wcześniej, zostało już „załadowane do pamięci” wraz z resztą powłoki. Jądro wykonuje dowolny kod, poczynając od punktu na mapie, a kiedy osiąga odwołanie do kodu, który tak naprawdę nie został załadowany, ładuje go - z obrazu wykonywalnego na dysku - nawet w bardziej swobodnym sens, że plik wykonywalny (czy to powłoka, samodzielne narzędzie, czy wspólna biblioteka) został już „załadowany do pamięci”.
Nazywa się to stronicowaniem na żądanie .