Если вам каким-то образом удалось заставить ядро принудительно освободить память, которая уже была передана программе, она, вероятно, просто вылетала бы всякий раз, когда пыталась получить доступ к этой памяти. Такая вещь, скорее всего, не поддерживается: программы не должны постоянно проверять, остается ли им предоставленная память, чтобы использовать их, и в любом случае программе будет очень трудно функционировать в такой среде.
Любая хорошо написанная программа проверит, было ли выделение кучи успешным, прежде чем пытаться их использовать. Если кому-то было отказано, программа может обнаружить это (в C, malloc()
вернет нулевой указатель) и выбрать способ его обработки (например, она может напечатать сообщение об ошибке и выйти, или она может продолжать пытаться получить память ). Чтобы узнать, что будет делать ваша ограничительная программа, если она не сможет получить какую-либо память, нам потребуется доступ либо к обширной документации, либо к ее исходному коду.
Допустим, ядро все равно делает это. Он распределяет часть памяти для программы foo
, которая использует ее для хранения некоторых данных. Через некоторое время ядро крадет память обратно, возможно, перераспределяя ее какой-либо другой программе (или даже операционной системе). Как foo
должен получить свои данные сейчас? Если он пытается получить доступ к куску памяти, который имел свои данные, система должна уничтожить его - и это правильно! Память может теперь содержать конфиденциальные данные другого пользователя, и в этом случае, если foo
прочитает их, это будет дырой в безопасности. Если он назначен программе, выполняемой от имени другого пользователя, или операционной системе, разрешение записи в foo
может привести к возникновению любого количества плохих и непредсказуемых вещей.
Конечно, в стеке также хранятся переменные. Я никогда не слышал о способе проверить, были ли эти распределения успешными; Кажется, все просто предполагают, что они были. Я предполагаю, что каждая программа автоматически получает минимальный объем памяти для игры; если эта память не была доступна, система отказалась бы запустить программу.