Чья ответственность - это исключение?; ОС или процесс?
Как исключения выполняются с точки зрения операционной системы?
Исходя из С++, я могу понять исключения из перспективы программиста.
Когда генерируется исключение, стек начинает разматываться, и каждая активационная запись имеет возможность поймать и обработать исключение.
Но чья ответственность заключалась в том, чтобы выбросить исключение в первую очередь?
- Это операционная система, которая отправляет триггер процессу
говоря ему, чтобы ввести в него "состояние обработки исключений"?
- Является ли процесс вызывает и обрабатывает исключения в своем собственном программном пространстве, не выпущен в ОС?
Вот две программы сбоев, которые иллюстрируют мою неопределенность.
int main(){
int i = 1/0; //did the OS tell the process to end?
return 0;
}
#include <exception>
int main(){
throw 11; //did the process tell the OS it needs to end?
return 0;
}
Ответы
Ответ 1
Исключения С++ являются частью языка, определенного стандартом языка, и реализованы библиотекой компилятора и среды выполнения. Существуют и другие exceptions
, которые обнаруживаются процессором, например, деление на ноль или разыменование указателя NULL. Оба являются примерами Undefined Behavior в стандарте языка. Это faults
в терминологии процессора и на x86, например, триггер a fault handler
, который затем обслуживается ОС. Затем ОС может сообщить об этой ошибке процессу, вызвавшему его, в Unix это делается с помощью signals
. Если ваш процесс установил signal handler
для SIGSEGV
, например, он может обрабатывать ошибку, сгенерированную CPU, когда процесс разыскивает указатель NULL... этот механизм отделен от исключений С++, определенных языком.
В вашем примере, когда программа С++ throws
исключение полностью обрабатывается сгенерированным компилятором кодом и библиотекой времени исполнения, нет необходимости в ядре ядра и не возникает аппаратного сбоя, создаваемого процессором.
Ответ 2
Вы говорите о двух совершенно разных процессах исключения.
Первая предоставляется ОС. В Windows вы можете использовать __try
и __except
для их обработки.
Второй предоставлен компилятором С++ и никак не связан с ОС.
Ответ 3
Поскольку я знаю только одну или две ОС, написанные на С++, и тот, который я знаю лучше, официально не использует исключения вообще, что в значительной степени исключает исключения, которые бросает ОС.
Три основные ОС (Linux, Windows, MacOS X) вместе со всеми формами Unix (AIX, Solaris, HP-UX и т.д.) написаны на C вместе с практически любой другой коммерческой системой, которая не является написанные на ассемблере, поэтому не могут генерировать исключения типа С++ (что не говорит о том, что исключения, основанные на программном обеспечении, не являются тем исключением, что они не являются типом исключения, которое вы улавливаете с помощью "try/catch" на С++ без какого-либо перевода].
В первом примере ОС определенно задействована [во всех ОС, которые я знаю, как они работают], поскольку деление на ноль вызывает аппаратное исключение на всех машинах, которые имеют деление как функцию, и, следовательно, ОС потребуется быть вовлечены. Кроме того, это будет скомпилировать и сбой таким же образом, будь то С++, C, или вы пишете то же самое в ассемблере. Для большинства операционных систем они отправят сигнал программе, но поскольку у вас нет кода для обработки сигналов, ваш код, скорее всего, просто прервется, сообщив ОС, что произошло что-то странное, и он отказался, даже не потрудившись расслабиться стек.
Во втором случае ОС вообще не задействована. Вокруг вызова main есть блок "try-catch", в котором говорится: "К сожалению, кто-то бросил то, что не было поймано, позволяет выйти". Единственная часть того, что включает в себя ОС, - это "выход из этого процесса", который, конечно же, нужно будет выполнить ОС, хотя я верю в большинство ОС, просто вернувшись с "начального адреса приложения", также будет имеют тот же эффект.