Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
У. Столлингс ГЛАВА 4 Потоки.doc
Скачиваний:
49
Добавлен:
11.05.2015
Размер:
6.22 Mб
Скачать

Прерывания в роли потоков

В большинстве операционных систем приняты две основные формы асинхрон­ной деятельности: процессы и прерывания. Процессы (или потоки) взаимодействуют друг с другом и управляют использованием совместных структур данных с помощью различных примитивов, обеспечивающих взаимоисключения (когда в каждый мо­мент времени только один процесс может выполнять определенный код или осуще­ствлять доступ к определенным данным) и синхронизирующих их выполнение. Пре­рывания синхронизируются путем их предотвращения на некоторое время. В опера­ционной системе Solaris эти две концепции объединяются в одной модели потоков ядра; прерывания в такой модели преобразуются в потоки ядра.

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

  1. Для обработки прерываний в системе Solaris используются потоки ядра. Как и любой другой поток ядра, поток прерывания обладает своим собст­венным идентификатором, приоритетом, контекстом и стеком.

  2. Ядро управляет доступом к структурам данных и синхронизирует потоки пре­рываний с помощью примитивов взаимоисключений (рассматривающихся в главе 5, "Параллельные вычисления: взаимоисключения и многозадачность"). Таким образом, для обработки прерываний используются обычные методы син­хронизации потоков.

  3. Потокам прерываний присваиваются более высокие приоритеты, чем всем другим типам потоков ядра.

Если происходит прерывание, оно передается определенному процессору, а выполняющийся на этом процессоре поток закрепляется. Закрепленный поток не может перейти на другой процессор; его контекст сохраняется, и процесс приостанавливается до тех пор, пока не будет обработано прерывание. После этого процессор приступает к выполнению потока прерывания. В наличии всегда имеется запас деактивированных потоков прерываний, так что новый поток соз­давать не нужно. Затем исполняется поток, в котором происходит обработка прерывания. Если программе обработки понадобится доступ к структуре данных, которая каким-то образом заблокирована и используется другим потоком, поток прерывания должен ждать. Поток прерывания может быть вытеснен только дру­гим потоком прерывания с более высоким приоритетом.

Опыт использования потоков прерываний в операционной системе Solaris свидетельствует о том, что такой подход обеспечивает производительность, превосходя­щую производительность традиционных методов обработки прерываний [KLEI95].

4 6. Управление процессамии потоками в linux

Процессы в Linux

В операционной системе Linux процесс, или задание, представляется струк­турой данных task_struct. Linux поддерживает таблицу task, представляю­щую собой линейный вектор указателей на каждую определенную в данный мо­мент структуру данных task_struct. В этой структуре данных информация разбита на следующие категории.

  • Состояние. Состояние выполнения процесса (выполняющийся, готовый к выполнению, приостановленный, остановленный, зомби).

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

  • Идентификаторы. Каждый процесс обладает своим собственным идентифи­катором, а также идентификаторами пользователя и группы. Идентифика­тор группы используется для того, чтобы назначить группе пользователя права доступа к ресурсам.

  • Обмен информацией между процессами. В операционной системе Linux ис­пользуется такой же механизм межпроцессного взаимодействия, как и в опе­рационной системе UNIX SVR4, описанной в главе 6, "Взаимоблокировка и голодание".

  • Связи. Каждый процесс содержит в себе связи с параллельными ему про­цессами, с родственными ему процессами (с которыми он имеет общий ро­дительский процесс) и связи со всеми своими дочерними процессами.

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

  • Файловая система. Содержит в себе указатели на все файлы, открытые данным процессом.

  • Виртуальная память. Определяет отведенную данному процессу виртуаль­ную память.

  • Контекст, зависящий от процессора. Информация по регистрам и стеку, со­ставляющая контекст данного процесса. На рис. 4.18 показаны состояния выполнения процесса.

  • Выполняющийся. Это состояние отвечает на самом деле двум состояниям: текущий процесс либо выполняется, либо готов к выполнению.

  • Прерываемый. Это состояние блокировки, в котором процесс ожидает на­ступления события, например, завершения операции ввода-вывода, освобо­ждения ресурса или сигнала от другого процесса.

  • Непрерываемый. Это состояние блокировки другого рода. Его отличие от предыдущего состоит в том, что в непрерываемом состоянии процесс непо­средственно ожидает выполнения какого-то аппаратного условия, поэтому он не воспринимает никаких сигналов.

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

  • Зомби. Процесс был прекращен, но по какой-то причине его структура ос­тается в таблице процессов.

Потоки в Linux

В операционной системе Linux новый процесс создается путем копирования атрибутов текущего процесса. Новый процесс может быть клонирован (cloned); при этом такие ресурсы, как файлы, обработчики сигналов и виртуальная па­мять, используются совместно. Если два процесса пользуются одной и той же виртуальной памятью, они функционируют как потоки в рамках одного и того же процесса. Однако для потоков структуры данных отдельно не задаются. Та­ким образом, в операционной системе Linux потоки и процессы не различаются.