Как операционные системы предотвращают сбои при переполнении стека? - PullRequest
3 голосов
/ 25 сентября 2011

Какие методы используются операционными системами для предотвращения сбоев или нестабильного поведения, когда одна из моих программ случайно утечка памяти или переполнение стека?

Ответы [ 3 ]

3 голосов
/ 25 сентября 2011

Коротко: Управление памятью.

Обычно каждому процессу выделяется ограниченный (но обычно настраиваемый) объем стекового пространства, поэтому один процесс не может использовать его достаточно, чтобы вызвать проблемы для системы в целом.

И если процесс попытается получить доступ к памяти вне того, что было выделено для него, это (в худшем случае) приведет к сбою самого процесса; это освобождает ресурсы, выделенные для этого процесса, не наступая на другие процессы.

2 голосов
/ 25 сентября 2011

Очень хороший вопрос, спасибо за вопрос. Есть три вопроса, которые я могу придумать. И для каждого вопроса есть два случая.

Переполнения стека: Если ваша программа написана не на языке ассемблера, ОС может обнаружить переполнение стека, поскольку все операции стека операции программного обеспечения . Система времени выполнения управляет программным стеком и знает, когда происходит переполнение.

Если вы взяли на себя труд написать программу на языке ассемблера и попали в аппаратный стек по ошибке, то ОС не сможет вас спасти. Могут случиться плохие вещи.

Доступ к внешней памяти: Когда ваша программа на C ++ запускается, ОС устанавливает ограничения памяти от вашего имени в ЦП. Если ваша программа пытается получить доступ к памяти за пределами этих границ, ЦП вызывает аппаратное прерывание . ОС, которая обрабатывает прерывания, может сказать вам, что ваша программа плохо себя ведет. Вот что происходит, когда вы пытаетесь разыменовать нулевой указатель, например.

Ваша программа на ассемблере, тем не менее, может пытаться читать или записывать из / в любую память, на которую это похоже. Если ваша программа вежлива и была запущена ОС обычным способом, то ОС может перехватить эту ошибку. Но если ваша программа злая и каким-то образом запущена за пределами действия ОС, она может нанести реальный ущерб.

Утечки памяти: Извините, никто не может вам здесь помочь.

2 голосов
/ 25 сентября 2011

ОС обычно не защищают от утечек памяти в вашей программе;но как только ваше приложение заканчивается, вся его память возвращается.Если ваше приложение никогда не завершится, то ОС в конечном итоге столкнется с проблемами, когда у нее закончится память.

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

...