Часть II.
Функциональность RTX
Управление процессами и потоками
В этом разделе обсуждается следующие темы:
Использование процессов и потоков
Понятие процесса включает в
себя адресное пространство, хэндлы объектов и один или несколько исполняемых
потоков. Потоки используются, например, в качестве обработчиков прерываний
и для обработки асинхронных, связанных с процессом событий, в контексте
потока. Функционирование потоков и
процессов в RTSS во многом аналогично Win32.
Использование процессов
Ниже кратко описывается работа процессов в RTSS и Win32 среде.
Процессы
в RTSS подсистеме
Процесс, исполняющийся в
RTSS, состоит из набора хэндлов объектов, адресного пространства процесса,
по меньшей мере одного потока и исполняемого файла. При создании процесса
RTSS выполняет следующие действия:
- Загружает исполняемый файл,
как драйвер
- Выделяет процессу heap из non-paged
kernel page pool
- Создает основной поток
Процесс может быть запущен одним
из следующих способов:
- Загрузка в качестве драйвера
устройства во время загрузки системы (используя утилиту RTSSrun)
- Выполнение RTSS-программы из
Win32
Процесс прекращает работы при
одном из следующих условий:
- Последний поток закончил работу
- Один из потоков вызвал ExitProcess
- Процесс убит утилитой RTSSkill
Максимальное число процессов,
одновременно существующих в RTSS, равняется числу слотов RTSS-процессов,
заданному в регистре (по умолчанию 10). RTSS-процесс не может использоваться
в качестве объекта синхронизации.
Процессы
в Win32 подсистеме
Процессы, выполняющиеся подсистеме
Win32, начинают взаимодействовать с RTX, когда они вызывают функции RTAPI.
Такой вызов связывает процесс с rtapi_w32.dll. После этого RTX может выделять
ресурсы для этого процесса, изменять его приоритет и т.д. Число Win32 процессов,
которое может взаимодействовать с RTX, непостоянно – оно зависит от конфигурации
системы и свободных ресурсов.
Использование потоков
Функция CreateThread создает
либо RTSS, либо Win32 поток, в зависимости от текущей исполняющей подсистемы
процесса. Возвращаемый хэндл и ID потока действителен только в окружении,
вызвавшем CreateThread. Например,
Win32 процесс не может управлять приоритетом RTSS потока, потому что хэндл
этого потока действителен только в RTSS подсистеме. Вы можете, однако,
использовать средства межпроцессного взаимодействия (Inter-Process
Communication,IPC), предоставляемые
RTX – такие как mutex, semaphore, events и shared
memory – для синхронизации и коммуникации
между Win32 и RTSS процессами и потоками. См. раздел “Межпроцессное взаимодействие”.
Объекты таймеры и прерывания
Объекты-таймеры и прерывания
происходят от потоков, следовательно, хэндлы этих объектов действительны
только в их собственной (Win32 или RTSS) среде. Аналогично, этими объектами
можно управлять только из процессов в их собственной среде.
RTSS подсистема
Единицей исполнения в подсистеме
RTSS является поток. Готовый к исполнению RTSS-поток получает приоритет
над всеми Win32 потоками. RTSS-поток исполняется до тех пор, пока он не
освободит CPU. Поток освобождает CPU, когда он:
- Ожидает объекта синхронизации
- Понижает собственный приоритет
или повышает приоритет другого потока
- Подвешивает (suspend) себя
- Возвращается из процедуры обработки
таймера или прерывания (относится только к потокам таймера и прерывания)
- Вызывает функцию Sleep c аргументом
0
RTSS-потоки не могут быть использованы
как объекты синхронизации. Первичный поток процесса имеет стек размером
8 KB. Можно указать размер стека созданных впоследствии потоков с помощью
функции CreateThread.
Приоритеты потоков
В этом разделе описывается система
приоритетов потоков в RTSS и Win32 подсистемах.
RTSS подсистема
RTSS подсистема не имеет
понятия классов приоритетов, поэтому потоки всех RTSS-процессов состязаются
за процессорное время только на основании приоритетов потоков. Поток в
RTSS может иметь один из 128 уровней приоритета. Потоки выполняются в соответствии
с приоритетом, а потоки одного приоритета – по принципу FIFO (first in-first
out). Потоки не квантуются по времени. Это означает, что исполняющийся
поток будет выполняться, до тех пор, пока не освободит CPU или внешнее
событие не подготовит поток с более высоким приоритетом. Планировщик RTSS
использует протокол продвижения приоритета
для предотвращения инверсии приоритетов.
Win32 подсистема
Win32 RTX программа начинает
исполняться в real-time классе приоритета. RTX обеспечивает соответствие
между приоритетами в Win32 и RTSS. Однако, планировщик Win32 не исключает
инверсии приоритетов.
В таблице 1 показано, как
имена приоритетов RTSS транслируются в приоритеты Win32 при вызове функции
RtSetThreadPriority из
Win32 программы.
Таблица 1.
RTSS Symbolic Priority Name |
RTSS Value |
Windows NT Symbolic Priority Name
for Real-Time Priority Class |
Win32 Value |
RT_PRIORITY_MIN |
0 |
THREAD_PRIORITY_IDLE |
16 |
RT_PRIORITY_MIN
+ 1 |
1 |
THREAD_PRIORITY_LOWEST |
22 |
RT_PRIORITY_MIN
+ 2 |
2 |
THREAD_PRIORITY_BELOW_NORMAL |
23 |
RT_PRIORITY_MIN
+ 3 |
3 |
THREAD_PRIORITY_NORMAL |
24 |
RT_PRIORITY_MIN
+ 4 |
4 |
THREAD_PRIORITY_ABOVE_NORMAL |
25 |
RT_PRIORITY_MIN+
5 …+ 126 |
5…126 |
THREAD_PRIORITY_HIGHEST |
26 |
RT_PRIORITY_MAX |
127 |
THREAD_PRIORITY_TIME_CRITICAL |
31 |
Например, вызов RtSetThreadPriority(Thread,RT_PRIORITY_MIN+1)
преобразуется
в SetThreadPriority(Thread, THREAD_PRIORITY_LOWEST)
Если Win32 программа вызывает
RtGetThreadPriority(), возвращается
real-time приоритет, указанный в вызове RtSetThreadPriority().
В таблице 2 показано, как
преобразуются вызовы Win32 “set” и “get” в RTSS подсистеме.
Таблица 2.
Windows NT
Symbolic Priority Name for Real-Time Priority Class |
Win32 Value |
RTSS Symbolic Priority Name |
Value |
THREAD_PRIORITY_IDLE |
16 |
RT_PRIORITY_MIN |
0 |
THREAD_PRIORITY_LOWEST |
22 |
RT_PRIORITY_MIN
+ 1 |
1 |
THREAD_PRIORITY_BELOW_NORMAL |
23 |
RT_PRIORITY_MIN
+ 2 |
2 |
THREAD_PRIORITY_NORMAL |
24 |
RT_PRIORITY_MIN
+ 3 |
3 |
THREAD_PRIORITY_ABOVE_NORMAL |
25 |
RT_PRIORITY_MIN
+ 4 |
4 |
THREAD_PRIORITY_HIGHEST |
26 |
RT_PRIORITY_MIN
+ 5 |
5 |
THREAD_PRIORITY_TIME_CRITICAL |
31 |
RT_PRIORITY_MAX |
127 |
Между THREAD_PRIORITY_IDLE и THREAD_PRIORITY_HIGHEST
нет других уровней приоритетов. Если необходим более широкий набор приоритетов в этом диапазоне, надо использовать спектр приоритетов RTSS.
Назад | Содержание | Вперед