Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпора 97.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
778.75 Кб
Скачать

3.4 Структура context

В структуре CONTEXT хранятся данные о состоянии регистров с учетом специфики конкретного процессора. Она используется системой для выполнения различных внутренних операций. Ее элементы четко соответствуют регистрам процессора.

Windows позволяет заглянуть внутрь объекта ядра «поток» и получить сведения о текущем состоянии регистров процессора. Для этого предназначена функция:

BOOL GetThreadContext(HANDLE hThread, PCONTEXT pContext).

3.5 Приоритеты потоков

Каждому потоку присваивается уровень приоритета от 0 (самый низкий) до 31 (самый высокий). Пока в системе имеются планируемые потоки с приоритетом 31, ни один поток с более низким приоритетом процессорного времени не получает. Такая ситуация называется «голоданием» (starvation). Система всегда старается, чтобы процессоры были загружены работой, и они простаивают только в отсутствие планируемых потоков.

Потоки с более высоким приоритетом всегда вытесняют потоки с более низким приоритетом независимо от того, исполняются последние или нет.

При загрузке системы создается особый поток, поток обнуления страниц (zero page thread), которому присваивается нулевой уровень приоритета. Он обнуляет свободные страницы в оперативной памяти при отсутствии других потоков, требующих внимания со стороны системы.

Windows поддерживает шесть классов приоритета: idle (простаивающий), below normal (ниже обычного), normal (обычный), above normal (выше обычного), high (высокий) и realtime (реального времени). Самый распространенный класс приоритета, естественно, normal; его использует 99% приложений.

REAL_TIME - потоки в этом процессе обязаны немедленно реагировать на события, обеспечивая выполнение критических по времени задач. Такие потоки вытесняют даже компоненты операционной системы.

HIGH - потоки в этом процессе тоже должны немедленно реагировать па события, обеспечивая выполнение критических по времени задач. Этот класс присвоен, например. Task Manager, что дает возможность пользователю закрывать больше неконтролируемые процессы

ABOVE_NORMAL - класс приоритета, промежуточный между NORMAL и HIGH.

NORMAL потоки в этом процессе не предъявляют особых требований к выделению им процессорного времени.

BELOW_NORMAL - класс приоритета, промежуточный между normal и idle

IDLE - потоки в этом процессе выполняются, когда система не занята другой работой. Этот класс приоритета обычно используется для утилит, работающих в фоновом режиме, экранных наставок и приложений, собирающих статистическую информацию.

Относительный приоритет потока

TIME_CRITICAL - поток выполняется с приоритетом 31 в классе REAL_TIME и с приоритетом 15 в других классах.

HIGHEST - поток выполняется с приоритетом на два уровня выше обычного для данного класса.

ABOVE_NORMAL - поток выполняется с приоритетом на один уровень выше обычного для данного класса.

NORMAL поток выполняется с обычным приоритетом процесса

для данного класса.

BELOW_Normal - поток выполняется с приоритетом на один уровень ниже обычного для данного класса.

LOWEST - поток выполняется с приоритетом на два уровня ниже обычного для данного класса.

IDLE - поток выполняется с приоритетом 16 в классе REAL_TIME и с приоритетом 1 в других классах.

Итак, Вы присваиваете процессу некий класс приоритета и можете изменять относительные приоритеты потоков в пределах процесса.

В общем случае поток с высоким уровнем приоритета должен быть активен как можно меньше времени. При появлении у него какой-либо работы он тут же получает процессорное время. Выполнив минимальное количество команд, он должен снова вернуться в ждущий режим. С другой стороны, поток с низким уровнем приоритета может оставаться активным и занимать процессор довольно долго.

В системе предусмотрена возможность изменения класса приоритета самим выполняемым процессом вызовом функции SetPriorityClass.

BOOL SetPriorityClass( HANDLE hProcess, DWORD fdwPriority).

Эта функция меняет класс приоритета процесса, определяемого описателем hРгоcess, в соответствии со значением параметром fdwPriority.

Парная ей функция GetPriorityClass позволяет узнать класс приоритета любого процесса: DWORD GetPriorityClass(HANDLE hProcess).

Динамическое изменение уровня приоритета потока

Уровень приоритета, получаемый комбинацией относительного приоритета потока и класса приоритета процесса, которому принадлежит данный поток, называют базовым уровнем приоритета потока. Иногда система изменяет уровень приоритета потока. Обычно это происходит в ответ на некоторые события, связанные с вводом-выводом.

Процессор исполняет поток в течение отведенного отрезка времени, а по его истечении система снижает приоритет потока на 1, до уровня 14. Далее потоку вновь выделяется квант процессорного времени, по окончании которого система опять снижает уровень приоритета потока на 1. И теперь приоритет потока снова соответствует его базовому уровню.

Текущий уровень приоритета не может быть ниже базового. Кроме того, драйвер устройства, «разбудивший» поток, сам устанавливает величину повышения приоритета. Система повышает приоритет только тех потоков, базовый уровень которых находится в пределах 1-15. Именно поэтому данный диапазон называется «областью динамического приоритета» (dynamic priority range). Система не допускает динамического повышения приоритета потока до уровней реального времени (более 15). Поскольку потоки с такими уровнями обслуживают системные функции, это ограничение не дает приложению нарушить работу операционной системы. И, кстати, система никогда не меняет приоритет потоков с уровнями реального времени (от 16 до 31).

Функции, позволяющие отключать этот механизм:

BOOL SetProcessPriorityBoost ( HANDLE hProcess,

BOOL DisablePriorityBoost);

BOOL SetThreadPriorityBoost ( HANDLE hThread,

BOOL DisablePriorityBoost);

SetProcessPriorityBoost заставляет систему включить или отключить изменение приоритетов всех потоков в указанном процессе, a SetThreadPriorityBoost действует применительно к отдельным потокам. Эти функции имеют свои аналоги, позволяющие определять, разрешено или запрещено изменение приоритетов:

BOOL GetProcessPriorityBoost ( HANDLE hProcess,

PBOOL pDisablePriorityBoost);

BOOL GetThreadPriorityBoost ( HANDLE hThread,

PBOOL pDisablePriorityBoost);

Каждой из этих двух функций передается описатель нужного процесса или потока и адрес переменной типа BOOL, в которой и возвращается результат.

Лекция 4. Тема: Синхронизация потоков

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

Необходимость синхронизации потоков

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

Объекты синхронизации потоков

Win32 предоставляет четыре объекта, разработанных для синхронизации потоков и процессов. Три из них — мьютексы, семафоры и события — являются объ­ектами ядра и имеют дескрипторы. События используются и для других целей, таких как асинхронный ввод-вывод.

Четвертый объект - CRITICAL_SECTION. Благодаря своей простоте и преимуществам в быстродействии объекты CRITICAL_SECTION являются наиболее пред­почтительным механизмом, если только они соответствуют требованиям программы.

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