Теоретически, если бы я создал программу, которая бы выделяла всю неиспользуемую память в системе и продолжала запрашивать все больше и больше памяти, поскольку другие приложения освобождали память, которая им больше не нужна, было бы возможно читать недавно освобожденную память из других приложений ? Или это как-то защищено современной операционной системой?
У меня нет практического применения для этого, мне просто любопытно. Я понимаю, что есть некоторые проблемы с распределением «всей доступной памяти» в реальной жизни.
Изменить: чтобы уточнить, я спрашиваю конкретно о «освобожденной» памяти, не обращаясь к памяти, которая в настоящее время выделена другим приложением.
источник
The reason you don't always see zeroed out memory is because it is more efficient not to zero out the memory if it was previously allocated by the same process
Я вижу некоторое несоответствие здесь. Вы имели в виду "тот же исполняемый файл"? Как проверяется, не обнулять ли - по пути к диску?Здесь есть несколько слоев, которые влияют на ответ.
Если вы предполагаете использовать современную операционную систему виртуальной памяти, вы не сможете увидеть остатки данных других процессов на страницах, которые вы выделяете.
Когда процесс загружается впервые, таблица страниц загружается, и потенциально страницы этой памяти выделяются кадры. Как минимум, таблица страниц или ее дополнительная таблица будет содержать карту всей памяти, которую может выделить процесс. Здесь также устанавливается начальный останов процесса, упомянутый выше.
Хотя malloc () может, если процесс разрешен, изменить прерывание процесса, добавив больше страниц в таблицу страниц процесса (дополнительную страницу) для удовлетворения запроса, место, где один процесс может «получить другой» данные процесса, находится в нижний слой реальной памяти.
В обоих этих сценариях современная операционная система, использующая разбиение на страницы по требованию или отложенное распределение, еще не выделяет физическую память (кадры). Операционная система просто «делает заметки» о том, какая виртуальная память для этого процесса считается допустимой. Фактическая память назначается только при необходимости.
Физическая память или кадры выделяются процессу, когда виртуальная страница реализована и отображается в таблицу страниц процессов. Здесь существует потенциальная возможность раскрытия данных. Это происходит во время ошибки страницы. Это связано с тем, что предыдущий процесс мог использовать этот же кадр, а его данные были либо заброшены, либо заменены, чтобы освободить место для текущего запроса физической памяти. Операционная система должна быть осторожна, чтобы гарантировать, что данные запрашивающих процессов правильно заменены или кадр очищен (обнулен) перед возобновлением процесса. Это также упоминалось выше как «старая, но решенная» проблема.
Это делает его несколько неактуальным, если память других процессов была «освобождена» или нет. «Освободившаяся» память других процессов по-прежнему находится на страницах, назначенных этому процессу, и обычно не отображается, пока процесс не завершится, поскольку они просто будут выгружены, когда память будет заполнена или они будут выселены иным образом. malloc () и free () управляют виртуальной памятью, назначенной процессу на уровне (пользователя).
В вашем вопросе ваш процесс продолжает запрашивать все больше и больше памяти, теоретически вытесняя все другие процессы из памяти. В действительности, существуют стратегии распределения кадров - глобальные и локальные - которые также могут повлиять на ответ. С большой вероятностью процесс вытеснит свои собственные страницы из памяти, прежде чем ему будет разрешено переполнение операционной системы и всех других процессов. Хотя это выходит за рамки вашего первоначального вопроса.
Все это спорный вопрос в такой системе MS-DOS. MS-DOS (и другие, более простые системы) не используют виртуальную память (сами по себе), и вы можете легко тыкать и подталкивать другие «обрабатывающие» данные.
Некоторые хорошие ссылки, которые, возможно, будет легче понять, чем исходный код Linux, могут быть хорошим учебником по операционным системам, «Концепции операционных систем» Silberscatz, Gavin и Gange или «Дизайн операционных систем» Эндрю Таненбаума. Кроме того, что-то вроде Nachos из Беркли или Pintos из Stanford - это небольшие операционные системы, созданные для обучения, и в них заложены те же идеи.
источник
Я попробовал это на Ubuntu 16.04 месяцев назад. Как и сказал 0xACE, современная ОС выделяет виртуальную страницу с нулем, когда вы вызываете malloc (). Но если вы ничего не записываете в выделенный буфер, он не будет отображаться в физическую память (то есть принцип копирования при записи), поэтому вы всегда будете читать нули из «неинициализированного» блока. Может быть, есть некоторые встроенные ОС, скомпилированные с опцией «CONFIG_MMAP_ALLOW_UNITIALIZED» для повышения производительности, в этом случае вы можете получить то, за что вы заплатили.
источник
Нет, это не позволит другой программе читать чужую память благодаря магии подкачки . Таким образом, общее использование памяти может превысить физический объем памяти путем разгрузки ее частей на жесткий диск.
Кроме того, максимальная память, которую может выделить процесс, произвольно ограничена ОС (до 4 гигабайт для 32-битной архитектуры), после чего следующий
alloc
вызов вернет ошибку нехватки памяти.источник
mlock
).