Прерывания и исключения

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

20
задан Cœur 26 November 2018 в 06:05
поделиться

11 ответов

Прерывание является сигналом ЦП, сгенерированным аппаратными средствами или определенными инструкциями ЦП. Они заставляют обработчики прерываний выполняться. Вещи, такие как сигналы ввода-вывода от аппаратных средств ввода-вывода генерируют прерывания.

исключение может считаться версией программного обеспечения прерывания, это только влияет на его процесс.

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

8
ответ дан 29 November 2019 в 22:41
поделиться

Прерывания указывают, что что-то внешнее к ядру процессора требует, чтобы это было внимание. Это прерывает нормальный поток программы, выполняет Процедуру обработки прерывания (ISR) и обычно возвращается туда, где это было, прежде чем прерывание произошло.

существует большая вариация на эту основную тему: прерывания могли бы быть сгенерированы программным обеспечением, другая задача могла бы получить ЦП после ISR и т.д. Ключевой пункт - то, что прерывания могут произойти в любое время по причине, которую код/ЦП имеет никакое управление [1 113].

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

Аппаратные Исключения

процессоры Certain (PowerPC, например) определяют исключения, чтобы указать, что своего рода необычное условие произошло: Системный Сброс, Недопустимый Адрес, некоторое неудачное обращение в кэш преобразования виртуальных адресов, и т.д.

Эти исключения также используются для реализации точек останова и системных вызовов. В этом случае они действуют почти как прерывания.

Исключения ОС

Некоторые аппаратные исключения будут обработанное ОС. Например, Ваши доступы программы недопустимая память. Это вызовет аппаратное исключение. ОС имеет обработчик для того исключения, и разногласия - то, что ОС отправит сигнал к Вашему приложению (SIGSEGV, например) обозначение, что там проблема.

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

я полагал бы, что Структурированные обработчики исключений (SEH) окна этот тип исключений.

Исключения программного обеспечения

Некоторые языки как Java, C++ и C# имеют понятие исключений программного обеспечения, где язык предусматривает обработку непредвиденных или необычных условий связанный с операцией программы . В этом случае исключение повышено в какой-то момент в коде, и некоторый код выше стопки выполнения программы "поймал" бы исключение и выполнился бы. Это - то, что делают блоки попытки/выгоды.

8
ответ дан 29 November 2019 в 22:41
поделиться

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

Другие периферийные устройства как таймеры, контроллеры usb, и т.д. также генерируют прерывания на основе некоторого внешнего события.

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

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

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

Затем существует исключение, как замечено задачей. Это - конструкция уровня операционной системы, которая используется для уничтожения задачи, когда она делает что-то недопустимое - как деление 0, незаконно получая доступ к памяти и т.д.

И в-третьих, существует аппаратное исключение. С точки зрения поведения это идентично прерыванию, в котором процессор сразу перейдет к некоторой назначенной ячейке памяти и начнет выполняться. То, где исключение отличается от прерывания, - то, что исключение вызывается некоторой незаконной деятельностью, которую обнаружил процессор. Например, MMU на процессоре обнаружит недопустимые доступы памяти и вызовет исключение. Этими аппаратными исключениями является начальный триггер для операционной системы для выполнения, это - задачи очистки (как описано в абзаце выше).

21
ответ дан 29 November 2019 в 22:41
поделиться

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

, Если Ваша программа не выполняется без операционной системы (или Вы разрабатываете ОС), она никогда не будет видеть необработанное исключение/прерывание. Они пойманы ОС и обработаны ею (прерывания) или преобразованы в некоторую другую форму прежде чем быть отраженным назад к пользовательской программе (например, сигналы на UNIX, структурированная обработка исключений (SEH) в Windows), где она имеет шанс обработки его.

11
ответ дан 29 November 2019 в 22:41
поделиться

Я собираюсь уточнить то, что - прерывание то, потому что существует один критический тип прерывания, с которым никто еще не имел дело: таймер.

, Но сначала, позвольте мне создать резервную копию. То, когда Вы получаете прерывание, Ваш обработчик прерываний (который живет в kernelspace), выполнения, который обычно отключает прерывания, видит к любому незаконченному бизнесу (обработка пакета, который просто прибыл в сеть, обработав нажатие клавиши, и т.д.) и затем (помните, что мы находимся все еще в ядре в этой точке), выясняет то, что процесс, как предполагается, выполняет затем (мог быть тот же, мог быть другой, зависит от планировщика), и затем выполните его.

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

Так, скажем, я пишу простую программу C, которая считает все числа, или последовательность Fibonacci или что-то еще без остановки. Или еще лучше: делает только вращения в некоторое время (1) цикл. Как делают другие процессы в системе получают шанс работать? Что, если нет ничего оказывающегося вызвать прерывание?

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

