пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ


Распределение процессорного времени между потоками. Установление и изменение приоритета. Приостановка и возобновление потоков. Пример

Система выделяет процессорное время всем активным потокам, исходя из их уровней приоритета, которые варьируются от 0 до 31.
Низший уровень является зарезервированным и назначается специальному системному потоку обнуления страниц.
Когда система подключает процессор к потоку, он обрабатывает потоки с одинаковым приоритетом как равноправные (по принципу карусели). Как только все потоки с данным приоритетом получат по кванту и при условии, что они больше не требуют процессорного времени, ОС переходит к потокам с более низким приоритетом.
Существует вероятность, что процессор постоянно обрабатывает потоки, например с приоритетом 31. Значит у потоков с более низким приоритетом нет шансов на подключение к процессору. Такая ситуация называется перегрузкой (starvation – зависание).

Как установить приоритет?

Создание потока с относительным приоритетом idle:

DWORD dwThreadID;

HANDLE hThread = CreateThread(NULL, 0, ThreadFunc, NULL, CREATE_SUSPENDED, &dwThreadID); SetThreadPriority(hThread, THREAD_PRIORITY_IDLE); ResumeThread(hThread);

CloseHandle(hThread);

CreateThread всегда создает поток с относительным приоритетом normal.

Чтобы присвоить потоку относительный приоритет idle, нужно создать приостановленный поток, передав в CreateThread флаг CREATE_SUSPENDED, а потом вызвать SetThreadPriority и установить нужный приоритет.

Приостановка и возобновление потоков:

Приостановить выполнение потока можно также с помощью вызова функции

DWORD SuspendThread(HANDLE hThread);

которая увеличивает счетчик простоев потока. При удачном выполнении функция возвращает предыдущее значение счетчика простоев или $FFFFFFFF.

Чтобы возобновить выполнение потока необходимо из другого потока вызвать функцию

DWORD ResumeThread(HANDLE hThread);

которая уменьшит счетчик простоев на единицу и если он будет равен 0, запустит поток на выполнение.

Приостановить поток можно не более чем 127 раз.

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

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

VOID Sleep(DWORD dwMilliseconds);

Эта функция приостанавливает поток на dwMilliseconds миллисекунд.

Вызывая Sleep, поток добровольно отказывается от остатка выделенного ему кванта времени.

Система прекращает выделять потоку процессорное время на период, примерно равный заданному, т.к. Windows не является системой реального времени.

Можно вызвать Sleep и передать в dwMilliseconds значение INFINITE, вообще запретив планировать поток.

Можно вызвать Sleep и передать в dwMilliseconds нулевое значение. Тогда Вы откажетесь от остатка своего кванта времени и заставите систему подключить к процессору другой поток.

 


27.12.2015; 15:56
хиты: 1
рейтинг:0
Точные науки
информатика
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь