Управление памятью
В этом разделе обсуждаются
следующие вопросы:
Выделение системной памяти
Часто процессу требуется
выделить дополнительную память. Функции выделения памяти, существующие
в RTX, всегда выделяют блокированную (locked) память, исключая, таким образом,
задержки, связанные с ошибками страниц (page faults).
API выделения памяти
Следующие функции служат
для доступа к системе выделения памяти RTX:
- RtAllocateLockedMemory –
- выделяет
блокированную память, которой соответствует физическая память, затем проецирует
память в виртуальное адресное пространство процесса.
- RtFreeLockedMemory –
- высвобождает
предварительно выделенный блокированный участок памяти.
Замечания по выделению памяти
Блокированная память
всегда выделяется из non-paged пула памяти Windows NT. Этот пул памяти
сравнительно мал и вскоре после загрузки системы становится фрагментированным
в результате выделения памяти драйверам и другим подсистемам Windows NT.
Чтобы избежать неудач при попытках выделить большой участок памяти, надо
делать это сразу после загрузки и/или вообще минимизировать такие выделения.
В данном примере
демонстрируется использование функций выделения блокированной памяти.
Блокировка системной памяти
Для предотвращения ошибок
страниц и, следовательно, непредсказуемых задержек в критическом по времени
участке кода, real-time приложения должны блокировать данные и код в памяти,
включая код и данные самой операционной системы.
API блокирования процессов
Следующие функции служат
для блокировки памяти RTX процесса:
- RtLockProcess –
-
блокирует все pageable секции
процесса в физической памяти.
- RtUnlockProcess –
- разблокирует
секции виртуального адресного пространства процесса, блокированные ранее
в физической памяти.
- RtCommitLockProcessHeap –
- блокирует кучу процесса.
- RtCommitLockHeap –
- блокирует указанную при вызове кучу.
- RtCommitLockStack -
- блокирует указанный при вызове стек.
Замечания по программированию в RTSS подсистеме
По умолчанию, все процессы
и объекты в RTSS подсистеме блокированы в физической памяти. Следовательно,
выполнение RTSS процесса никогда не повлечет ошибку страницы. Вызов функций
Rt*Lock (Process, Heap, Stack)
в RTSS подсистеме всегда завершается успешно, но не влечет за собой никаких
реальных действий.
Замечания по программированию
в Win32 подсистеме
Любые процессы и службы
Windows NT могут сбрасывать страницы на диск, если только явным образом
не блокированы в физической памяти. Для того, чтобы real-time процесс не
осуществлял такой сброс страниц, надо использовать функцию RtLockProcess.
В данном примере
демонстрируется использование функций блокирования процесса.
API блокирования ядра
Следующие функции служат
для доступа к RTX-службам блокирования ядра:
- RtLockKernel –
- блокирует pageable участки ядра в физической памяти.
- RtUnlockKernel –
- разблокирует предварительно блокированные участки ядра Windows NT.
Замечания по программированию в RTSS подсистеме
По умолчанию, все процессы
и объекты в RTSS подсистеме блокированы в физической памяти. Блокирование
ядра Windows NT не повлияет на производительность RTSS процесса.
Замечания по программированию в Win32 подсистеме
- Определенные компоненты
Windows NT подвержены пэйджингу (pageable), включая большую часть ядра
и подсистемы Win32. Для предотвращения задержек в работе real-time процесса,
связанных с ошибками страниц, надо использовать функцию RtLockKernel.
- Драйверы устройств в Windows
NT обычно не осуществляют пэйджинг. Драйверы устройств, загружаемые во
время загрузки системы, никогда не делают пэйджинг. Для того, чтобы система
могла сбрасывать страницы драйвера, разработчик такого драйвера должен
тщательно продумать его структуру и явным образом указать участки кода,
которые можно сбрасывать. Из-за своей сложности такие драйверы встречаются
редко.
- Блокирование ядра Windows NT
и процессов уменьшает пул доступной физической памяти. Это может кардинальным
образом сказаться на производительности не real-time части системы. При
необходимости для обеспечения желаемой производительности не real-time
операций можно просто добавить физической памяти.
В данном
примере
демонстрируется использование функций блокирования ядра..
Использование часов и таймеров
В системах реального времени
активно используются различные службы времени. Операционная система должна
быть способна отслеживать текущее время, в точно определенное время запускать
потоки на исполнение и приостанавливать потоки на точно определенный интервал.
Следующие части описывают:
- Часы
- Таймеры
- Приостановку процессов (sleep)
Часы
Часы в RTX отсчитывают прохождение
определенных интервалов времени.
API
Следующие функции служат
для доступа к RTX-службам часов:
- RtGetClockTime –
- возвращает текущее значение указанных часов.
- RtSetClockTime –
- устанавливает значение указанных часов.
- RtGetClockResolution -
- возвращает разрешение указанных часов.
- RtGetClockTimerPeriod –
- возвращает минимальный период таймера для указанных часов.
Значения часов возвращаются
и устанавливаются в единицах 100 наносекунд и соответствуют числу прошедших
единиц с 12:00 1 Января 1600.
Типы часов
Часы RTX в Win32 и
RTSS подсистемах могут быть:
- CLOCK_1 (или CLOCK_SYSTEM)
- CLOCK_2 (или CLOCK_FASTEST)
Часы CLOCK_1 обеспечиваются
real-time HAL и имеют разрешение 1 миллисекунду. Потоки в Win32 и RTSS
подсистемах могут, основываясь на этих часах, использовать таймеры с инкрементом
в 1 миллисекунду.
Часы CLOCK_2 также обеспечиваются
real-time HAL и имеют разрешение 1 микросекунду. Период таймеров, основывающихся
на этих часах, переменный и может составлять 100, 200, 500 и 1000 микросекунд.
Период таймера HAL можно
установить либо в контрольной панели “RTX settings”, либо в ключе реестра
HKLM\System\CurrentControlSet\Control\RTX\HalTimerPeriod
(и перезагрузиться).
Таймеры
Таймеры RTX являются скрытыми
потоками-обработчиками, которые получают уведомление от RTSS о прохождении
определенного интервала времени и вызывают процедуру-обработчик таймера,
указанную при его создании.
При создании таймер ассоциируется
с определенными часами в системе, по их отсчету срабатывает таймер. Таймер
начинает отсчет после того, как был установлен. После того, как таймер
сработал и процедура-обработчик возвратила управление, таймер может быть
автоматически переустановлен. Таймеры, у которых интервал повторения установлен
в 0, являются “одноразовыми” и выполняют процедуру-обработчик один раз.
Таймеры, у которых установлен допустимый интервал повторения, будут выполнять
процедуру-обработчик с заданным интервалом.
API
Следующие функции служат
для доступа к RTX-службам таймеров:
- RtCreateTimer –
- создает таймер, связанный с указанными часами. RtDeleteTimer
– уничтожает ранее созданный таймер
- RtCancelTimer –
- прекращает срабатывание указанного таймера
- RtSetTimer –
- устанавливает абсолютное время срабатывания и интервал повтора для указанного таймера
- RtSetTimerRelative -
- устанавливает относительное время срабатывания и интервал повтора для указанного таймера
Отношение к таймерам в Windows NT
Таймеры в RTX не являются
объектами синхронизации. Это значит, что потоки не могут использовать Waifor..
функции с хэндлами RTX таймеров. Это отличает их от таймеров Windows NT,
являющихся объектами, которые поток может ожидать или получать уведомление.
Программирование в Win32 и RTSS подсистемах
Если приложение должно
информировать другие потоки о срабатывании таймера, оно должно использовать
соответствующий объект уведомления (notification object) в процедуре-обработчике
таймера.
Назад | Содержание | Вперед