9. Диспетчеризация
События t
Диспетчер |
|
|
|
|
|
|
|
t |
Задача 1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
t |
|
|
|
|
|
|
|
|
||
Задача 2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
t |
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
События
Очереди блокированных
BQ1 |
|
|
|
|
|
|
|
|
|
|
|
Исполняемая |
|
|
. . . |
|
|
|
ДИСПЕТЧЕР |
|
|
||||
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
задача |
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
BQn |
|
|
|
|
|
|
|
|
|
|
|
|
RQ1
. . .
RQn
Очереди готовых
9. Диспетчеризация 2015 v.01 |
1 |
Смена состояний по событиям
создание задачи
событие
Ready
активизация ресурс освободился
|
вытеснение |
Blocked |
Running |
ресурс занят
действие диспетчера
9. Диспетчеризация |
2015 v.01 |
2 |
Состояние Running, дисциплины переключения
Разделение времени (Time clicing)
Тик Таймера (событие) |
|
|
|
|
|
|
|
|
t |
|
|
|
|
|
|
|
|
|
|
Диспетчер |
|
|
|
|
|
|
|
|
t |
|
|
|
|
|
|
|
|
||
Задача 1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
t |
|
|
|
|
|
|
|
|
|
||
Задача 2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
t |
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
При ограничениях жесткого реального времени применение проблематично
Вытеснение (preempting)
Событие |
|
|
|
|
|
|
|
|
t |
(Не только тик таймера) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Диспетчер |
|
|
|
|
|
|
|
|
t |
Задача 1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
t |
|
|
|
|
|
|
|
|
|
||
Задача 2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
t |
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
9. Диспетчеризация |
2018 v.01 |
3 |
Типы событий, вызывающих переключение
Внешние |
|
|
прерывания, |
Системные |
Исключения - аппаратные |
прерывания от |
||
таймера |
вызовы |
сбои (interrupt), деление на |
(interrupt) |
(trap) |
0 (trap) |
Обработка
аппаратных
прерываний
Диспетчер
case of i
create_task suspend_task
create_timer
...
Управление задачами
Обработка
исключительных
ситуаций
Возврат в задачу
9. Диспетчеризация 2015 v.01 |
4 |
Состояние Ready, очереди «готовых»
Приоритеты
реального
времени
K
. .
i
. .
0
|
|
Нитки реального времени |
|
|
|
|
|||||||
|
|
|
|
|
. . . |
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
||||
|
|
TCB |
|
TCB |
|
TCB |
|
|
|
||||
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|||
. |
|
Очереди задач реального |
|
|
|
||||||||
|
времени (preempting) |
|
|
|
|
||||||||
|
|
|
|
Real-time threads |
|||||||||
|
|
|
|
|
|
. . . |
|
|
|
|
|||
|
|
TCB |
|
TCB |
|
|
TCB |
|
|||||
|
|
|
|
|
|
¨ |
Вытеснение на основе |
||||||
. |
|
|
|
|
|
|
|
|
|
|
|
|
приоритетов |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Нитки «нереального времени» |
|
Non real-time threads |
|||||||||
|
|
|
|
|
|
. . . |
|
|
|
||||
|
|
TCB |
|
TCB |
|
TCB |
|
¨ |
Time slicing в соответствии с |
||||
|
|
|
|
|
|
приоритетами «нереального» |
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
1 |
|
|
|
|
|
N |
|
|
времени |
|
|
|
|
Очередь задач |
|
|
|
|
«нереального» времени (time-slicing)
9. Диспетчеризация 2015 v.01 |
5 |
Инициирование переключения
События вызывают прерывания
•Аппаратные (interrupt)
сигналы от аппаратуры – готовность АЦП, таймер, нажатие кнопки
на функцианальной клавиатуре ...
•Программные (trap)
обращение к функциям, реализующим API (системные вызовы) – создание задачи, завершение задачи, приостановка задачи, вызов семафорной операции ....
Прерывания инициируют переключение задач
9. Диспетчеризация 2014 v.01 |
6 |
|
|
Состояния потока QNX |
CONDVAR |
Waiting for a condition variable to be signaled. |
|
DEAD Dead. Kernel is waiting to release the thread's resources. |
||
INTR |
Waiting for an interrupt. |
|
JOIN Waiting for the completion of another thread. |
||
MUTEX |
Waiting to acquire a mutex. |
|
NANOSLEEP Sleeping for a period of time. |
||
NET_REPLY Waiting for a reply to be delivered across the network. |
||
NET_SEND |
Waiting for a pulse or message to be delivered across the network. |
|
READY |
Not running on a CPU, but is ready to run |
|
|
(one or more higher or equal priority threads are running). |
|
RECEIVE |
Waiting for a client to send a message. |
|
REPLY |
Waiting for a server to reply to a message. |
|
RUNNING |
Actively running on a CPU. |
|
SEM Waiting to acquire a semaphore. |
||
SEND |
Waiting for a server to receive a message. |
|
SIGSUSPEND |
Waiting for a signal. |
|
SIGWAITINFO |
Waiting for a signal. |
|
STACK |
Waiting for more stack to be allocated. |
|
STOPPED |
Suspended (SIGSTOP signal). |
|
WAITCTX |
Waiting for a register context (usually floating point) |
|
|
to become available (only on SMP systems). |
|
WAITPAGE |
|
Waiting for process manager to resolve a fault on a page. |
WAITTHREAD |
Waiting for a thread to be created. |
9. Диспетчеризация 2015 v.01 |
7 |
Дисциплины диспетчеризации (POSIX)
SCHED_FIFO — диспетчеризация с постоянными приоритетами потоков; поток работает до конца, если не будет заблокирован или вытеснен более приоритетным потоком
SCHED_RR — аналогично SCHED_FIFO, с той разницей, что потоку выделяется временной квант, по истечению которого его вытесняет поток равного приоритета
SCHED_OTHER — в настоящее время идентично SCHED_RR. SCHED_SPORADIC — «спорадический сервер».
main() { } |
tid 1 p=10 |
thread 2 |
tid 2 p=12 |
pid 1 |
thread 1 tid 1 p=12
thread 2 tid 2 p=10
thread 3 tid 3 p=12
pid 2
•Диспетчеризация определяется на уровне потоков
•Диспетчеризация вытесняющая (preempting)
•«Принудительное вытеснение» - функция sched_yield()
•Функции «пассивной задержки» - sleep(), nanosleep(), delay() вызывают вытеснение
9. Диспетчеризация |
2015 v.01 |
8 |