Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Программные исключения

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

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

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

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

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

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

Исключение

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

Прерывать

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

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

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

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

Подводные камни

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

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

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

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

-Адам

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

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

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

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

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

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

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

Чтобы все было просто...

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top