
Сопрограммы обычно используются для того, чтобы производить
параллельную обработку данных на одном процессоре. Каждая сопрограмма
работает как бы параллельно с другими сопрограммами, как будто у нее есть
собственный процессор. Такой подход упрощает программирование
некоторых приложений, например, при решении задач моделирования. Такой
подход также полезен для проверки программного обеспечения, которое
потом будет работать на мультипроцессоре.
Ловушки
Ловушка (trap) – это особый тип вызова процедуры, который
происходит при определенном условии. Обычно это очень важное, но редко
встречающееся условие (например, переполнение). При возникновении
такого условия поток управления переходит в какую-то фиксированную
ячейку памяти. В этой ячейке памяти находится команда перехода к
специальной процедуре –
обработчику системных прерываний, которая
выполняет какое-то определенное действие.
Важно то, что этот вид прерываний вызывается каким-то
исключительным условием, вызванным самой программой и обнаруженным
аппаратными средствами или микропрограммой. Конечно, обнаружить такую
ситуацию можно и программными средствами, но при этом потребуется
достаточно времени для постоянного программного контроля такой
ситуации, а ловушка экономит время.
Прерывания
Прерывания – это изменения в потоке управления, вызванные не самой
программой, а чем-либо другим и обычно связано с процессом ввода-вывода.
Как и ловушка, прерывание останавливает работу программы и передает
управление программе обработки прерываний, которая выполняет некоторое
действие. После окончания этого действия программа обработки прерываний
передает управление прерванной программе. Она должна заново начать
прерванный процесс в том же самом состоянии, в котором она находилась,
когда произошло прерывание. Это значит, что прежнее состояние всех
регистров должно быть восстановлено.
Различие между ловушкой и прерыванием следующее: ловушки
синхронны с программой, а прерывания асинхронны.
Для иллюстрации работы прерываний, рассмотрим пример: компьютер
должен вывести на терминал строку символов. Программное обеспечение
сначала собирает в буфер все символы, инициирует глобальную переменную
prt, указывающую на начало буфера и устанавливает вторую глобальную
переменную count, которая равна числу выводимых символов. Затем ПО
проверяет, готов ли терминал и, если терминал готов, выводит первый
символ. Начав процедуру вывода, центральный процессор освобождается и
может запустить другую программу.
91