Мы уже ознакомились с двумя типами блокирующих состояний: когда поток заблокирован в ожидании мутекса, этот поток находится в состоянии блокировки по мутексу (MUTEX). Когда поток заблокирован, ожидая семафор, он находится в состоянии блокировки по семафору (SEM). Эти состояния просто указывают, в очереди на какой ресурс поток заблокирован.
Если по мутексу заблокировано несколько потоков, ядро не уделит им никакого внимания
Почему «при необходимости»? У потока, который только что освободил мутекс, вполне могут быть и другие дела, и он может иметь более высокий приоритет, чем все остальные ожидающие процессор потоки. В этом случае мы следуем второму правилу, которое гласит: «всегда должен выполняться поток с наивысшим приоритетом», что означает, что порядок диспетчеризации не изменяется — поток с наивысшим приоритетом продолжает работать.
Ниже представлен полный список блокированных состояний с краткими пояснениями. Этот список, кстати, есть в заголовочном файле
, только там эти состояния снабжены префиксом «STATE_» (например, состояние READY данной таблицы там будет звучать как STATE_READY).
Если состояние потока: | To это значит, что: |
---|---|
DEAD | Поток «мертв», ядро ожидает освобождения занятых им ресурсов. (В классических UNIX системах это состояние также называют «zombie» — «зомби» — |
RUNNING | Поток выполняется. |
READY | Поток не выполняется, но готов к работе (работает один или более потоков с более высокими или равными приоритетами). |
STOPPED | Поток приостановлен (по сигналу SIGSTOP |
SEND | Поток ожидает приема своего сообщения сервером. |
RECEIVE | Поток ожидает сообщение от клиента. |
REPLY | Поток ожидает от сервера ответ на свое сообщение. |
STACK | Поток ожидает распределения дополнительного стекового пространства. |
WAITPAGE | Поток ожидает устранения администратором процессов повреждения на странице. |
SIGSUSPEND | Поток ожидает сигнал. |
SIGWAITINFO | Поток ожидает сигнал. |
NANOSLEEP | Поток «спит» (приостановлен на определенный период времени). |
MUTEX | Поток ожидает захват мутекса. |
CONDVAR | Поток ожидает соблюдения условия условной переменной. |
JOIN | Поток ожидает завершения другого потока. |
INTR | Поток ожидает прерывание. |
SEM | Поток ожидает захват семафора. |
Важно помнить о том, что когда поток блокирован, независимо от
Мы рассмотрим блокированные состояния SEND (блокировка по передаче), RECEIVE (блокировка по приему) и REPLY (блокировка по ответу) в главе «Обмен сообщениями». Состояние NANOSLEEP связано с применением функций типа
Процессы и потоки
Вернемся к нашим рассуждениям о потоках и процессах, но на сей раз с точки зрения перспективы их применения в системах реального времени. Затем мы рассмотрим вызовы функций, которые применяются при работе с потоками и процессами.
Мы знаем, что процесс может содержать один или больше потоков. (Процесс с нулевым числом потоков не был бы способен что-либо
Что же делают все эти процессы и потоки? В конечном счете, они формируют систему — собрание потоков и процессов, реализующих определенную цель.