2

У меня есть вопрос, который я часто задаю. Используют ли программы меньше оперативной памяти, если аналогичная программа уже запущена?

Что я подразумеваю под подобным? Ну, например, мне интересно, какие-либо производные Chromium и Atom работают одновременно. Разве Atom не является браузером Chormium под капотом? Так что, если в какой-то момент они используют одни и те же библиотеки, это экономит мне память по сравнению с использованием какого-либо другого гипотетического редактора или браузера с таким же потреблением памяти, как у Atom или Chromium?

Другой пример: Firefox и Thunderbird - там есть какая-нибудь экономия?

Разве ОС не должна быть настолько умной, чтобы распознавать подобные зависимости и затем экономить память?

1 ответ1

1

Да, они используют меньше памяти. На самом деле, ваш пример Chromium vs. Atom является прекрасной иллюстрацией этого. Оба браузера используют библиотеку WebKit для рендеринга веб-страниц. Если оба браузера используют одну и ту же версию библиотеки WebKit, операционная система загружает только одну ее копию в память для использования ими обоими. Этот процесс называется динамическим связыванием, отсюда и название Dynamic Link Library (DLL) в Windows. Linux просто называет их «библиотеками».

Почти каждая программа, которую вы запускаете, передает большую часть своей функциональности какой-либо внешней библиотеке. Когда программа вызывает одну из функций в библиотеке, операционная система загружает копию библиотеки в память, а затем отображает адрес функции в область памяти программы.

Скажем, программа X вызывает функцию в библиотеке A. ОС загружает библиотеку A в память и дает программе X указатель на нужную ей функцию. Теперь предположим, что программа Y также вызывает ту же функцию в библиотеке А. Поскольку библиотека A уже находится в памяти (поскольку ее использует программа X), ОС не загружает ее снова. Он просто передает другой указатель на программу Y.

Важно отметить, что и программа X, и программа Y имеют свои собственные ссылки на одну и ту же функцию в библиотеке A, и ни одна из них не знает, что она используется другой. Они оба думают, что функция отображается в их собственное пространство памяти. ОС динамически переводит адреса виртуализированных указателей в их действительные значения от имени каждой программы. ОС по сути врет каждому из них о том, какой адрес памяти соответствует функции.

Теперь предположим, что программа X изменяет некоторые байты памяти, хранящиеся в этой функции. Поскольку память распределяется между двумя разными программами, ОС создает вторую копию функции, чтобы изменение программы не затронуло программу Y. В этот момент функция загружается в память дважды. Однако ни одна из программ не знает об этом. Программы X и Y просто продолжают делать свое дело, а ОС обрабатывает, какую копию получить. Эта техника называется копирование при записи.

Таким образом, многие программы могут работать с одной и той же копией данного фрагмента памяти, не имея нескольких копий в ОЗУ. Эта виртуализация памяти является одной из причин, почему так сложно получить надлежащий учет того, сколько ОЗУ фактически используется в системе.

Многие поставщики программного обеспечения имеют свои собственные библиотеки функций, которые они используют, поэтому даже если две программы совсем не похожи (например, Firefox и Thunderbird), тот факт, что они принадлежат одному поставщику (в данном случае Mozilla), увеличивает вероятность того, что они смогут использовать общую память для своих функций.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .