Приоритеты в Windows
Введение
По определению, Windows является многозадачной операционной системой. То есть одновременно в ней могут выполняться несколько задач. Однако задача задаче рознь. И различие это заключается в приоритете. То есть, при выполнении какой-либо программы Windows распределяет ресурсы определенным образом, в зависимости от того, какой приоритет у какого процесса (программы). Программы в дальнейшем я буду называть процессами, так проще. Каждая запущенная программа в Windows представляет собой процесс. Приоритеты бывают разные — большие, маленькие, но об этом потом. Чем это может нам помочь? А вот чем. Многие сетуют на медленность выполнения программ на Vb. В свое время я на это наткнулся на самом наглядном примере. Представьте себе программу, которая должна через определенный интервал времени выполнять какое-либо действие — ну, например, что-то выводить пользователю. Просто — скажете Вы. Берем таймер и вперед. А если помимо этого периодически программа должна что-то еще считать, и не один раз, а таймеров много? Будет тормозить. Причем не Windows, а только программа. Несправедливо? Да. Это значит, что Windows отделяет мало ресурсов Вашей программе, которых ей явно недостаточно. Значит попросить у Windows больше, только как?
Вот так
Значит надо менять приоритет. Самое время о них поговорить. В Windows’98 приоритетов меньше, чем в Windows Me или 2000, но они таки есть J. Вот они.
Приоритет реального времени (real time) — программа выполняется так, как будто она одна и есть цель жизни Windows. Все ресурсы отдаются ей.
Высокий приоритет (high) — программа выполняется так, чтобы оставить чуть-чуть остальным приложениям.
Нормальный (normal) — выполнение идет обычным путем.
Низкий (idle) — если выполнение и идет, то только когда Windows делать нечего.
Ну так вот, запущенная программа сначала получает приоритет Normal, и выполняется своим чередом. При этом приоритете, что бы программа ни делала, она не сможет съесть ресурсов столько, чтобы повис Windows. В теории. Но нам так не подходит. Нам надо приоритет high или, если все очень напряжно, real time. Но real time — вещь опасная. Может запросто затормозиться даже мышка. А об остальных программах я и говорить на хочу. Просто копец и все тут. Итак, как же все таки приоритет поменять.
Снова API
Да, за установку приоритета отвечает функция SetPriorityClass. То есть, вызвав ее, и передав все, что ей надо, мы получим нужный приоритет.
- hProcess — это Handle процесса. О нем ниже.
- dwPriorityClass — приоритет. Он то нам и нужен.
Константы приоритетов:
Все просто — берем константу и вперед, но нам надо получить Handle процесса. То есть, процесс и окно для Windows вещи хоть и почти синонимичные, но не всегда. Handle окна — одна вещь, Handle процесса — совсем другая. То есть, у процесса может быть много окон, но у окна только один процесс владелец. Значит, нам надо научиться находить Handle именно процесса. В этом нам поможет функция OpenProcess, которая после передачи ей параметров, скажет, что за Handle у процесса.
dwDesiredAccess — что мы хотим узнать (Handle у процесса бывают разные, для завершения процесса — одни, для получения информации — другой). Мы будем использовать константу PROCESS_QUERY_INFORMATION, то есть опрашивать процесс.
bInheritHandle — переменная Boolean. Если ее передать True, то полученный Handle может в будущем быть использован другим процессом. Но нам это не надо. Передаем туда False.
DwProcessId — так, а это очередная вещь — идентификатор (id) процесса. Нам надо и его получить. Как? Просто! Функция GetCurrentProcessId, вызываемая без параметров (слава Богу) просто возвращает id текущего процесса.
Все. Можно вздохнуть и все сделать красиво.
Но сразу предупрежу — приоритет лучше всего менять не постоянно, а на время. То есть, перед критическим участком кода ставим приоритет High или RealTime, а потом снова Normal. Еще раз повторюсь, что использование RealTime приоритета — вещь опасная. Ну вот и все, заставьте Windows поделиться пирогом ресурсов!
Как изменить приоритет процесса и как его сохранить (высокий, низкий)
Доброго времени!
Первый и самый главный вопрос, с которого следовало бы начать данную статью: зачем вообще менять приоритет и стоит ли это делать. 👀
Представьте, вот вы запускаете тяжелую игру (или редактор видео, или еще что-то. ) далеко на не самом мощном компьютере. Причем, помимо вашей игры в Windows (обычно) запущено достаточно большое количество процессов, приложений. И в определенное время они могут «забирать» часть ресурсов себе — в результате игра время от времени притормаживает.
Смена приоритета процесса же позволяет указать Windows, что запущенная игра — это первоочередная задача, которой нужно выделить все основные ресурсы (а все остальное может подождать. ) . Благодаря заданию приоритетов для самых «главных» для вас программ — можно снизить количество притормаживаний и лагов, ускорить их работу.
Т.е. тема достаточно интересна, и может быть очень полезна как для любителей игр, так и для работы с видео, фото и пр. ресурсоемкими задачами.
Теперь ближе к сути.
Работа с приоритетами.
У каждой запускаемой программы или процесса в Windows есть приоритет. Обычно, ОС Windows «сама знает» кому и что выделять, и делает это автоматически (без участия пользователя). Вообще разнообразие приоритетов не такое уж и большое:
- Idle (низкий) — программы, выполнение которых может и подождать (при выставлении данного приоритета некоторый софт может тормозить) ;
- Below Normal (ниже среднего);
- Normal (средний) — большинство программ запускаются со средним приоритетом;
- Above Normal (выше среднего);
- High (высокий);
- Real Time (реального времени) — самый высокий приоритет. При его выставлении — в первую очередь будет выполняться именно эта программа.
Отмечу, что с приоритетами High и Real Time нужно быть крайне осторожными: в некоторых случаях при выставлении оных — компьютер может зависнуть или Windows завершит работу с ошибкой.
Еще один совет : нет необходимости выставлять приоритет каждой запускаемой программе (с этим Windows хорошо справляется в авто-режиме). Как правило, есть смысл указать приоритет для 2÷5 часто-используемых приложений, которые для вас наиболее важны.
Изменение приоритета
И так, чтобы поменять приоритет работающей программы (процесса) в Windows — необходимо воспользоваться диспетчером задач . Для того, чтобы его вызвать — нажмите сочетание кнопок Ctrl+Shift+Esc (либо Ctrl+Alt+Del).
Для вызова диспетчера задач — нажмите Ctrl+Shift+Esc
Далее откройте вкладку «Подробности» (это для Windows 10, для Windows 7 — «Процессы») и найдите в списке нужный процесс ( прим. : название программы совпадает с названием процесса) .
После, на нужном процессе кликните правой кнопкой мышки: в появившемся меню перейдите во вкладку «Задать приоритет» и укажите нужный вам.
Задание приоритета для запущенного процесса
Собственно, на этом всё! Теперь запущенная программа будет работать с новым приоритетом. При выставлении приоритета реального времени — возможно, компьютер начнет тормозить.
Сохранение приоритета с помощью настроек реестра
После перезагрузки компьютера (или при перезапуске программы) — установленный вами приоритет сбрасывается (т.е. Windows снова задает его автоматически). И это не очень удобно.
Но с помощью настроек реестра можно «сохранить» указанный вами приоритет (т.е. Windows будет «знать», что эту программу нужно запустить с таким-то приоритетом).
Как это сделать:
- сначала необходимо открыть редактор реестра (нажмите Win+R , и введите команду regedit , нажмите OK). У кого не открылся редактор, привожу в помощь одну свою старую заметку: https://ocomp.info/sposoby-otkryit-redaktor-reestra.html
regedit — открыть редактор реестра
далее необходимо открыть следующую ветку реестра (можно просто ее скопировать и вставить в редактор): HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\
Какую ветку в реестре нужно открыть
затем нужно узнать точное название исполняемого файла программы (игры). Для этого просто щелкните правой кнопкой мышки по ее ярлыку и перейдите в свойства . После, в разделе «Ярлык» — в строке «Объект» скопируйте название исполняемого файла;
Узнаем название исполняемого файла игры / Кликабельно
теперь в открытой ветке реестра создайте раздел (папку) с именем исполняемого файла программы (которое мы узнали в предыдущем шаге) . В моем случае — это «civilization4.exe» (без кавычек и с маленькими буквами!) ;
Создание раздела / Реестр
далее в ветке с названием игры (программы) создайте еще один раздел (папку) и назовите ее «PerfOptions» , см. пример ниже;
последний штрих: в разделе «PerfOptions» создайте параметр DWORD (32), присвойте ему имя » CpuPriorityClass » и задайте значение исходя из требований, в моем случае это «3» ( прим.: 1 — низкий приоритет; 5 — ниже среднего; 8 — средний; 6 — выше среднего; 3 — высокий) .
Создать параметр DWORD32
в конечном итоге получится так, как показано на скрине ниже.
Что получилось в итоге!
Для Windows 7 есть спец. программа Prio, позволяющая задавать (и сохранять) приоритеты для практически любых программ и процессов. Правда, в Windows 10 она не работает (поэтому выше я и привел универсальный рабочий способ для всех современных ОС Windows).
Запуск приложения с нужным приоритетом (через командную строку)
Есть еще один вариант задания приоритета приложению — речь идет о командной строке (разумеется, если создать «BAT» файл — то запуская его, можно всегда иметь программу с нужным приоритетом) .
Как это сделать:
- создать на рабочем столе (например) обычный текстовый файл;
Создать текстовый документ
Вставка строки в блокнот и сохранение
после чего сохраните текстовый файл, закройте его и переименуйте расширение: с «TXT» на «BAT» (или «CMD»). Если у вас не отображается расширение файла, ознакомьтесь вот с этой заметкой: https://ocomp.info/kak-uvidet-skryityie-faylyi-i-papki.html
Изменяем расширение блокнота с TXT на CMD
Дополнения по теме будут весьма кстати.
Приоритеты в Windows
Введение
По определению, Windows является многозадачной операционной системой. То есть одновременно в ней могут выполняться несколько задач. Однако задача задаче рознь. И различие это заключается в приоритете. То есть, при выполнении какой-либо программы Windows распределяет ресурсы определенным образом, в зависимости от того, какой приоритет у какого процесса (программы). Программы в дальнейшем я буду называть процессами, так проще. Каждая запущенная программа в Windows представляет собой процесс. Приоритеты бывают разные — большие, маленькие, но об этом потом. Чем это может нам помочь? А вот чем. Многие сетуют на медленность выполнения программ на Vb. В свое время я на это наткнулся на самом наглядном примере. Представьте себе программу, которая должна через определенный интервал времени выполнять какое-либо действие — ну, например, что-то выводить пользователю. Просто — скажете Вы. Берем таймер и вперед. А если помимо этого периодически программа должна что-то еще считать, и не один раз, а таймеров много? Будет тормозить. Причем не Windows, а только программа. Несправедливо? Да. Это значит, что Windows отделяет мало ресурсов Вашей программе, которых ей явно недостаточно. Значит попросить у Windows больше, только как?
Вот так
Значит надо менять приоритет. Самое время о них поговорить. В Windows’98 приоритетов меньше, чем в Windows Me или 2000, но они таки есть J. Вот они.
Приоритет реального времени (real time) — программа выполняется так, как будто она одна и есть цель жизни Windows. Все ресурсы отдаются ей.
Высокий приоритет (high) — программа выполняется так, чтобы оставить чуть-чуть остальным приложениям.
Нормальный (normal) — выполнение идет обычным путем.
Низкий (idle) — если выполнение и идет, то только когда Windows делать нечего.
Ну так вот, запущенная программа сначала получает приоритет Normal, и выполняется своим чередом. При этом приоритете, что бы программа ни делала, она не сможет съесть ресурсов столько, чтобы повис Windows. В теории. Но нам так не подходит. Нам надо приоритет high или, если все очень напряжно, real time. Но real time — вещь опасная. Может запросто затормозиться даже мышка. А об остальных программах я и говорить на хочу. Просто копец и все тут. Итак, как же все таки приоритет поменять.
Снова API
Да, за установку приоритета отвечает функция SetPriorityClass. То есть, вызвав ее, и передав все, что ей надо, мы получим нужный приоритет.
- hProcess — это Handle процесса. О нем ниже.
- dwPriorityClass — приоритет. Он то нам и нужен.
Константы приоритетов:
Все просто — берем константу и вперед, но нам надо получить Handle процесса. То есть, процесс и окно для Windows вещи хоть и почти синонимичные, но не всегда. Handle окна — одна вещь, Handle процесса — совсем другая. То есть, у процесса может быть много окон, но у окна только один процесс владелец. Значит, нам надо научиться находить Handle именно процесса. В этом нам поможет функция OpenProcess, которая после передачи ей параметров, скажет, что за Handle у процесса.
dwDesiredAccess — что мы хотим узнать (Handle у процесса бывают разные, для завершения процесса — одни, для получения информации — другой). Мы будем использовать константу PROCESS_QUERY_INFORMATION, то есть опрашивать процесс.
bInheritHandle — переменная Boolean. Если ее передать True, то полученный Handle может в будущем быть использован другим процессом. Но нам это не надо. Передаем туда False.
DwProcessId — так, а это очередная вещь — идентификатор (id) процесса. Нам надо и его получить. Как? Просто! Функция GetCurrentProcessId, вызываемая без параметров (слава Богу) просто возвращает id текущего процесса.
Все. Можно вздохнуть и все сделать красиво.
Но сразу предупрежу — приоритет лучше всего менять не постоянно, а на время. То есть, перед критическим участком кода ставим приоритет High или RealTime, а потом снова Normal. Еще раз повторюсь, что использование RealTime приоритета — вещь опасная. Ну вот и все, заставьте Windows поделиться пирогом ресурсов!