15 сентября 2011 15.09.11 62 110K

Управление приоритетами процессов в ОС Windows Vista и Windows 7

+155

Приоритет процесса

Наверняка, практически все знают что такое приоритет процесса, если же нет, постараюсь кратко объяснить.

Это понятие, в определенном смысле, равно как для Windows, так и для Linux, а так же для некоторых других операционных систем.

Сейчас речь пойдет об операционных системах Windows Vista и Windows 7.

Windows Vista и Wnidows 7, впрочем, как и предыдущие версии, системы мультизадачные, т.е. могут выполнять параллельно множество программ, причем, еще и мультипоточные, но это уже отклонение, точнее, ненужное углубление в тему.

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

Чем выше приоритет процесса, тем больше ему выделяется процессорного времени, чем ниже приоритет, тем меньше процессу выделяется процессорного времени.
Или если простым языком — чем выше приоритет, тем чаще и больше процессор «уделяет внимание» процессу и его операциям, а чем ниже приоритет, тем меньше «уделяет внимание».

Соответственно это сказывается на скорости выполнение той или иной программы.

Практическая польза от изменения приоритета процесса

В Windows 7 меня изначально удивлял тот факт, что по-сути чисто декоративным процессам, вроде sidebar.exe (гаджеты на рабочий стол) уделяется процессорного времени ровно столько же, как и остальным процессам.
При этом sidebar.exe сам по себе не выполняет каких-то сверх важных и сверх нужных функций. Так зачем же ему уделять столько же процессорного времени, как, например, тяжелому ресурсоёмкому приложению, вроде 3D-игры или 3D-редактора с большой сценой?

Исходя из этого вопроса я и начал, что называется, играть с приоритетами процессов.
Главное что я понял, выше приоритета Normal (Средний) пользовательским программам лучше не подниматься, ибо тогда Windows Vista/7 может начать некорректно распределять процессорное время и некоторые важные системные процессы начнут «подтормаживать».

На самый крайний случай, нужному вам пользовательскому процессу можно выставить приоритет AboveNormal (Выше среднего), но это в очень редких случаях добавляет ощутимую разницу в производительности программе.
Но при этом никто не запрещает снизить приоритет другим, мало или не столь важным процессам, дабы они не отъедали ценное процессорное время, например, у игры.
Часто такие манипуляции действительно позволяют выиграть 5-10FPS.

Автоматический запуск процесса с определенным приоритетом

Недостаток, который известен многим — при изменении приоритета через «Диспетчер задач», он сохраняется лишь до завершения процесса, потом же процесс вновь запускается с приоритетом по-умолчанию. Т.е. ваши настройки приоритетов не запоминаются.
Из-за этого в интернете появилось множество программ, которые запоминают ваш выбор приоритета, а при следующем запуске программы, меняют его за вас автоматически.

Я же изначально не поверил в то, что в Windows нет какого-нибудь инструмента для управления и запоминания приоритета процесса и начал рыть документацию на сайтах Microsoft.
Не буду разводить полемику на тему плохой документированности возможностей Windows, но я оказался прав.
Любому процессу в Windows можно вручную через реестр указать приоритет и еще некоторые свойства, с которыми он будет запускаться.

Путь к разделу реестра:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options

Как запустить редактор реестра?

Нажмите сочетание клавиш Win+R (быстрый вызов команды «выполнить»), в появившемся окошке, в текстовой строке наберите regedit и нажмите Enter =)

Для того, что бы указать приоритет для процесса, с которым он должен сразу всегда запускаться, вам нужно в указанной выше ветке реестра создать раздел с его именем.
Далее в нем создать еще один раздел, т.е. уже подраздел с названием PerfOptions, а уже в нем создать параметр DWORD (32бита) с названием CpuPriorityClass и задать ему одно из десятичных значений — 1, 2, 3, 5, 6.

1 — приоритет Idle (низкий);
2 — приоритет Normal (средний);
3 — приоритет High (высокий);
5 — приоритет BelowNormal (ниже среднего);
6 — приоритет AboveNormal (выше среднего);

Разберем на примере sidebar.exe.
В ветке ресстра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options я создаю раздел sidebar.exe.
В нем создаю подраздел PerfOptions. И в этом подразделе создаю параметр DWORD (32бита) с названием CpuPriorityClass c десятичным значением 1.

Таким образом sidebar.exe теперь у меня всегда будет запускаться с низким приоритетом (Idle).

