Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Динамический приоритет потока. Установка приоритета.




Каждому потоку присваивается уровень приоритета — от 0 (самый низкий) до 31 (самый высокий). Решая, какому потоку выделить процессорное время, система сначала рассматривает только потоки с приоритетом 31 и подключает их к процессору по принципу карусели. Если поток с приоритетом 31 не исключен из планирования, он немедленно получает квант времени, по истечении которого система проверяет, есть ли еще один такой поток. Если да, он тоже получает свой квант процессорного времени.

Пока в системе имеются планируемые потоки с приоритетом 31, ни один поток с более низким приоритетом процессорного времени не получает. Такая ситуация называется "голоданием* (starvation). Она наблюдается, когда потоки с более высоким приоритетом так интенсивно используют процессорное время, что остальные практически не работают.

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

Windows поддерживает семь относительных приоритетов потоков

Относительный приоритет потока Описание  
Time-critical (критичный по времени) Поток выполняется с приоритетом 31 в классе real-time и с приоритетом 15 в других классах
Highest (высший) Поток выполняется с приоритетом на два уровня выше обычною для данного класса
Above normal (выше обычного) Поток выполняется с приоритетом на один уровень выше обычного для данного класса
Normal (обычный) Поток выполняется с обычным приоритетом процесса для данного класса
Below normal (ниже обычного) Поток выполняется с приоритетом на один уровень ниже обычного для данного класса
Lowеst (низший) Поток выполняется с приоритетом на два уровня ниже обычного для данного класса
Idle (простаивающий) Поток выполняется с приоритетом 16 в классе real-time и с приоритетом 1 в других классах

 

Относительный приоритет потока Idle Класс приоритета процесса Real-lime
Below normal Normal Above normal Highest
Time-critical  
Highest
Above normal
Normal
Below normal
Lowеst
Idle

Только что созданный поток получает относительный приоритет normal.

BOOL SetThreadPriority( HANDLE hThread, int nPriority);

Разумеется, параметр bThread указывает на поток, чей приоритет Вы хотите из менить, а через nPriority передается один из идентификаторов

Относительный приоритет потока Идентификатор
Time-critical THREAD_PRIORITY_TIME_CRITICAL
Highest THREAD_PRIORITY_HIGHEST
Above normal THREAD_PRIORITY_ABOVE_NORMAL
Normal THREAD_PRIORITY_NORMAL
Below normal THREAD_PRIORITY_BELOW_NORMAL
Lowest THREAD_PRIORITY_LOWEST
Idle THREAD_PRIORITY_IDLE

Функция GetThreadPnority, парная SetThreadPriority, позволяет узнать относительный приоритет потока.

int GetThreadPriority(HANDLE hThread);

Она возвращает один из идентификаторов, показанных в таблице выше.

 

10. Управление потоками: приостановка, возобновление, завершение.

В объекте ядра "поток" имеется переменная — счетчик числа простоев данного потока. При вызове CreateProcess или CreateThread он инициализируется значением, равным 1, которое запрещает системе выделять новому потоку процессорное время. Сразу после создания поток не готов к выполнению, ему нужно время для инициализации.

После того как поток полностью инициализирован, CreateProcess или CreateThread проверяет, не передан ли ей флаг CREATE_SUSPENDED, и, если да, возвращает управление, оставив поток в приостановленном состоянии. В ином случае счетчик простоев обнуляется, и поток включается в число планируемых.

Создав поток в приостановленном состоянии, можно настроить некоторые его свойства. Закончив настройку, нужно разрешить выполнение потока. Для этого используется ResumeThread и передать описатель потока, возвращенный функцией CreateThread.

DWORD ResumeThread(HANDLE hThread);

Если вызов ResumeThread прошел успешно, она возвращает предыдущее значение счетчика простоев данного потока.

Выполнение отдельного потока можно приостанавливать несколько раз. Если поток приостановлен 3 раза, то и возобновлен он должен быть тоже 3 раза — лишь тогда система выделит ему процессорное время. Выполнение потока можно приостановить не только при его создании с флагом CREATE_SUSPENDED, но и вызовом SuspendThread.

DWORD SuspendThread (HANDLE hThread);

Любой поток может вызвать эту функцию и приостановить выполнение другого потока. Приостановить свое выполнение поток способен сам, а возобновить себя без посторонней помощи — нет. Как и ResumeThread, функция SuspendThread возвращает предыдущее значение счетчика простоев данного потока. Поток можно приостанавливать не более чем MAXIMUM_SUSPEND_COUNT раз (в файле WinNT.h это значение определено как 127). Suspend Thread в режиме ядра работает асинхронно, но в пользовательском режиме не выполняется, пока поток остается в приостановленном состоянии.


Поделиться:

Дата добавления: 2015-04-21; просмотров: 103; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.007 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты