Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
sp.docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
213.38 Кб
Скачать

25. Нити – альтернативное управление выполнением программы Управление нитями

Как было отмечено, нить Win 32 сходна с потоком и также является динамическим объектом, претендующим на процессорное время. Нить стоит в иерархии ниже потока: поток может состоять из одной и более нитей. Для идентификации нити служит "указатель на нить" – указатель на внутреннюю структуру, которая эту нить описывает. С точки зрения ОС нить представлена потоком, который в данный момент ее выполняет, переключение таких потоков планировщиком осуществляется обычным порядком, нити внутри потока для него безразличны. В любой момент из всех нитей потока активной может быть лишь одна. Одна­ко выбор активной нити среди прочих нитей потока производится самими нитями, вернее, активная в данный момент нить может передать управление любой другой, принадлежащей тому же потоку. Таким образом, вводится дополнительная возможность управления выпол­нением задачи, напоминающая невытесняющую (корпоративную) многозадачность и меха­низм "длинных переходов" (setjump() – longjump()), существовавший в классическом C.

Подобно потоку, нить порождается из функции с соответствующим форматом вызова. Нить-родитель создает новую нить с помощью функции CreateFiber(), но, в отличие от потока, новая нить всегда неактивна, активизировать ее можно только явно, поэтому выполнение нити-родителя не прерывается. Т.к. в передаче управления между нитями должны участвовать только нити, "первичная" нить создается путем преобразования потока с помощью функции ConvertThreadToFiber(), при этом выполнение текущего кода про­должается в естественном порядке, но уже "внутри" нити.

LPVOID ConvertThreadToFiber(LPVOID lpParam)

LPVOID CreateFiber(

DWORDdwStackSize, //размер стека для нити, 0 – стек по умолчанию

LPFIBER_START_ROUTINE lpStartAddr, //функция нити

LPVOIDlpParam //параметр функции нити

)

Обе функции возвращают "указатель на нить" типа LPVOID.

Типу функции нити FIBER_START_ROUTINE соответствует формат вызова:

VOID CALLBACK FiberRouting(LPVOID lpParam)

Управление нитями сводится к передаче управления между ними с помощью функции SwitchToFiber(), в результате чего выполнение текущей нити прерывается, и активи­зируется указанная нить. После возврата управления ранее прерванной нити ее выполнение продолжается сразу после точки прерывания.

VOIDSwitchToFiber(LPVOIDlpFiber)

Для получения указателя текущей нити служит функция:

PVOIDGetFiberData(VOID)

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

26. Распределение времени выполнения программ в многозадачной системе. Приоритеты. Распределение времени между потоками (управление приоритетами)

Помимо возможных состояний процесса (потока) и методов их переключения, функционирование системного планировщика описывается также и алгоритмом переклю­чения состояний. Непосредственное влияние на него оказывают т.н. система приоритетов.

Процессорное время выделяется потокам в соответствии с их уровнем приоритета. Потоку с более низким приоритетом не выделяется время, если на него претендует поток с более высоким уровнем приоритета. Более того, процесс с более низким приоритетом прерывается до истечения кванта времени, если на процессор претендует поток с более высоким уровнем приоритета. Необходимо помнить, что в среде Windows основная “работа” потока состоит в ожидании события и реагировании на него. Это дает шанс на исполнения потокам с низким уровнем приоритета.

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

Действующий приоритет каждого потока образуют три составляющие:

– класс приоритета процесса (простаивающий, нормальный, высокий, реального времени);

– уровень приоритета потока внутри класса приоритета процесса (нижний, ниже нормального, нормальный, выше нормального, высший);

– динамический уровень приоритета.

Класс приоритета процесса и уровень приоритета потока внутри класса определяют базовый уровень приоритета потока.

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

– 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 для остальных классов.

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

Примечание. Очевидно, что и базовый, и динамический приоритет любого (даже простаивающего) потока процесса, отнесенного к классу Real-time, всегда будет выше, чем у любого потока любого другого процесса.

Так как в Win32 более приоритетные процессы и потоки жестко вытесняют с исполнения менее приоритетные, назначать приоритеты в своих программах следует с осторожностью, придерживаясь следующего правила: чем выше приоритет, тем за более короткое время задача должна либо завершаться, либо переходить в неактивное состояние; в противном случае, работа системы может быть практически остановлена.

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

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

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

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]