Проблемы реализации точного прерывания в конвейере
Обработка прерываний в конвейерном ядре процессора оказывается более сложной из-за того, что совмещенное выполнение команд затрудняет определение возможности безопасного изменения состояния ядра процессора произвольной командой. В конвейерном ядре процессора команда выполняется по этапам, и ее завершение осуществляется через несколько тактов после выдачи для выполнения. Еще в процессе выполнения отдельных этапов команда может изменить состояние ядра процессора. Тем временем возникшее прерывание может вынудить ядро процессора прервать выполнение еще не завершенных команд.
Как и в ядрах процессоров без конвейера двумя основными проблемами при реализации прерываний являются:
1) прерывания возникают в процессе выполнения некоторой команды;
2) необходим механизм возврата из прерывания для продолжения выполнения программы. Например, для простейшего конвейера прерывание по отсутствию страницы виртуальной памяти при выборке данных не может произойти до этапа выборки из оперативной памяти. В момент возникновения этого прерывания в процессе обработки уже будут находиться несколько команд. Поскольку подобное прерывание должно обеспечить возврат для продолжения программы и требует переключения на другой процесс (операционную систему), необходимо надежно очистить конвейер и сохранить состояние ядра процессора таким, чтобы повторное выполнение команды после возврата из прерывания осуществлялось при корректном состоянии ядра процессора. Обычно это реализуется путем сохранения адреса команды, вызвавшей прерывание. Если выбранная после возврата из прерывания команда не является командой перехода, то сохраняется обычная последовательность выборки и обработки команд в конвейере. Если же это команда перехода, то необходимо оценить условие перехода и в зависимости от выбранного направления начать выборку, либо по целевому адресу команды перехода, либо следующей за переходом команды. Когда происходит прерывание, для корректного сохранения состояния ядра процессора необходимо выполнить следующие шаги:
1. В последовательность команд, поступающих на обработку в конвейер, принудительно вставить команду перехода на прерывание.
2. Пока выполняется команда перехода на прерывание, погасить все требования записи, выставленные командой, вызвавшей прерывание, а также всеми следующими за ней в конвейере командами. Эти действия позволяют предотвратить все изменения состояния ядра процессора командами, которые не завершились к моменту начала обработки прерывания.
3. После передачи управления подпрограмме обработки прерываний операционной системы, она немедленно должна сохранить значение адреса команды, вызвавшей прерывание. Это значение будет использоваться позже для организации возврата из прерывания.
Если используются механизмы задержанных переходов, состояние ядра процессора уже невозможно восстановить с помощью одного счетчика команд, поскольку в процессе восстановления команды в конвейере могут оказаться вовсе не последовательными. В частности, если команда, вызвавшая прерывание, находилась в слоте задержки перехода, и переход был выполненным, то необходимо заново повторить выполнение команд из слота задержки плюс команду, находящуюся по целевому адресу команды перехода. Сама команда перехода уже выполнилась и ее повторения не требуется. При этом адреса команд из слота задержки перехода и целевой адрес команды перехода естественно не являются последовательными. Поэтому необходимо сохранять и восстанавливать несколько счетчиков команд, число которых на единицу превышает длину слота задержки. Это выполняется на третьем шаге обработки прерывания.
После обработки прерывания специальные команды осуществляют возврат из прерывания путем перезагрузки счетчиков команд и инициализации потока команд. Если конвейер может быть остановлен так, что команды, непосредственно предшествовавшие вызвавшей прерывание команде, завершаются, а следовавшие за ней могут быть заново запущены для выполнения, то говорят, что конвейер обеспечивает точное прерывание. В идеале команда, вызывающая прерывание, не должна менять состояние ядра процессора, и для корректной обработки некоторых типов прерываний требуется, чтобы команда, вызывающая прерывание, не имела никаких побочных эффектов. Для других типов прерываний, например, для прерываний по исключительным ситуациям команд обработки данных с плавающей точкой, вызывающая прерывание команда в некоторых ядрах процессоров записывает свои результаты еще до того момента, когда прерывание может быть обработано. В этих случаях аппаратура должна быть готовой для восстановления операндов-источников, даже если местоположение результата команды совпадает с местоположением одного из операндов-источников.
Поддержка точных прерываний во многих компьютерах является обязательным требованием, а в некоторых компьютерах была бы весьма желательной, поскольку она упрощает интерфейс операционной системы. Как минимум в компьютерах со страничной организацией памяти или с реализацией арифметической обработки в соответствии со стандартом IEEE 754 средства обработки прерываний должны обеспечивать точное прерывание либо целиком с помощью аппаратуры, либо с помощью некоторой поддержки со стороны программных средств.
Необходимость реализации в процессоре точных прерываний иногда оспаривается из-за некоторых проблем, которые осложняют повторный запуск команд. Повторный запуск сложен из-за того, что команды могут изменить состояние ядра процессора еще до того, как они гарантировано завершают свое выполнение (иногда гарантированное завершение команды называется фиксацией команды или фиксацией результатов выполнения команды). Поскольку команды в конвейере могут быть взаимозависимыми, блокировка изменения состояния ядра процессора может оказаться непрактичной, если конвейер продолжает работать. Таким образом, по мере увеличения степени конвейеризации ядра процессора возникает необходимость отката любого изменения состояния, выполненного до фиксации команды. К счастью, в простых конвейерах, подобных рассмотренному, эти проблемы не возникают.
Контрольные вопросы
1. В чем состоит суть конвейерной обработки команд?
2. Охарактеризуйте работу простейшего конвейера команд
3. Какова идеальная производительность конвейера команд?
4. Что мешает идеальной работе конвейера команд?
5. В чем суть конфликта по данным?
6. В чем суть конфликта по управлению?
7. Что такое структурный конфликт?
8. Как разрешаются структурные конфликты?