Есть ли у процессоров актуальная схема для помощи в обработке исключений? - PullRequest
3 голосов
/ 25 декабря 2011

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

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

- редактировать

Итак, спасибо за ответы ниже. Я ценю. Вы ответили на мой вопрос.

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

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

Если я скажу:

doSomethingImportant();

И если по по любой причине "что-то важное" не может быть сделано, это должно вызвать исключение.

Конечно, doSomethingImportant () может не соответствовать, потому что системе не хватает памяти (серьезная проблема), но я думаю, что мы должны быть в состоянии моделировать проще: «Я не могу сделать это сейчас / в этот раз, извините »в наше программное обеспечение, встроенное в наши проекты. Я хотел бы сказать, что я думаю, что исключения могут быть исключительными, да, но они должны ожидаться как нормальный программный поток, а не как «фатальная ошибка», из которой система должна «восстановиться», nomsain

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

Лично я нахожу исключения довольно выразительными, и я хотел бы использовать их во встроенных устройствах с такими большими «накладными расходами», какие я получил бы, возвращая «-1» и проверяя это с помощью «если».

Ответы [ 3 ]

3 голосов
/ 25 декабря 2011

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

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

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

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

2 голосов
/ 25 декабря 2011

Обычно существует два типа обработки исключений:

  1. Исключение языка. (тот тип, который вы добавляете в C ++ / Java или любой другой язык)
  2. Аппаратные исключения. (сигналы, ошибки сегмента, смещение и т. д.)

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

  1. Разные языки имеют разные протоколы обработки исключений. C ++ может отличаться от Java, C # и т. Д ... Разматывание стека и вызовы деструкторов усложнят этот процесс.
  2. Является ли обработка исключений узким местом? Большинство высокооптимизированных приложений, критичных к производительности HPC, в любом случае не используют обработку исключений. Большая часть ООП-ориентированного кода, основанного на обработке исключений, обычно является узким местом из-за других факторов. (например, ветвление, кеш, память и т. д.)

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

1 голос
/ 25 декабря 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...