- •Глава 4. Процессы и потоки
- •4.1. Планирование процессов и потоков
- •4.1.1. Понятия «процесс» и «поток»
- •4.1.2. Назначение подсистемы управления процессами и потоками
- •4.1.3. Создание процессов и потоков
- •4.1.4. Планирование и диспетчеризация потоков
- •4.1.5. Состояния потока
- •4.1.6. Вытесняющие и невытесняющие алгоритмы планирования
- •4.1.8. Алгоритмы планирования, основанные на приоритетах
- •4.1.7. Алгоритмы планирования, основанные на квантовании
- •4.1.9. Смешанные алгоритмы планирования
- •4.1.10. Планирование в системах реального времени
- •4.1.11. Моменты перепланировки
- •4.2. Мультипрограммирование на основе прерываний
- •4.2.1. Назначение и типы прерываний
- •4.2.2. Механизм прерываний
- •4.2.3. Программные прерывания
- •4.2.4. Диспетчеризация и приоритезация прерываний в ос
- •4.2.5. Системные вызовы
- •4.3. Синхронизация процессов и потоков
- •4.3.1. Цели и средства синхронизации
- •4.3.2. Необходимость синхронизации и гонки
- •4.3.3. Критическая секция и блокирующие переменные
- •4.3.4. Семафоры
- •4.3.5. Тупики
- •Вопросы для самоконтроля
4.1.5. Состояния потока
ОС выполняет планирование потоков, принимая во внимание их состояние. В мультипрограммной системе поток может находиться в одном из трех основных состояний:
выполнение — активное состояние потока, во время которого поток обладает всеми необходимыми ресурсами и непосредственно выполняется процессором;
ожидание — пассивное состояние потока, находясь в котором, поток заблокирован по своим внутренним причинам (ждет осуществления некоторого события, например завершения операции ввода-вывода, получения сообщения от другого потока или освобождения какого-либо необходимого ему ресурса);
готовность — также пассивное состояние потока, но в этом случае поток заблокирован в связи с внешним по отношению к нему обстоятельством (имеет все требуемые для него ресурсы, готов выполняться, однако процессор занят выполнением другого потока).
В течение своей жизни каждый поток переходит из одного состояния в другое в соответствии с алгоритмом планирования потоков, принятым в данной операционной системе.
Рассмотрим типичный граф состояния потока (рис. 4.1). Только что созданный поток находится в состоянии готовности, он готов к выполнению и стоит в очереди к процессору. Когда, в результате планирования, подсистема управления потоками принимает решение об активизации данного потока, он переходит в состояние выполнения и находится в нем до тех пор, пока либо он сам освободит процессор, перейдя в состояние ожидания какого-нибудь события, либо будет принудительно «вытеснен» из процессора, например вследствие исчерпания отведенного данному потоку кванта процессорного времени. В последнем случае поток возвращается в состояние готовности. В это же состояние поток переходит из состояния ожидания, после того как ожидаемое событие произойдет.
В состоянии выполнения в однопроцессорной системе может находиться не более одного потока, а в каждом из состояний ожидания и готовности — несколько потоков. Эти потоки образуют очереди соответственно ожидающих и готовых потоков. Очереди потоков организуются путем объединения в списки их описателей. Таким образом, каждый описатель потока, кроме всего прочего, содержит по крайней мере один указатель на другой описатель, соседствующий с ним в очереди. Такая организация очередей позволяет легко их переупорядочивать, включать и исключать потоки, переводить потоки из одного состояния в другое. Если предположить, что на рис. 4.2 показана очередь готовых потоков, то запланированный порядок выполнения выглядит так: А, В, Е, D, С.
4.1.6. Вытесняющие и невытесняющие алгоритмы планирования
Все множество алгоритмов планирования можно разделить на два класса: вытесняющие и невытесняющие алгоритмы планирования.
Невытесняющие (non-preemptive) алгоритмы основаны на том, что активному потоку позволяется выполняться, пока он сам, по собственной инициативе, не отдаст управление операционной системе для того, чтобы та выбрала из очереди другой готовый к выполнению поток.
Вытесняющие (preemptive) алгоритмы — это такие способы планирования потоков, в которых решение о переключении процессора с выполнения одного потока на выполнение другого потока принимается операционной системой, а не активной задачей.
Основным различием между вытесняющими и невытесняющими алгоритмами является степень централизации механизма планирования потоков. При вытесняющем мультипрограммировании функции планирования потоков целиком сосредоточены в операционной системе и программист пишет свое приложение, не заботясь о том, что оно будет выполняться одновременно с другими задачами. При этом операционная система выполняет следующие функции: определяет момент снятия с выполнения активного потока, запоминает его контекст, выбирает из очереди готовых потоков следующий, запускает новый поток на выполнение, загружая его контекст.
При невытесняющем мультипрограммировании механизм планирования распределен между операционной системой и прикладными программами. Прикладная программа, получив управление от операционной системы, сама определяет момент завершения очередного цикла своего выполнения и только затем передает управление ОС с помощью какого-либо системного вызова. ОС формирует очереди потоков и выбирает в соответствии с некоторым правилом (например, с учетом приоритетов) следующий поток на выполнение. Такой механизм требует определенного подхода к программированию приложений, то есть разработчики приложений, для операционной среды с невытесняющей многозадачностью, вынуждены, возлагая на себя часть функций планировщика, создавать приложения так, чтобы они выполняли свои задачи небольшими частями.
Почти во всех современных операционных системах, ориентированных на высокопроизводительное выполнение приложений, реализованы вытесняющие алгоритмы планирования потоков (процессов).
