На главную

On-line справка по Win32 API

Написать письмо
БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО!
Список всех статей A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z | Скачать Вниз

Scheduling Priorities



Each thread is assigned a scheduling priority. The priority levels range from zero (lowest priority) to 31 (highest priority). Only the zero-page thread can have a priority of zero. The zero-page thread is a system thread.

The priority of each thread is determined by the following criteria:

· The priority class of its process
· The priority level of the thread within the priority class of its process



The priority class and priority level are combined to form the base priority of a thread.

Priority Class

Each process belongs to one of the following priority classes:

IDLE_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
HIGH_PRIORITY_CLASS
REALTIME_PRIORITY_CLASS



By default, the priority class of a process is NORMAL_PRIORITY_CLASS. Use the CreateProcess function to specify the priority class of a child process when you create it. Use SetPriorityClass to change the priority class of a process and GetPriorityClass to determine the current priority class of a process.
Processes that monitor the system, such as screen savers or applications that periodically update a display, should use IDLE_PRIORITY_CLASS. This prevents the threads of this process, which do not have high priority, from interfering with higher priority threads.

Use HIGH_PRIORITY_CLASS with care. If a thread runs at the highest priority level for extended periods, other threads in the system will not get processor time. If several threads are set at high priority at the same time, the threads lose their effectiveness. The high-priority class should be reserved for threads that must respond to time-critical events. If your application performs one task that requires the high-priority class while the rest of its tasks are normal priority, use SetPriorityClass to raise the priority class of the application temporarily; then reduce it after the time-critical task has been completed. Another strategy is to create a high-priority process that has all of its threads blocked most of the time, awakening threads only when critical tasks are needed. The important point is that a high-priority thread should execute for a brief time, and only when it has time-critical work to perform.

You should almost never use REALTIME_PRIORITY_CLASS, because this interrupts system threads that manage mouse input, keyboard input, and background disk flushing. This class can be appropriate for applications that "talk" directly to hardware or that perform brief tasks that should have limited interruptions.

Priority Level

The following are priority levels within each priority class

THREAD_PRIORITY_IDLE
THREAD_PRIORITY_LOWEST
THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_NORMAL
THREAD_PRIORITY_ABOVE_NORMAL
THREAD_PRIORITY_HIGHEST
THREAD_PRIORITY_TIME_CRITICAL



All threads are created using THREAD_PRIORITY_NORMAL. This means that the thread priority is the same as the process priority class. After you create a thread, use the SetThreadPriority function to adjust its priority relative to other threads in the process.
A typical strategy is to use THREAD_PRIORITY_ABOVE_NORMAL or THREAD_PRIORITY_HIGHEST for the process's input thread, to ensure that the application is responsive to the user. Background threads, particularly those that are processor intensive, can be set to THREAD_PRIORITY_BELOW_NORMAL or THREAD_PRIORITY_LOWEST, to ensure that they can be preempted when necessary. However, if you have a thread waiting for another thread with a lower priority to complete some task, be sure to block the execution of the waiting high-priority thread. To do this, use a wait function, critical section, or the Sleep function, SleepEx, or SwitchToThread function. This is preferable to having the thread execute a loop. Otherwise, the process may become deadlocked, because the thread with lower priority is never scheduled.

To determine the current priority level of a thread, use the GetThreadPriority function.

Base Priority

The priority level of a thread is determined by both the priority class of its process and its priority level. The priority class and priority level are combined to form the base priority of each thread.
The following table shows the base priority levels for combinations of priority class and priority value.

Process Priority Class Thread Priority Level
1 IDLE_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, or HIGH_PRIORITY_CLASS THREAD_PRIORITY_IDLE
2 IDLE_PRIORITY_CLASS THREAD_PRIORITY_LOWEST
3 IDLE_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL
4 IDLE_PRIORITY_CLASS THREAD_PRIORITY_NORMAL
5 Background NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST
IDLE_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL
6 Background NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL
IDLE_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST
7 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST
Background NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL
8 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL
NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL
9 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL
NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST
10 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL
11 HIGH_PRIORITY_CLASS THREAD_PRIORITY_LOWEST
Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST
12 HIGH_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL
13 HIGH_PRIORITY_CLASS THREAD_PRIORITY_NORMAL
14 HIGH_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL
15 IDLE_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, or HIGH_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL
HIGH_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST
16 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_IDLE
22 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_LOWEST
23 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL
24 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_NORMAL
25 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL
26 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST
31 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL



Пригласи друзей и счет твоего мобильника всегда будет положительным!
Предыдущая статья
 
Сайт Народ.Ру Интернет
Следующая статья
Пригласи друзей и счет твоего мобильника всегда будет положительным!

Планирование Приоритетов



Каждая резьба назначена планирование приоритета. Приоритет выравнивает дипазон от нуля (самого низкого приоритета) до 31 (самый верхний приоритет). Только нулевая-страничная резьба может иметь приоритет нуля. Нулевая-страничная резьба является системной резьбой.

Приоритет каждой резьбы определен следующими критериями:

