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

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

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

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

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

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

-Adam

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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

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

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

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

Я бы рассматривал window Structured Exception Handlers (SEH) как исключение этого типа.

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

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

Ответ 5

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

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

Ответ 6

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

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

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

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

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

Ответ 7

Exception

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

Прерывание

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

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

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

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

Ловушки

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

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

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

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

-Adam

Ответ 8

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

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

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

Ответ 9

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

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

Ответ 10

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

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

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

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

Ответ 11

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

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

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

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

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