Так же все вышеописанные операции можно делать и через командную строку (cmd).
Я написал небольшой универсальный пакетный файл, который все это делает за пользователя.
Ссылка на пакетный файл: save_process_priority.cmd

В пакетном файле все пункты расписаны на русском языке. От пользователя потребуется только вводить нужное ему имя процесса и выбирать приоритет.

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

Вот и все, спасибо за внимание =)
Если заметили ошибку, обязательно сообщите, буду очень благодарен.

Copyright © 2011 Tsiryuta G. N. <spbtgn@gmail.com>


Лучшие комментарии

Намного лучше чем очередной блог о Minecraft ;)
Чувствую что мне лучше даже и не знать что это такое =)
Хотелось бы услышать(точнее прочитать), какими системными процессами можно пренебречь и поставить на них низкий приоритет.
тупо сделал как написано… для эксперимента только для sidebar, но после перезагрузки, низким приоритет не остался, сначала ниже среднего, а затем и вовсе вернулся на «прежнее место»…
хочу добавить, что возврат приоритета происходит без перезагрузки… это удивительно, не знаю может какой то параметр блокирует изменения?
Молодец! Надо повышать уровень беспомощных юзеров.
Надо повышать уровень беспомощных юзеров.

В смысле? =)
В смысле:
+exp -> LevelUP!)

Материал хороший, я бы плюсанул, но плюсомёт уже разряжен. Постараюсь завтра.
Да, сохраняется всегда в шестнадцатеричной системе счисления, просто для удобства пользователя есть возможность ввести в десятичной системе.
Разрядность системы и процесса значения не имеют, просто сама система подхватывает параметр только из DWORD — 32-битного числа. А 64-битное число уже имеет другой тип — QWORD. На него система просто внимание не будет обращать, в лучшем случае, а, в худшем, вообще начнет ругаться =)
DWORD — это 32-битное целое число (без знака) (диапазон: от 0 и до 4294967295 в десятичной системе).
Да, я в курсе подобных программ, упоминал об этом в статье.
Но все же у меня есть элемент «паранойи» — нет желания ставить стороннюю программу, от неизвестного мне автора, которая будет что-то там мониторить или делать без моего ведома =)

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

А вообще это дело вкуса. Просто я, как любитель консоли в Linux, завел привычку все делать сам, а не с помощью каких-то сторонних решений =)
Нет. Нет! Скажите что он шутит! ПОЖАЛУЙСТА!

Windows Vista упомянул потому что 7-ка построена на переработанном ядре Windows Vista, соответственно многие команды и скрипты, или же элементы реестра, вызывающие команды ядра одинаковые.
Сам же я тоже не любитель Windows Vista, хотя и знаю что после 2-х сервис паков система стала вполне работоспособная.
Хотя все же то, что было заложено в ядро 7-ки, при её написании, в Vista просто нет и уже по этому она мне меньше нравится, точнее просто не нравится =)
В Winodws 7 можно тоже sidebar.exe осадить до низкого приоритета.
А вообще тут уже надо сами думать.
Я, например, uTorrent.exe тоже установил приоритет «Ниже среднего», дабы он не так жрал процессорное время, при загрузке и раздаче множества файлов.

Так же skype.exe тоже снизил приоритет до «Ниже среднего», от этого он никак не пострадает, зато меньше будет нагружать систему.

Так же я процессам Steam снизил приоритет до «Ниже среднего», что бы они не отъедали производительность у тяжелых игр. Кстати, таким образом у меня в нескольких тяжелых играх, действительно вырос средний FPS и меньше «просадок» кадров стало.
Например GameOverlayUI.exe — процесс оверлея Steam, хорошо так есть процессорное время, если открыт голосовой чат через Steam параллельно с игрой.
Так или иначе все учатся методом проб и ошибок =)
Все куда проще =)
В десятичной системе отсчет от 0 до 9, т.е. только один знак.
В шестнадцатеричной тоже всегда один знак, но после 9 идет отсчет буквами, а не цифрами.
Т.е. с 0 до 9 все также, как и в десятичной, а потом A — это 10, B — это 11, C — это 12, D — это 13, E — это 14, F — это 15.
Ок, сейчас добавлю в статью под спойлер.
В смысле что большинство это или не знает или просто не юзает, а меж тем штука очень полезная. Например, групповые приоритеты, позволяют замедлить всю систему ради, скажем, мощного рендера в VRay
Отдай его мне. Как раз хотел сделать боевого киборга для защиты лаборатории токсинов.
Ясно. Просто сначала не так понял, потому и переспросил =)
Читай также