Приоритетный класс своего процесса
Приоритетный уровень резьбы в пределах приоритетного класса своего процесса



Приоритетный класс и приоритетный уровень объединены, чтобы формировать базовый приоритет резьбы.

Приоритетный Класс

Каждый процесс принадлежит одному из следующих приоритетных классов:

IDLE_PRIORITY_CLASS NORMAL_PRIORITY_CLASS HIGH_PRIORITY_CLASS REALTIME_PRIORITY_CLASS



По умолчанию, приоритетный класс процесса - NORMAL_PRIORITY_CLASS. Используйте функцию CreateProcess, чтобы определять приоритетный класс процесс ребенок когда Вы создавать это. Используйте SetPriorityClass, чтобы изменять приоритетный класс процесса и GetPriorityClass, чтобы определять текущий приоритетный класс процесса.
Процессы, что проверять систему, как например, экранные спасители или приложения, которые периодически корректируют показ, должны использовать IDLE_PRIORITY_CLASS. Это предохраняет резьбу этого процесса, какое нет имеет высокий приоритет, чтобы создавать помехи с более высокой приоритетной резьбой.

Используйте HIGH_PRIORITY_CLASS осторожно. Если резьба работает на самом верхнем приоритетном уровне на расширенные периоды, другая резьба в системе не получит время процессора. Если несколько резьбы установлены в высоком приоритете в то же самое время, резьба теряет их эффективность. Высокоприоритетный класс должен быть зарезервирован для резьбы, которая должна среагировать на время-критические события. Если ваше приложение выполняет одну задачу, которая требует высокоприоритетный класс тогда как остальная часть своих задач является нормальным приоритетом, используйте SetPriorityClass, чтобы поднимать приоритетный класс приложения временно; затем уменьшите это после того, как время-критическая задача будет завершена. Другая стратегия должна создать высокоприоритетный процесс, который заблокировал всю резьбу наиболее время, резьба пробуждения только когда критические задачи - нужно. Важная точка - то, что высокоприоритетная резьба должна выполняться в течение краткого времени, и только когда у него есть время-критическая работа, чтобы выполняться.

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

Приоритетный Уровень

Следующее является приоритетными уровнями в пределах каждого приоритетного класса

THREAD_PRIORITY_IDLE THREAD_PRIORITY_LOWEST THREAD_PRIORITY_BELOW_NORMAL THREAD_PRIORITY_NORMAL THREAD_PRIORITY_ABOVE_NORMAL THREAD_PRIORITY_HIGHEST THREAD_PRIORITY_TIME_CRITICAL



Вся резьба создана используя THREAD_PRIORITY_NORMAL. Это означает, что приоритет резьбы такой же как и приоритетный класс процесса. После того, как Вы создадите резьбу, используйте функцию SetThreadPriority, чтобы регулировать свой приоритет относительно другой резьбы в процессе.
Типичная стратегия должна использовать THREAD_PRIORITY_ABOVE_NORMAL или THREAD_PRIORITY_HIGHEST для входной резьбы процесса, чтобы проверять, что приложение отзывчивое пользователю. Фон заправляет, особенно те которые - процессор интенсивный, может быть установлен на THREAD_PRIORITY_BELOW_NORMAL или THREAD_PRIORITY_LOWEST, чтобы проверять, что они могут быть захвачены когда необходимо. Тем не менее, если у вас есть резьба, ждущая другую резьбу с более низким приоритетом, чтобы завершать некоторую задачу, не забудьте блокировать выполнение ждущей высокоприоритетной резьбы. Для того, чтобы делать это, используйте функцию ожидания, критической секции, или функцию Сна, SleepEx, или функции SwitchToThread. Это предпочтительное иметь резьба выполняет цикл. В противном случае, процесс может стать deadlocked, поскольку резьба с более низким приоритетом никогда не запланирована.

Для того, чтобы определять текущий приоритетный уровень резьбы, используйте функцию GetThreadPriority.

Базовый Приоритет

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

Резьба Приоритетного Класса Процесса Приоритетного Уровня 1 IDLE_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, или HIGH_PRIORITY_CLASS THREAD_PRIORITY_IDLE 2 IDLE_PRIORITY_CLASS THREAD_PRIORITY_LOWEST 3 IDLE_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL 4 IDLE_PRIORITY_CLASS THREAD_PRIORITY_NORMAL 5 Background NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST IDLE_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL 6 Background NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL IDLE_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST 7 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST Background NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL 8 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL 9 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST 10 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL 11 HIGH_PRIORITY_CLASS THREAD_PRIORITY_LOWEST Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST 12 HIGH_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL 13 HIGH_PRIORITY_CLASS THREAD_PRIORITY_NORMAL
14 HIGH_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL 15 IDLE_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, или HIGH_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL HIGH_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST 16 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_IDLE 22 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_LOWEST 23 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL 24 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_NORMAL 25 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL 26 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST 31 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL



Вверх Version 1.3, Oct 26 2010 © 2007, 2010, mrhx Вверх
 mrhx software  Русский перевод OpenGL  Русский перевод Win32 API
 
Используются технологии uCoz