КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Динамический приоритет потока. Установка приоритета.Каждому потоку присваивается уровень приоритета — от 0 (самый низкий) до 31 (самый высокий). Решая, какому потоку выделить процессорное время, система сначала рассматривает только потоки с приоритетом 31 и подключает их к процессору по принципу карусели. Если поток с приоритетом 31 не исключен из планирования, он немедленно получает квант времени, по истечении которого система проверяет, есть ли еще один такой поток. Если да, он тоже получает свой квант процессорного времени. Пока в системе имеются планируемые потоки с приоритетом 31, ни один поток с более низким приоритетом процессорного времени не получает. Такая ситуация называется "голоданием* (starvation). Она наблюдается, когда потоки с более высоким приоритетом так интенсивно используют процессорное время, что остальные практически не работают. При загрузке системы создается особый поток — поток обнуления страниц (zero page thread), которому присваивается нулевой уровень приоритета. Ни один поток, кроме этого, не может иметь нулевой уровень приоритета Он обнуляет свободные страницы в оперативной памяти при отсутствии других потоков, требующих внимания со стороны системы. Windows поддерживает семь относительных приоритетов потоков
Только что созданный поток получает относительный приоритет normal. BOOL SetThreadPriority( HANDLE hThread, int nPriority); Разумеется, параметр bThread указывает на поток, чей приоритет Вы хотите из менить, а через nPriority передается один из идентификаторов
Функция 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 в режиме ядра работает асинхронно, но в пользовательском режиме не выполняется, пока поток остается в приостановленном состоянии.
|