Операционные системы. Учебное пособие. Марапулец Ю.В. - 83 стр.

UptoLike

Составители: 

§ 3.2. Общие принципы обработки исключений
По мере выполнения программы ее нормальная работа по различным причинам
может нарушаться. В частности, это может быть связано с тем, что центральный процес-
сор наталкивается на недопустимый адрес памяти, пользователь прерывает выполнение
программы комбинацией "горячих" клавиш [Ctrl+C], отладчик произвольным образом
останавливает программу и запускает ее вновь; ошибка может быть связана и с вводом
неправильного значения при выполнении операции с плавающей запятой. Эти и другие
исключительные ситуации способны возникать как на пользовательском уровне, так и
на уровне ядра операционной системы, как в RISC-процессорах, так и в процессорах
Intel. О возникновении подобных ситуаций может сигнализировать и аппаратное, и про-
граммное обеспечение. Любой язык программирования должен содержать средства об-
работки исключений для унификации процесса обработки, выполняемой в различных
ситуациях. Windows включает встроенные низкоуровневые механизмы структурирован-
ной обработки исключений [12].
Исключения в значительной степени аналогичны прерываниям. В первую очередь
тем, что оба сигнала заставляют центральный процессор передать управление специаль-
ной части операционной системы. Однако исключения и прерывания - это не одно и то
же. Прерывания происходят асинхронно, часто в результате определенных аппаратных
событий, например нажатий клавиш или поступления данных через последовательный
порт. Программа не имеет возможности контролировать такие прерывания, и они могут
происходить в любой момент. С другой стороны, исключения возникают синхронно, как
результат выполнения определенных операторов программы. Исключения часто служат
сигналом, свидетельствующим о наличии ошибочных условий. Обычно они воспроиз-
водятся путем повторного запуска программы с тем же контекстом.
Исключения часто генерируются в том случае, если какая-то часть программы об-
наруживает ошибку, но не может обработать ее самостоятельно. Так, система генериру-
ет исключение в ответ на ошибки доступа к памяти и ошибки типа деления на ноль. Од-
нако не все исключения порождаются ошибочными ситуациями. Windows генерирует
специальное исключение для вызова определенного системного сервиса. При обработке
этого исключения ядро передает управление той части операционной системы, которая
предоставляет запрашиваемый сервис.
Любое порожденное исключение должно быть обработано если не самой програм-
мой, то операционной системой, а точнее, должна откликнуться определенная подпро-
грамма, которая обработает и снимет исключение. Следовательно, обработка исключе-
ний заключается в создании специальных блоков программного кода, которые
запускаются при возникновении исключительных ситуаций. Каждое приложение долж-
но содержать несколько маленьких обработчиков, защищающих различные части про-
граммы от всевозможных исключений.
В процессе поиска соответствующего блока программного кода, предназначенного
для конкретной исключительной ситуации, система сначала просматривает текущую
процедуру, затем возвращается назад по стеку вызовов, просматривает другие активные
отложенные процедуры того же процесса и, наконец, переходит к системным обработ-
чикам исключений. Если процесс, породивший исключение, находится под защитой от-
ладчика, последний также получает шанс обработать исключение.
Средства обработки ошибок в различных подсистемах и языках программирования
несколько отличаются друг от друга. Например, WOW-подсистема (Windows on Win32 -
защищенная подсистема, выполняющаяся внутри процесса виртуальной DOS-машины)
должна обрабатывать все исключения непосредственно, поскольку клиенты Winl6 не
имеют возможности делать это самостоятельно. Кроме того, в различных языках про-
85
     § 3.2. Общие принципы обработки исключений

       По мере выполнения программы ее нормальная работа по различным причинам
может нарушаться. В частности, это может быть связано с тем, что центральный процес-
сор наталкивается на недопустимый адрес памяти, пользователь прерывает выполнение
программы комбинацией "горячих" клавиш [Ctrl+C], отладчик произвольным образом
останавливает программу и запускает ее вновь; ошибка может быть связана и с вводом
неправильного значения при выполнении операции с плавающей запятой. Эти и другие
исключительные ситуации способны возникать как на пользовательском уровне, так и
на уровне ядра операционной системы, как в RISC-процессорах, так и в процессорах
Intel. О возникновении подобных ситуаций может сигнализировать и аппаратное, и про-
граммное обеспечение. Любой язык программирования должен содержать средства об-
работки исключений для унификации процесса обработки, выполняемой в различных
ситуациях. Windows включает встроенные низкоуровневые механизмы структурирован-
ной обработки исключений [12].
       Исключения в значительной степени аналогичны прерываниям. В первую очередь
тем, что оба сигнала заставляют центральный процессор передать управление специаль-
ной части операционной системы. Однако исключения и прерывания - это не одно и то
же. Прерывания происходят асинхронно, часто в результате определенных аппаратных
событий, например нажатий клавиш или поступления данных через последовательный
порт. Программа не имеет возможности контролировать такие прерывания, и они могут
происходить в любой момент. С другой стороны, исключения возникают синхронно, как
результат выполнения определенных операторов программы. Исключения часто служат
сигналом, свидетельствующим о наличии ошибочных условий. Обычно они воспроиз-
водятся путем повторного запуска программы с тем же контекстом.
       Исключения часто генерируются в том случае, если какая-то часть программы об-
наруживает ошибку, но не может обработать ее самостоятельно. Так, система генериру-
ет исключение в ответ на ошибки доступа к памяти и ошибки типа деления на ноль. Од-
нако не все исключения порождаются ошибочными ситуациями. Windows генерирует
специальное исключение для вызова определенного системного сервиса. При обработке
этого исключения ядро передает управление той части операционной системы, которая
предоставляет запрашиваемый сервис.
       Любое порожденное исключение должно быть обработано если не самой програм-
мой, то операционной системой, а точнее, должна откликнуться определенная подпро-
грамма, которая обработает и снимет исключение. Следовательно, обработка исключе-
ний заключается в создании специальных блоков программного кода, которые
запускаются при возникновении исключительных ситуаций. Каждое приложение долж-
но содержать несколько маленьких обработчиков, защищающих различные части про-
граммы от всевозможных исключений.
       В процессе поиска соответствующего блока программного кода, предназначенного
для конкретной исключительной ситуации, система сначала просматривает текущую
процедуру, затем возвращается назад по стеку вызовов, просматривает другие активные
отложенные процедуры того же процесса и, наконец, переходит к системным обработ-
чикам исключений. Если процесс, породивший исключение, находится под защитой от-
ладчика, последний также получает шанс обработать исключение.
       Средства обработки ошибок в различных подсистемах и языках программирования
несколько отличаются друг от друга. Например, WOW-подсистема (Windows on Win32 -
защищенная подсистема, выполняющаяся внутри процесса виртуальной DOS-машины)
должна обрабатывать все исключения непосредственно, поскольку клиенты Winl6 не
имеют возможности делать это самостоятельно. Кроме того, в различных языках про-


                                        85