Скажем, если я наберу CD в моей оболочке. В этот момент загружен CD из памяти? Моя интуиция заключается в том, что эти встроенные команды предварительно загружаются в системную память после загрузки ядра, но кто-то настаивал на том, что они загружаются только тогда, когда я действительно вызываю команду ...
В общих чертах остальные ответы верны - встроенные модули загружаются с оболочкой, автономные загружаются при вызове. Однако очень неуклюжий ласковый «кто-то» может настаивать на том, что это не так просто.
Это обсуждение в некоторой степени о том, как работает ОС, и разные ОС работают по-разному, но я думаю, что в общем случае следующее верно для всех современных * nixes.
Во-первых, «загружен в память» - это неоднозначная фраза; на самом деле мы имеем в виду, что виртуальное адресное пространство отображается в памяти . Это важно, потому что «виртуальное адресное пространство» относится к материалам, которые, возможно, необходимо поместить в память, но на самом деле это не изначально: в основном то, что фактически загружается в память, это сама карта, а карта не является территорией. Территория будет представлять собой исполняемый файл на диске (или в дисковом кеше), и, по сути, большая часть этого, вероятно, не загружается в память при вызове исполняемого файла.
Кроме того, большая часть «территории» - это ссылки на другие территории (общие библиотеки), и опять же, только то, что на них ссылались, не означает, что они действительно загружены. Они не загружаются до тех пор, пока они фактически не используются, и затем только те их части, которые действительно должны быть загружены для того, чтобы «использование» имело успех.
Например, вот фрагмент top
вывода на linux со ссылкой на bash
экземпляр:
VIRT RES SHR S %CPU %MEM TIME+ COMMAND
113m 3672 1796 S 0.0 0.1 0:00.07 bash
113 МБ VIRT - это виртуальное адресное пространство, которое отображается в ОЗУ. Но RES - это фактический объем оперативной памяти, потребляемой процессом - всего 3,7 кБ. И из этого часть является частью упомянутой выше общей территории - 1,8 кбайт SHR. Но у меня /bin/bash
на диске 930 кБ, и базовый libc, на который он ссылается (разделяемый lib), снова в два раза больше.
Эта оболочка сейчас ничего не делает. Допустим, я вызываю встроенную команду, которая, как мы говорили ранее, уже была «загружена в память» вместе с остальной частью оболочки. Ядро выполняет любой код, начиная с некоторой точки на карте, и, когда оно достигает ссылки на код, который на самом деле не был загружен, оно загружает его - из исполняемого образа на диске - хотя и в более случайном порядке. Смысл в том, что исполняемый файл (будь то оболочка, автономный инструмент или разделяемая библиотека) уже «загружен в память».
Это называется поиском по запросу .