Подтвердить что ты не робот

Чья ответственность - это исключение?; ОС или процесс?

Как исключения выполняются с точки зрения операционной системы?

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

Но чья ответственность заключалась в том, чтобы выбросить исключение в первую очередь?

  • Это операционная система, которая отправляет триггер процессу говоря ему, чтобы ввести в него "состояние обработки исключений"?
  • Является ли   процесс вызывает и обрабатывает исключения в своем собственном программном пространстве,   не выпущен в ОС?

Вот две программы сбоев, которые иллюстрируют мою неопределенность.

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;
}
4b9b3361

Ответ 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", в котором говорится: "К сожалению, кто-то бросил то, что не было поймано, позволяет выйти". Единственная часть того, что включает в себя ОС, - это "выход из этого процесса", который, конечно же, нужно будет выполнить ОС, хотя я верю в большинство ОС, просто вернувшись с "начального адреса приложения", также будет имеют тот же эффект.