Коли вбудовані команди завантажуються в пам'ять


11

Скажімо, якщо я набираю cdсвою оболонку. Є чи cdзавантажений з пам'яті в той момент? Моя інтуїція полягає в тому, що ці вбудовані команди попередньо завантажуються в системну пам'ять після завантаження ядра, але хтось наполягав на тому, що вони завантажуються лише тоді, коли я фактично викликаю команду (натисніть клавішу enter на оболонці). Скажіть, будь ласка, чи є посилання, що пояснюють це?


1
Я думаю, що ця відповідь допоможе вам зрозуміти, хоча це не зовсім дублікат.
cjm

@cjm: Спасибі, це було справді гарне пояснення.
Прогноз

Відповіді:


9

Скажімо, якщо я ввожу компакт-диск у своїй оболонці. Чи завантажується компакт-диск із пам'яті в цей момент? Моя інтуїція полягає в тому, що ці вбудовані команди попередньо завантажуються в системну пам'ять після завантаження ядра, але хтось наполягав, що вони завантажуються лише тоді, коли я фактично викликаю команду ...

В широкому розумінні інші відповіді правильні - вбудовані пристрої завантажуються оболонкою, автономні алони завантажуються при виклику. Однак дуже чіткий невідомий «хтось» може наполягати, що це не так просто.

Ця дискусія дещо про те, як працює ОС, і різні операційні системи працюють по-різному, але я думаю, загалом, наступне, мабуть, стосується всіх сучасних нікс.

По-перше, "завантажений в пам'ять" - неоднозначна фраза; насправді, про що ми маємо на увазі, це віртуальний адресний простір, відображений у пам'яті . Це важливо, оскільки "віртуальний адресний простір" відноситься до речей, які, можливо, потрібно буде помістити в пам'ять, але насправді це не спочатку: в основному те, що насправді завантажується в пам'ять, - це сама карта - а карта - це не територія. "Територія" була б виконуваною на диску (або в кеш-диску), і насправді більшість із них, ймовірно, не завантажуються в пам'ять, коли ви викликаєте виконуваний файл.

Крім того, значна частина "території" - це посилання на інші території (спільні бібліотеки), і знову ж таки, саме те, що на них посилалися, не означає, що вони теж завантажені. Вони не завантажуються до тих пір, поки не будуть фактично використані, а потім лише ті шматки, які насправді потрібно завантажувати, щоб будь-яке "використання" було успішним.

Наприклад, ось фрагмент topвиводу на Linux з посиланням на bashекземпляр:

VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                  
113m 3672 1796 S  0.0  0.1   0:00.07 bash   

ВІРТ 113 Мб - це віртуальний адресний простір, який відображається в ОЗУ. Але ВДЕ - це фактична кількість оперативної пам’яті, спожитого процесом, - лише 3,7 кБ. І з цього частина є частиною згаданої вище загальної території - 1,8 кБ ШР. Але мій /bin/bashна диску 930 кБ, і базовий libc, на який він посилається (спільна ліб), знову вдвічі більший.

Ця оболонка зараз нічого не робить. Скажімо, я викликаю вбудовану команду, про яку ми говорили раніше, вже "завантажена в пам'ять" разом з рештою оболонки. Ядро виконує будь-який код, починаючи з точки на карті, і коли він доходить посилання на код, який насправді не завантажений, він завантажує його - з виконуваного зображення на диску - навіть у більш випадковій формі сенс, що виконуваний файл (будь то оболонка, автономний інструмент або спільна бібліотека) вже "завантажений у пам'ять".

Це називається пейджингом попиту .


9

Поки чекаю, коли одна з важких ваг прийде і дасть повну історичну перспективу, я дам вам моє більш обмежене розуміння.

Вбудовані команди , як alias, cd, і echoт.д. , є частиною вашої оболонки ( bash, zsh, kshабо будь-який інший ). Вони завантажуються одночасно з оболонкою і є просто внутрішніми функціями цієї оболонки.


4

Я зробив наступний експеримент, щоб показати, що вбудовані команди насправді завантажуються як частина виконуваного bash. Тому їх називають вбудованими, але демонстрація - це завжди найкращий спосіб щось довести.

Приклад

  1. Запустіть нову bashоболонку та зазначте її ідентифікатор процесу (PID):

    $ bash
    $ echo $$
    6402
    
  2. У другому терміналі запустіть psкоманду, щоб ми могли спостерігати і бачити, чи bashпочинає займати додаткову пам'ять:

    $ watch "ps -Fp 6402"
    

    Вихід виглядає приблизно так:

    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
    

    ПРИМІТКА. Використання пам'яті відображається тут зі стовпцями SZ & RSS.

  3. Почніть виконувати команди в оболонці (pid 6402):

    Поки ви cdпомітите, що пам'ять насправді збільшується, але це не тому, що виконуваний файл cdзавантажується в пам'ять, а це тому, що структура каталогу на диску завантажується в пам'ять. Якщо ви продовжуєте працювати cdв інших каталогах, ви побачите, що це поступово продовжуватиметься вгору.

    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
    

    Ви можете зробити більш складні тести на зразок цього:

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

    Ця команда збільшить рівень на рівні, а потім повернеться до каталогу 90609 1000 разів. Під час запуску цієї програми, якщо ви відстежуєте використання пам'яті у psвікні, ви помітите, що вона не змінюється. Під час виконання чогось подібного, додаткове використання пам'яті не повинно помічатися.

  4. стрижка

    Ось ще одна розповідь, що ми маємо справу з вбудованою функцією, bashа не з фактичним виконуваним файлом. Коли ви спробуєте запустити, strace cd ..ви отримаєте таке повідомлення:

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

3

"вбудована команда" відноситься до команд, вбудованих в оболонку, а не до окремих програм. lsнаприклад, насправді це не вбудована команда, а окрема програма. Він буде завантажений в ОЗП при його виклику, якщо тільки він вже не знаходиться в кеш-диску диска.

Прикладом вбудованої команди може бути printfабо cd. Вони входять до складу оболонки і завантажуються разом з рештою оболонки.

Команди не завантажуються за замовчуванням, хоча для цього були створені системи.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.