Здесь многое задействовано, но я постараюсь объяснить это настолько просто, насколько смогу, и способом, применимым практически к любой ОС.
Здесь есть 2 основных принципа:
Общая сумма всего, что должно быть в ОЗУ, и тех вещей, которые могут быть полезны в ОЗУ, почти всегда больше, чем размер ОЗУ. Вещи, которые могут быть полезны в ОЗУ, включают рабочие наборы процессов и резервный список. Последний содержит данные и код, которые когда-то были в активном использовании, но с тех пор перестали работать. Многое из этого будет использовано снова, а некоторые довольно скоро, поэтому полезно хранить это в оперативной памяти. Эта память действует как своего рода кеш, но на самом деле она не так важна, как в категории доступной памяти. Как и свободная память, она может быть быстро предоставлена любой программе, которая в этом нуждается. В интересах производительности резервная память должна быть большой.
Частота использования блоков памяти далеко не случайна, но может быть предсказана со значительной точностью. Память делится на блоки, часто 4 байта. Доступ к некоторым блокам осуществляется много раз в секунду, в то время как другие блокировались без доступа в течение многих минут, часов, дней или даже недель, если система работала достаточно долго. Между этими двумя крайностями существует широкий диапазон использования. Диспетчер памяти знает, какие блоки были доступны недавно, а какие нет. Разумно предположить, что к блоку памяти, к которому недавно обращались, скоро потребуется снова. Память, к которой недавно не обращались, вероятно, не понадобится в ближайшее время. Многолетний опыт доказал, что это действительный принцип.
Диспетчер памяти использует преимущества второго принципа, чтобы в значительной степени смягчить нежелательные последствия первого. Для этого он выполняет балансировку, сохраняя данные, к которым недавно обращались, в ОЗУ, в то время как хранит редко используемые данные в исходных файлах или файле подкачки.
Когда оперативной памяти много, этот процесс балансировки прост. Большая часть недавно использованных данных может храниться в оперативной памяти. Это хорошая ситуация.
Все становится сложнее, когда увеличивается нагрузка. Общая сумма используемых данных и кода больше, но размер оперативной памяти остается неизменным. Это означает, что меньшее подмножество этого может быть сохранено в RAM. Некоторые из недавно использованных данных больше не могут быть в оперативной памяти, но должны быть оставлены на диске. Менеджер памяти очень старается поддерживать хороший баланс между памятью в активном использовании и доступной памятью. Но по мере увеличения рабочей нагрузки диспетчер памяти будет вынужден предоставлять больше доступной памяти для запущенных процессов. Это не очень хорошая ситуация, но у менеджера памяти нет выбора.
Проблема в том, что перемещение данных в оперативную память и из нее при запуске программ занимает много времени. Когда оперативной памяти много, это случается не очень часто и даже не замечается. Но когда использование оперативной памяти достигнет высокого уровня, это произойдет гораздо чаще. Ситуация может стать настолько плохой, что на перемещение данных в оперативную память и из нее тратится больше времени, чем на ее фактическое использование. Это ужасно, но менеджер памяти старается избегать этого, но при высокой рабочей нагрузке этого часто не избежать.
Менеджер памяти на вашей стороне, всегда стараясь поддерживать оптимальную производительность даже в неблагоприятных условиях. Но когда рабочая нагрузка велика и доступной памяти не хватает, она должна делать плохие вещи, чтобы продолжать функционировать. Это на самом деле самое главное. Первоочередной задачей является сохранение работоспособности, а затем как можно быстрее.