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

33 Потоки вWindows. Приоритеты потоков и процессов

Понятие приоритета потока.

Поток получает доступ к процессору на 20 мс, после чего планировщик переключает процессор на выполнение другого потока. Так происходит, только если у всех потоков один приоритет, но на самом деле в системе существуют потоки с разными приоритетами, а это меняет порядок распределения процессорного времени.

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

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

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

Классы приоритета процессов.

Windows поддерживает шесть классов приоритета:

  • idle(простаивающий),

  • belownormal (ниже обычного),

  • normal(обычный),

  • abovenormal (выше обычного),

  • high(высокий),

  • realtime(реального времени).

Самый распространенный класс приоритета – normal, его использует 99% приложений.

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

High.Потоки в этом процессе тоже должны немедленно реагировать на события, обеспечивая выполнение критических по времени задач.

Above normal. Класс приоритета, промежуточный между normal и high. Это новый класс, введенный в Windows 2000.

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

Below normal.Класс приоритета, промежуточный между normal и idle. Это новый класс, введенный в Windows 2000.

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

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

Могут быть следующие относительные приоритеты потока.

Time-critical.Поток выполняется с приоритетом 31 в классе real-time и с приоритетом 15 в других классах.

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

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

Normal.Поток выполняется с обычным приоритетом процесса для данного класса.

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

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

Idle.Поток выполняется с приоритетом 16 в классе real-time и с приоритетом 1 в других классах

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

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

BOOL SetPriontyClass( HANDLE hProcess, DWORD fdwPriority);

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

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

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

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

Для отключения механизма динамического изменения приоритета есть две функции:

BOOL SetProcessPriorityBoost( HANDLE hProcess, BOOL DisablePriontyBoost);

BOOL SetThreadPriorityBoost( HANDLE hThread, BOOL DisablePriorityBoost);

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

BOOL GetProcessPriorityBoost( HANDLE hProcess,

PBOOL pDisablePriorityBoost);

BOOL GeLThreadPriorityBoost( HANDLE hThread,

PBOOL pDisablePriorityBoost);

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

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