Srv_08_15_01_Потоки.pptx
- Количество слайдов: 13
Выполняемая программа main () { …. pthread_create(…) …. } ТСВ Стек Потоки Программа ТСВ Стек 8. Потоки «Легковесные процессы» потоки #include
Пример #include
Атрибутная запись потока typedef struct { int size_t void int struct sched_param unsigned } pthread_attr_t flags; stacksize; *stackaddr; (*exitfunc)(void *status); policy; param; guardsize; flags «синхронизирующий/обособленный» наследует дисциплины диспетчеризации/нет stacksize размер стека stackaddr адрес стека (*exitfunc)(void *status) функция, выплняемая перед завершением потока рolicy дисциплина диспетчеризации struct sched_param параметры диспетчеризации guardsize размер «области защиты» «Вручную» не изменяются ! 8. Потоки 2015 v. 01 3
struct sched_param #include
Диспетчеризация задач Событие t Диспетчер t Задача 1 t Задача 2 t События Очереди блокированных BQ 1 . . . ДИСПЕТЧЕР Исполняемая задача BQn RQ 1 . . . RQn Очереди готовых 8. Потоки 2015 v. 01 5
Состояние Ready, Очереди «готовых» Приоритеты реального времени Нитки реального времени TCB . . . K . . . TCB . . . TCB Нитки «нереального времени» TCB 0 0 . . . TCB Очереди задач реального времени (preempting) TCB i TCB 1 . . . TCB N Real-time threads ¨ Вытеснение на основе приоритетов Non real-time threads ¨ Time slicing в соответствии с приоритетами «нереального» времени Очередь задач «нереального» времени (time-slicing) 8. Потоки 2015 v. 01 6
Типы событий, вызывающих переключение Внешние прерывания, прерывания от таймера (interrupt) Системные вызовы (trap) Исключения - аппаратные сбои (interrupt), деление на 0 (trap) case of i Обработка аппаратных прерываний create_task suspend_task Обработка исключительных ситуаций create_timer . . . Управление задачами Диспетчер Возврат в задачу 8. Потоки 2015 v. 01 7
Особенность системного вызова Системный стек «Приложение» Занести в стек <параметры> trap(i) Вектор программного прерывания - trap Адрес p Запоминание контекста, передача управления по адресу р команда “программного прерывания”; i – параметр, указывающий на тип события x: 8. Потоки Контекст «Приложения» в точке x Регистр указателя стека (SP) Адрес x <параметры> p: Диспетчер return Восстановление контекста, возврат из прерывания 2015 v. 01 8
TCB Состояния задачи создание задачи приоритет состояние Ready событие активизация ресурс освободился вытеснение Blocked Running ресурс занят действие диспетчера 8. Потоки 2015 v. 01 9 9
Состояния потока QNX CONDVAR Waiting for a condition variable to be signaled. DEAD Dead. Kernel is waiting to release 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. 8. Потоки 2015 v. 01 10
POLICY Дисциплины диспетчеризации 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 8. Потоки thread 1 tid 1 p=12 thread 2 tid 2 p=10 thread 3 tid 3 p=12 pid 2 2015 v. 01 • Диспетчеризация определяется на уровне потоков • Диспетчеризация вытесняющая (preempting) • «Принудительное вытеснение» функция sched_yield() • Функции «пассивной задержки» sleep(), nanosleep(), delay() вызывают вытеснение 11
Диспетчеризация с динамическим изменением приоритетов. Спорадический сервер Снижение приоритета R>0 R<=0 Восстановление ресурса t R C Т t С - выделенный временной ресурс Т - период восстановления ресурса R - остаточный ресурс 8. Потоки 2015 v. 01 12
Спорадический сервер Приоритет R>0 R<=0 Восстановление ресурса N t С Т t L t struct { int 32_t __ss_low_priority; int 32_t __ss_max_repl; struct timespec __ss_repl_period; struct timespec __ss_init_budget; }__ss; 8. Потоки 2015 v. 01 13


