Главная » Delphi » Приоритеты и расписание

0

Как уже говорилось, операционная система  отвечает за выделение каждому потоку нескольких циклов  процессора, в течение которых они  могут работать. Количество времени, выделяемое отдельному потоку,  зависит от его приоритета. Приоритет от дельного потока определяет комбинация приоритета  процесса, создавшего поток (называемого приоритетом класса (priority class)),  и приоритета относительно самого потока (называемого относительным приоритетом (relative priority)).

Приоритет класса процесса

Приоритет класса процесса описывает приоритет определенного процесса, вы полняющегося в системе. Система  Win32 поддерживает четыре различных приорите та  класса:  Idle (ожидание),  Normal (нормальный),  High (высокий)  и  Realtime (реального времени). По умолчанию любому процессу  присваивается приоритет Nor- mal. Каждый  из перечисленных приоритетов имеет  соответствующий флаг,  опреде ленный в модуле Windows. С помощью операции OR (или) любой из этих флагов  мож но логически сложить с параметром dwCreationFlags функции CreateProcess(), что позволит при  порождении процесса установить ему необходимый приоритет. Кроме  того,  такие  флаги  можно  использовать и  для  динамической настройки при оритета класса данного процесса, как это будет показано ниже. Все классы можно со поставить уровням приоритета, которые выражаются числовыми значениями, нахо

дящимися в диапазоне от 4 до 24 включительно.НА ЗАМЕТКУ

В среде Windows NT модификация приоритета класса процесса требует наличия у это- го процесса специальных привилегий. Определенные приоритеты класса можно при- своить процессам с помощью стандартных параметров, но они могут быть отключены системными администраторами — в частности, на интенсивно загруженных серверах Windows NT/2000.

В табл. 5.1 приведены все существующие  приоритеты класса,  соответствующие им флаги  и числовые значения.

Таблица 5.1. Приоритеты класса процесса

Класс

Флаг

Значение

Idle

IDLE_PRIORITY_CLASS

$40

Below Normal*

BELOW_NORMAL_PRIORITY_CLASS

$4000

Normal

NORMAL_PRIORITY_CLASS

$20

Above Normal*

High

ABOVE_NORMAL_PRIORITY_CLASS

HIGH_PRIORITY_CLASS

$8000

$80

Realtime

REALTIME_PRIORITY_CLASS

$100

* Эти значения доступны только в Windows 2000, а соответствующие константы для флагов в мо

дуле Windpws.pas Delphi 6 отсутствуют.

Для динамического считывания и установки приоритета класса  данного процесса в API Win32 предусмотрены функции GetPriorityClass() и SetPriorityClass() соответственно. Эти функции определены следующим образом:

function GetPriorityClass(hProcess: THandle): DWORD; stdcall;

function SetPriorityClass(hProcess: THandle;

dwPriorityClass: DWORD): BOOL; stdcall;

В обеих  функциях параметр hProcess представляет собой  дескриптор процесса. Чаще  всего эти функции используются для доступа к значению приоритета класса собственного процесса. В подобном случае можно  обратиться и к функции интерфей са API Win32 GetCurrentProcess(), которая определена следующим образом:

function GetCurrentProcess: THandle; stdcall;

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

Чтобы установить приоритет  класса  приложения равным High, используйте следующий  код:if not SetPriorityClass(GetCurrentProcess, HIGH_PRIORITY_CLASS) then

ShowMessage(‘Error setting priority class.’);CОВЕТ

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

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

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

Второй составляющей общего  приоритета потока является относительный приоритет отдельного потока. Следует подчеркнуть, что приоритет класса связан  с процессом, а от носительный приоритет —  с отдельными потоками внутри  процесса. Потоку  можно  на значить один из семи возможных относительных приоритетов: Idle (ожидание), Lowest (низший), Below Normal (ниже нормального), Normal (нормальный), Above Normal (выше нормального), Highest (высший) или Time Critical (критический по времени).

Класс    TThread имеет    открытое   свойство   Priority перечислимого   типа

TThreadPriority. Для каждого  относительного приоритета в этом  типе  существует

свой элемент:

type

TThreadPriority = (tpIdle, tpLowest, tpLower, tpNormal,

tpHigher, tpHighest, tpTimeCritical);

Приоритет любого  объекта TThread можно  получить или установить просто про читав  или записав его в свойство Priority. С помощью следующей  строки кода при сваивается высший приоритет  экземпляру потомка класса  TThread, который носит имя MyThread:

MyThread.Priority := tpHighest;

Подобно приоритетам классов, каждому относительному приоритету соответству ет определенное числовое значение. Разница лишь  в том,  что  значение относитель ного  приоритета имеет  знак,  который при  определении общего  приоритета потока внутри  системы влияет на результат суммирования приоритета класса процесса и от носительного приоритета. Поэтому  относительный приоритет иногда  называется дельта приоритетом. Общий приоритет потока может  выражаться значением, находя щимся в диапазоне от 1 до 31 (где число 1 означает самый низкий приоритет). В мо дуле Windows определены константы, представляющие знаковые значения для каждо го приоритета. В табл. 5.2 показано соответствие констант API и элементов перечис ления  в типе TThreadPriority.

Таблица 5.2. Относительные приоритеты потока

TThreadPriority

Константа

Значение

tpIdle

THREAD_PRIORITY_IDLE

-15*

tpLowest

THREAD_PRIORITY_LOWEST

-2

tpBelow Normal

THREAD_PRIORITY_BELOW_NORMAL

-1

tpNormal

THREAD_PRIORITY_NORMAL

0

tpAbove Normal

THREAD_PRIORITY_ABOVE_NORMAL

1

tpHighest

THREAD_PRIORITY_HIGHEST

2

tpTimeCritical

THREAD_PRIORITY_TIME_CRITICAL

15*

Помеченные  звездочкой  (*)  значения  относительных  приоритетов  tpIdle и tpTimeCritical, в отличие от других,  не добавляются к приоритету класса  для оп ределения общего  приоритета потока. Общий приоритет потока, относительный приоритет которого равен  tpIdle, независимо от приоритета класса устанавливается равным 1. Исключением из этого  правила является приоритет Realtime, который, объединяясь с относительным приоритетом tpIdle, имеет  значение общего  приори тета,  равное 16. Общий приоритет любого  потока с относительным приоритетом tpTimeCritical, независимо от  его  приоритета класса  равен  15. Исключением из этого  правила является приоритет класса Realtime, который при объединении с от носительным приоритетом  tpTimeCritical имеет   значение общего   приоритета, равное 31.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии