Не отрабатывает функция SetProcessPriorityBoost
От: MakcMN  
Дата: 03.06.08 18:44
Оценка:
Здравствуйте.

Столкнулся с тем, что при отключённом динамическом повышении приоритетов Windows всё равно его повышает. Пример кода:

#include <cstddef>
#include <cassert>
#include <tchar.h>
#include <windows.h>


DWORD WINAPI thread_proc(LPVOID parameter)
{
    OutputDebugString(_T("thread_proc begin\n"));
    for (;;)
        ;
    OutputDebugString(_T("thread_proc end\n"));
}

void create_thread()
{
    OutputDebugString(_T("create_thread begin\n"));

    HANDLE thread_handle = CreateThread(NULL, 0,
        thread_proc, 0, CREATE_SUSPENDED, NULL);

    assert(thread_handle != NULL);

    SetThreadPriority(thread_handle, THREAD_PRIORITY_ABOVE_NORMAL);
    ResumeThread(thread_handle);

    OutputDebugString(_T("create_thread end\n"));
}

int main()
{
    // Убираем динамическое повышение приоритетов для потоков процесса
    SetProcessPriorityBoost(GetCurrentProcess(), TRUE);

    // Разрешаем исполнять потоки процесса только на одном процессоре
    SetProcessAffinityMask(GetCurrentProcess(), 1);

    // Применяем настройки
    Sleep(0);


    create_thread();


    return 0;
}


Программа выводит:

create_thread begin
thread_proc begin
create_thread end


и нормально завершается.


Spy++ показывает следующие приоритеты нитей:

Строка create_thread();
    Основная нить:
        текущий 8
        базовый 8

    Дополнительная нить:
        ещё нет

Строка return 0;
    Основная нить:
        текущий 15
        базовый 8

    Дополнительная нить:
        текущий 9
        базовый 9


С чем может быть связано такое поведение, что-то не так вызвал?
Re: Не отрабатывает функция SetProcessPriorityBoost
От: dcb-BanDos Россия  
Дата: 04.06.08 08:10
Оценка:
Здравствуйте, MakcMN, Вы писали:

А что возвращают функции?!!???
Ничто не ограничивает полет мысли программиста так, как компилятор.
Re[2]: Не отрабатывает функция SetProcessPriorityBoost
От: MakcMN  
Дата: 04.06.08 14:12
Оценка:
Здравствуйте, dcb-BanDos, Вы писали:

DB>А что возвращают функции?!!???


Функции успешно выполняются: возвращаются TRUE и Get-функции выдают записанные перед этим значения.

Насколько я понял, ещё раз перечитав Рихтера, такое поведение программы связано с динамическим повышением приоритетов для голодающих нитей: программа замерла на 3-4 секунды в цикле дополнительной нити, после чего основной нити выдался приоритет THREAD_PRIORITY_TIME_CRITICAL и передалось управление.

Читая Рихтера, создаётся впечатление, что подобное повышение приоритета также регулируется функцией SetProcessPriorityBoost (данная ситуация описывается в главе о динамическом изменении приоритетов сразу после описания функции SetProcessPriorityBoost), на деле же оказывается, что это не так.
Re: Не отрабатывает функция SetProcessPriorityBoost
От: rusxg  
Дата: 05.06.08 09:36
Оценка: 10 (3)
Для размышления открывок из "М. Руссинович, Д. Соломон. Внутреннее устройство Microsoft Windows":

Всякий раз, когда поток в активном процессе завершает ожидание объекта ядра, функция KiUnwaitThread динамически повышает его текущий (не базовый) приоритет на величину текущего значения PsPrioritySeparation. (Какой процесс является активным, определяет подсистема управления окнами.) Как было сказано в разеде "Управление величиной кванта" ранее в этой главе, PsPrioritySeparation представляет собой индекс в таблице квантов (байтовом массиве), с помощью которой выбираются величины квантов для потоков активных процессов. Однако в данном случае PsPrioritySeparation используется как значение на которое повышается приоритет.
Это увеличивает отзывчивость интерактивного приложения по окончании ожидания. В результате повышаются шансы на немедленное возобновление его потока — особенно если в фоновом режиме выполняется несколько процессов с тем же базовым приоритетом.
В отличие от других видов динамического повышения приоритета этот поддерживается всеми системами Windows, и его нельзя отключить даже через Windows-функцию SetThreadPriorityBoost.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.