5
ответ дан 29 November 2019 в 22:41
поделиться

Исключение

исключение - когда процессор выполняет код, который не находится на его обычном тракте. Это - 'исключение' к нормальному функционированию, которое является чрезвычайно линейным перемещением через код и управляющие структуры. Различные языки имеют поддержку различных типов исключений, обычно используемых для обработки ошибок во время операции программы.

Прерывание

прерывание является исключением на аппаратном уровне (обычно). Прерывание является физическим сигналом в процессоре, который говорит ЦП хранить свое текущее состояние и переход для прерывания (или исключение) кода обработчика. После того как обработчик сделан, исходное состояние восстанавливается, и обработка может продолжиться.

прерывание всегда является исключением, даже когда оно предназначается. Прерывания могли бы указать:

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

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

Ловушки

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

, Если программа определяет время по часам и получает первое слово на 32 бита, то прерывание происходит, после того как обработчик прерываний выходит, процесс получает второе слово на 32 бита, и данные будут несвязными - эти два слова могут быть вне синхронизации. При попытке использовать взаимное исключение или семафор для блокировки переменной в процессе, то прерывание подвесит ожидание блокировки и остановит систему (мертвая блокировка), если и обработчик и процессы, которые используют данные, не будут записаны очень тщательно. Легко войти в проблему при записи для прерываний.

Повторно используемые функции являются также другой проблемой. Если Вы выполняете funcA в коде программы, берете прерывание, которое также выполняет funcA, можно закончить с непреднамеренными последствиями из-за совместно используемых переменных (статические, или переменные "кучи", классы, и т.д.). Вы обычно хотите выполнить как можно меньше код, в обработчике прерываний, и часто иметь его установил флаг, таким образом, процесс может сделать реальную работу позже, не вызывая беспокойство о конфликтах.

До некоторой степени это подобно разработке для многопроцессорной системы и является одной из причин, почему программирование ядра все еще считают черной магией многие.

-Adam

5
ответ дан 29 November 2019 в 22:41
поделиться

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

прерывание является событием в аппаратных средствах (или вручную запущенный в блок), который связан с вектором обработчиков, которые могут использоваться, чтобы обработать событие прерывания, быть им Завершение IO, Ошибка IO (Отказ Памяти на дисках), Событие IO (Перемещение мыши, например). Прерывания могут давать начало исключениям часто, когда некоторое неожиданное прерывание происходит.

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

2
ответ дан 29 November 2019 в 22:41
поделиться

В целом прерывание является реализованным каким-то прерыванием аппаратных средств. Вы регистрируете обработчик для определенного прерывания (подразделение 0, доступные данные на периферийном устройстве, таймер истек), и когда тот случай происходит, все обрабатывающие остановы в масштабе всей системы, Вы быстро обрабатываете прерывание, и вещи продвигаются. Они обычно реализуются в драйвере устройства или ядре.

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

2
ответ дан 29 November 2019 в 22:41
поделиться

Прерывания, как ожидают, будут регулярно происходить (хотя иногда они не являются регулярными).. они прерывание CPU, потому что что-то важное просто произошло и оно должно заботиться о сразу.

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

4
ответ дан 29 November 2019 в 22:41
поделиться

Хранение простых вещей...

, Когда Вы сделаны, обработав прерывание, Вы (обычно) возвращаетесь к тому, что Вы делали, прежде чем Вы были прерваны.

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

При обработке прерывания, можно решить выдать исключение, но это не означает, что необходимо рассмотреть само прерывание как исключение. Исключения не "прерывают" (так как это подразумевало бы возможность возврата тому, что Вы делали непосредственно перед тем, как Вы были прерваны); скорее они "прерывают" (некоторое подмножество) Ваше текущее действие.

И, как отмечено несколько раз уже, прерывания обычно инициированы внешними объектами, такими как аппаратные средства или пользователи (такие как щелчок мышью или нажатие клавиши как CTRL-C), в то время как исключения сгенерированы (брошенные) синхронно программным обеспечением, обнаруживающим "проблему" или "исключительное условие".

2
ответ дан 29 November 2019 в 22:41
поделиться

Iterrupts являются управляемыми в основном аппаратными средствами, как Ваш принтер indiciating это "из бумаги", или сетевая плата, указывающая на это, потеряла соединение.

исключением является просто состояние ошибки в Вашей программе, обнаруженной попыткой / блок выгоды. Как:

Try
   {
   ... various code steps that "throw exceptions" on error ...
   }
catch (exception e)
   {
   print 'Crap! Something bad happened.' + e.toString()
   }

Это - удобный способ зафиксировать "любую ошибку", которая происходит в блоке кода, таким образом, можно обработать их подобным способом.

2
ответ дан 29 November 2019 в 22:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: