Меньше использования памяти при запуске аналогичного программного обеспечения?


2

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

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

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

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


1
Вы можете прочитать unix.stackexchange.com/a/116332/167583 в отношении общих библиотек. Обратите внимание, что Chromium также использует разделяемую память, что может облегчить использование ее глобальной памяти.
Julie Pelletier

@JuliePelletier Довольно сложные вещи, но я думаю, что я понял их суть: в зависимости от того, как скомпилирована разделяемая библиотека, она может использоваться двумя программами без двойной загрузки. (?)
Zelphir

Это действительно суть этого.
Julie Pelletier

Ответы:


1

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

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

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

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.