Прерывания в роли потоков
В большинстве операционных систем приняты две основные формы асинхронной деятельности: процессы и прерывания. Процессы (или потоки) взаимодействуют друг с другом и управляют использованием совместных структур данных с помощью различных примитивов, обеспечивающих взаимоисключения (когда в каждый момент времени только один процесс может выполнять определенный код или осуществлять доступ к определенным данным) и синхронизирующих их выполнение. Прерывания синхронизируются путем их предотвращения на некоторое время. В операционной системе Solaris эти две концепции объединяются в одной модели потоков ядра; прерывания в такой модели преобразуются в потоки ядра.
Эти преобразования выполняются для сокращения накладных расходов. Обработчики прерываний часто манипулируют данными, которые используются совместно с остальной частью ядра. Поэтому во время работы процедуры ядра, осуществляющей доступ к этим данным, прерывания должны быть заблокированы, даже если большинство прерываний не оказывают влияния на эти данные. Обычно для этого приходится повышать уровень приоритета прерываний, чтобы блокировать прерывания на время выполнения подпрограммы. После завершения подпрограммы уровень приоритета понижается. Все эти операции отнимают время. В многопроцессорной системе проблема усиливается.
1. Для обработки прерываний в системе Solaris используются потоки ядра. Как и любой другой поток ядра, поток прерывания обладает своим собственным идентификатором, приоритетом, контекстом и стеком.
2. Ядро управляет доступом к структурам данных и синхронизирует потоки прерываний с помощью примитивов взаимоисключений (рассматривающихся в главе 5, "Параллельные вычисления: взаимоисключения и многозадачность"). Таким образом, для обработки прерываний используются обычные методы синхронизации потоков.
3. Потокам прерываний присваиваются более высокие приоритеты, чем всем другим типам потоков ядра.
Если происходит прерывание, оно передается определенному процессору, а выполняющийся на этом процессоре поток закрепляется. Закрепленный поток неможет перейти на другой процессор; его контекст сохраняется, и процесс приостанавливается до тех пор, пока не будет обработано прерывание. После этого процессор приступает к выполнению потока прерывания. В наличии всегда имеется запас деактивированных потоков прерываний, так что новый поток создавать не нужно. Затем исполняется поток, в котором происходит обработка прерывания. Если программе обработки понадобится доступ к структуре данных, которая каким-то образом заблокирована и используется другим потоком, поток прерывания должен ждать. Поток прерывания может быть вытеснен только другим потоком прерывания с более высоким приоритетом.
Опыт использования потоков прерываний в операционной системе Solaris свидетельствует о том, что такой подход обеспечивает производительность, превосходящую производительность традиционных методов обработки прерываний [KLEI95].
Дата добавления: 2016-06-05; просмотров: 1609;