У меня есть вопрос, который я часто задаю. Используют ли программы меньше оперативной памяти, если аналогичная программа уже запущена?
Что я подразумеваю под подобным? Ну, например, мне интересно, есть ли какие-нибудь производные Chromium и Atom, работающие одновременно. Разве Atom не является браузером Chormium под капотом? Так что, если в какой-то момент они используют одни и те же библиотеки, это экономит мне память по сравнению с использованием какого-либо другого гипотетического редактора или браузера с тем же потреблением памяти, что и у Atom или Chromium?
Другой пример: Firefox и Thunderbird - там есть какая-нибудь экономия?
Разве ОС не должна быть настолько умной, чтобы распознавать подобные зависимости и затем экономить память?
источник
Ответы:
Да, они используют меньше памяти. На самом деле, ваш пример 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), увеличивает вероятность того, что они смогут использовать общую память для своих функций.
источник