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

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

  • Что такое прерывание?

  • Что такое исключение? (объясните, какие исключения есть для каждого языка, который вы знаете, поскольку есть некоторые различия)

  • Когда исключение является прерыванием и наоборот?


person Adam Davis    schedule 24.09.2008    source источник


Ответы (11)


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

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

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

person TraumaPony    schedule 24.09.2008

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

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

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

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

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

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

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

person Andrew Edgecombe    schedule 24.09.2008
comment
Эта категория исключений отвечает на мое недоумение по поводу того, что в стандарте C нет исключений, в отличие от C ++. Например, в C деление на ноль приводит к неопределенному поведению вместо создания исключения. У него может быть способ обработать аппаратное исключение Isa. В то время как в C ++ аппаратное исключение обрабатывается по-другому и в конечном итоге распространяется как объект программного исключения. - person Shichu Zhu; 01.12.2017

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

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

person zvrba    schedule 24.09.2008

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

Существует множество вариаций этой основной темы: прерывания могут быть сгенерированы программным обеспечением, другая задача может получить ЦП после ISR и т. Д. Ключевым моментом является то, что прерывания могут возникать в любое время по причине, по которой код / ​​ЦП имеет < сильный> нет контроля над.

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

Исключения оборудования

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

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

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

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

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

Я бы рассмотрел оконные обработчики структурированных исключений (SEH) как этот тип исключений.

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

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

person Benoit    schedule 24.09.2008

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

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

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

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

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

person Daniel Papasian    schedule 24.09.2008

Исключение

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

Прерывать

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

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

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

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

Ловушки

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

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

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

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

-Адам

person Adam Davis    schedule 24.09.2008
comment
Когда вы проголосуете против, не могли бы вы объяснить мне, что не так с моим ответом в качестве комментария? Очевидно, мне нужно многое узнать по этой теме, если так много людей не согласны с моим ответом. - person Adam Davis; 24.10.2008

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

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

person Giovanni Galbo    schedule 24.09.2008

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

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

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

person bmeck    schedule 24.09.2008

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

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

person Eclipse    schedule 24.09.2008

Проще говоря ...

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

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

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

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

person tye    schedule 24.09.2008

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

Исключение - это просто состояние ошибки в вашей программе, обнаруженное блоком try / catch. Нравится:

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

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

person Ron Savage    schedule 24.09.2008