Краткие теоретические сведения. Процессорное время выделяется потокам в соответствии с их уровнем приоритета

Процессорное время выделяется потокам в соответствии с их уровнем приоритета. Потоку с более низким приоритетом не выделяется время, если на него претендует поток с более высоким уровнем приоритета. Более того, про­цесс с более низким приоритетом прерывается до истечения кванта времени, если на процессор претендует более приоритетный поток.

Уровни приоритетов варьируются в диапазоне от 0 (низший) до 31 (высший).

Действующий приоритет каждого потока образуют три составляющие: класс приоритета процесса, уровень приоритета потока внутри класса при­оритета процесса, динамический уровень приоритета.

Класс приоритета процесса и уровень приоритета потока внутри класса определяют базовый уровень приоритета потока. Привилегированными счита­ются приоритеты от 16 до 31, они резервируются за системными программами реального времени. Прикладная программа получить приоритет выше 15 не может.

Определены следующие классы приоритетов, которым соответствуют константы:

– Idle (простаивающий) – IDLE_PRIORITY_CLASS (4), процесс активи­зируется только при простое других процессов;

– Normal (нормальный) – NORMAL_PRIORITY_CLASS (7), большинство процессов в системе, в частности, все процессы пользователя; приоритет владеющего активным окном процесса повышается на 2 и составляет 9;

– High (высокий) – HIGH_PRIORITY_CLASS (13), системные процессы, реагиру­ющие на соответствующие события;

– Real time (реального времени) – REALTIME_PRIORITY_CLASS (24), некоторые системные процессы в "особых случаях".

Внутри классов приоритетов процессов определены уровни приоритетов потоков:

– низший (THREAD_PRIORITY_LOWEST) – –2 от уровня класса;

– пониженный (THREAD_PRIORITY_BELOW_NORMAL) – –1 от уровня класса;

– нормальный (THREAD_PRIORITY_NORMAL) – равен уровню класса;

– повышенный (THREAD_PRIORITY_ABOVE_NORMAL) – +1 к уровню класса;

– высший (THREAD_PRIORITY_HIGHEST) – +2 к уровню класса;

– простаивающий (THREAD_PRIORITY_IDLE) – равен 16 для REALTIME_­PRIORITY_­CLASS и 1 для остальных классов;

– «критический» (THREAD_PRIORITY_TIME_CRITICAL) – равен 31 для REALTIME_PRIORITY_CLASS и 15 для остальных классов.

Для класса REALTIME_PRIORITY_CLASS может использоваться также расширенный диапазон значений – от –7 до +6. Начиная с Windows 2003 были добавлены два специальных значения: THREAD_MODE_BACKGROUND_BEGIN и THREAD_MODE_BACKGROUND_END, они связаны с дополнительными возмож­ностями планировщика.

Динамический уровень приоритета образуется повышением базового уровня потока на две единицы при поступлении сообщений в его очередь; по истечении некоторого времени восстанавливается исходное значение. Вре­менное повышение приоритета делается также и для долго не получавшего управление потока. Эти правила действуют только для потоков с уровнем приоритета не выше 15.

Для управления приоритетами выполнения процессов и потоков служат следующие функции.

GetPriorityClass() – получение текущего класса приоритета для процесса;

SetPriorityClass() – установка класса приоритета для процесса;

GetThreadPriority() – получение текущего приоритета выполнения потока;

SetThreadPriority() – установка приоритета выполнения потока.

В сбалансированной системе высокоприоритетные потоки выполняют, как правило, короткие операции, связанные с реагированием на события. Кроме того, само событийное управление процессами предполагает частое переклю­чение в состояние ожидания. Это дает шанс на исполнения потокам с низким уровнем приоритета.

Контрольные вопросы

1. Понятия приоритета процесса и потока. Роль приоритетов в плани­ровании выполнения задач.

2. Классы приоритетов. Краткая характеристика основных классов при­ори­тетов.

3. Функция для получения всех выполняющихся в данный момент про­цессов. Ее параметры и использование.

4. Функция для получения всех модулей заданного процесса. Ее пара­метры и использование.

5. Основные функции для управления приоритетами.

6. Создание всплывающих меню.

Задание

Написать программу, на главном окне которой будет показан ListBox, в который должны быть занесены все доступные из выполняющихся в данный момент процессов и их приоритеты. При выборе какого-нибудь из них во втором ListBox-е должны быть показаны его модули. Также должно быть реализовано всплывающее при нажатии правой кнопки мышки меню, в которое должны быть занесены основные классы приоритетов. При выборе какого-либо пункта данного меню приоритет выбранного в первом ListBox процесса должен измениться на заданный.

 

Лабораторная работа №14
Реестр Windows

Цели работы:

1) изучение системного реестра Windows;

2) изучение API для работы с реестром;

3) практическое ознакомление с некоторыми задачи, связанными с работой с реестром.