Меню Рубрики

Приоритет реального времени windows

Приоритеты в 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 программно, и если вы это сделаете, вы никогда не должны менять их на «в реальном времени».

Что делает настройка приоритета процесса «в реальном времени» по сравнению с «высоким» и «выше нормального»?

7 ответов

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

создание реалтайм приоритет потоков требует привилегий (SeIncreaseBasePriorityPrivilege), поэтому это может быть сделано только административными пользователями.

для Vista и за ее пределами, один вариант для приложений, которые требуют, чтобы они работали на приоритеты в реальном времени-использовать Служба Планировщика Мультимедийных Классов (MMCSS) и пусть он управляет приоритетом ваших потоков. MMCSS не позволит вашему приложению использовать слишком много времени процессора, поэтому вам не придется беспокоиться о танкере машины.

просто класс приоритета » в реальном времени «выше класса приоритета» High». Не думаю, что есть что-то большее. О да — вы должны иметь SeIncreaseBasePriorityPrivilege чтобы поместить поток в класс реального времени.

Windows иногда повышает приоритет потока по различным причинам, но это не повысит приоритет потока в другой класс приоритета. Это также не повысит приоритет потоков в классе приоритетов реального времени. Таким образом, высокоприоритетный поток не получит любой автоматический временный импульс в класс приоритетов реального времени.

глава Русиновича «внутри Windows» о том, как Windows обрабатывает приоритеты, является отличным ресурсом для изучения того, как это работает:

обратите внимание, что нет абсолютно никаких проблем с потоком, имеющим приоритет в реальном времени в обычной системе Windows — они не обязательно для специальных процессов, работающих на машинах dedicatd. Я предполагаю, что мультимедийные драйверы и / или процессы могут нуждаться в потоках с приоритетом в реальном времени. Однако такой поток не должен требовать много CPU — он должен блокировать большую часть времени, чтобы обычные системные события получали обработку.

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

Так что, если вам нужно спросить, не используйте его:)

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

аналогично, real-time также является уровнем приоритета потока.

приоритет процесса класс повышает или понижает все эффективные приоритеты потоков в процессе и поэтому считается «базовым приоритетом».

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

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

в NT6+ (Vista+), использование Vista Multimedia Class Scheduler-это правильный способ достижения операций в реальном времени в том, что не ОСРВ. Он работает, по большей части, хотя и не идеален, поскольку ОС не предназначена для операций в реальном времени.

Microsoft считает этот приоритет очень опасно, это правильно. Ни одно приложение не должно использовать его, кроме как в особых обстоятельствах, и даже тогда пытаться ограничить его использование временными потребностями.

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

установка приоритета от простоя до реального времени не изменяет использование ЦП.

Я обнаружил на своем многопроцессорном процессоре AMD, что если я отброшу один из процессоров ot, как последний, использование процессора будет максимальным, а последний процессор останется бездействующим. Скорость процессора увеличивается до 75% на моем Quad AMD.

использовать Диспетчер задач — >выбрать процесс — >справа Нажмите на процесс — >выбрать — >установить сродство Щелкните все, кроме последнего процессора. Использование ЦП увеличится до максимума на оставшихся процессорах и подсчетах кадров, если обработка видео увеличится.

Это в основном выше / больше во всем остальном. Клавиатура имеет меньший приоритет, чем процесс реального времени. Это означает, что процесс будет учитываться быстрее, чем клавиатура, и если он не может справиться с этим, то ваша клавиатура замедляется.

Как и все другие ответы, прежде чем в режиме реального времени дает этой программе приоритетный класс. Ничего не обрабатывается до тех пор, пока эта программа не будет обработана.
На моей машине pentium 4 я установил minecraft в режиме реального времени, так как это значительно повышает производительность игры, и система кажется полностью стабильной. так что в реальном времени не так плохо, как кажется, просто если у вас есть многоядерный набор сродства программы к определенному ядру или ядрам (просто не все из них, просто чтобы все остальное могло работать в случае, если программы в реальном времени будут отключены) и установите приоритет в режиме реального времени.

Источник

Управление приоритетами процессов в Windows

Давайте поговорим о приоритетах Windows процессов. В большинстве случаев «играться» с настройкой приоритетов нет необходимости, но, иногда, грамотный системный администратор может помочь системе более правильно распределить процессорное время между запущенными задачами. Единого рецепта нет, но путем «подбора и перебора» это вполне реализуемо. Где это может понадобиться? Например, в связке 1С-SQL можно дать больше процессорного времени 1С и SQL, как наиболее критичным к ресурсам процессам.

В общем случае, посмотреть и изменить приоритет запущенного процесса можно через Task Manager

Windows NT/2000/7/2008

В Windows 2012 это “закопали» чуть глубже

Как видно из приведенных примеров, вам доступно всего 6 приоритетов (как выяснится позже, это классы приоритетов). Достаточно? Microsoft считает, что да. Но давайте вспомним «легендарную» фразу Билла Гейста, который сказал, что «640 KB of RAM will be enough for everybody”. Но время показало, что это далеко не так. : )

А теперь давайте разберемся, как это есть на самом деле.

На самом деле в Windows существует 32 уровня приоритета, от 0 до 31.

Они группируются так:

  • 31 — 16 уровни реального времени;
  • 15 — 1 динамические уровни;
  • 0 — системный уровень, зарезервированный для потока обнуления страниц (zero-page thread).

При создании процесса, ему назначается один из шести классов приоритетов:

  1. Real time class (значение 24),
  2. High class (значение 13),
  3. Above normal class (значение 10),
  4. Normal class (значение 8),
  5. Below normal class (значение 6),
  6. или Idle class (значение 4).

Посмотреть приоритет процесса, как писалось выше, можно, используя Task Manager.

Приоритет каждого потока (базовый приоритет потока) складывается из приоритета его процесса и относительного приоритета самого потока. Есть семь относительных приоритетов потоков:

  1. Normal : такой же как и у процесса;
  2. Above normal : +1 к приоритету процесса;
  3. Below normal : -1;
  4. Highest : +2;
  5. Lowest : -2;
  6. Time critical : устанавливает базовый приоритет потока для Real time класса в 31, для остальных классов в 15.
  7. Idle : устанавливает базовый приоритет потока для Real time класса в 16, для остальных классов в 1.

В следующей таблице показаны приоритеты процесса, относительный и базовый приоритеты потока.

Приоритет потока Класс процесса Класс процесса
Idle class Below normal class Normal class Above normal class High class Real time class
1 Idle Idle Idle Idle Idle
2 Lowest
3 Below …
4 Idle class Normal Lowest
5 Above … Below …
6 Below normal class Highest Normal Lowest
7 Above … Below …
8 Normal class Highest Normal Lowest
9 Above … Below …
10 Above normal class Highest Normal
11 Above … Lowest
12 Highest Below …
13 High class Normal
14 Above …
15 Highest
15 Time critical Time critical Time critical Time critical Time critical
16 Idle
17
18
19
20
21
22 Lowest
23 Below …
24 Real time class Normal
25 Above …
26 Highest
27
28
29
30
31 Time critical

Теперь, когда мы все это узнали, что же с этим всем можно сделать? Ну, например, начать использовать.

Как еще можно запустить процесс с «нестандартным» приоритетом или изменить?

Метод 1. Запустить задачу/процесс и изменить приоритет через Task Manager.

  • Доступно только 6 приоритетов
  • Переключение приоритетов производится мышкой, не автоматизируется.

Метод 2. Можно воспользоваться командой START с соответствующими ключами

Доступные ключи, отвечающие за приоритеты, следующие (я умышленно опускаю ключи командной строки команды START не имеющие отношения к описываемому процессу работы с приоритетами):

C:\>start /?
Starts a separate window to run a specified program or command.
START [«title»] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED][/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL][/NODE ] [/AFFINITY ] [/WAIT] [/B][command/program] [parameters]LOW Start application in the IDLE priority class.
NORMAL Start application in the NORMAL priority class.
HIGH Start application in the HIGH priority class.
REALTIME Start application in the REALTIME priority class.
ABOVENORMAL Start application in the ABOVENORMAL priority class.
BELOWNORMAL Start application in the BELOWNORMAL priority class.

Как видим, команда START дает возможность запустить процесс все с теми же 6-ю приоритетами, которые доступны через Task Manager

  • Доступно только 6 приоритетов

Метод 3. Использование утилиты wmic.exe

Как было показано выше, Task Manager, и команда START достаточно неуклюжи для задачи назначения приоритетов. Посмотрим, как это применять более гибко. Будем использовать утилиту wmic.exe.

wmic process where name=»AppName» CALL setpriority ProcessIDLevel

wmic process where name=»calc.exe» CALL setpriority 32768

wmic process where name=»calc.exe» CALL setpriority «above normal»

  • idle: 64
  • below normal: 16384
  • normal: 32
  • above normal: 32768
  • high priority: 128
  • real time: 256

Вот короткий пример запуска wmic.exe для получения необходимой информации

wmic process list brief

Вы получите список процессов, запущенных на вашем локальном компьютере. Теперь выполните команду:

wmic process list brief | find «cmd.exe»

Специально запустил несколько копий cmd.exe, чтобы иллюстрация была более полной.

Теперь список процессов ограничен только теми процессами, в имени исполняемого модуля которых присутствует строка «cmd.exe». Обратите внимание на PID процесса(ов).

Теперь давайте попробуем отобрать интересующие нас процессы, используя непосредственно WMI и не прибегая к стандартным средствам командной строки. Для этого просто напишите:

wmic process where description=’cmd.exe’ list brief

Сравните полученные результаты. Запомните PID процесса CMD.EXE.

Командная строка для запуска wmic.exe

wmic process where processid=’XXXX’ CALL setpriority ProcessIDLevel

Ну а теперь можем изменить приоритет конкретного процесса (например с PID=8476):

wmic process where processid=’8476′ CALL setpriority 32768

wmic process where processid=’8476′ CALL setpriority «above normal»

А что дальше? Прикидывать, пробовать, подбирать и тонко регулировать приоритеты. Улучшая работу сервисов и процессов, а также работу конечных пользователей.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

  • Приоритет правил брандмауэра windows
  • Приоритет звука windows 10
  • Приоритет адаптера tunngle windows 10
  • Приоритет автозагрузки windows 7
  • Принцип работы домена windows