Счетчик приоритетов декодирования системного монитора [Windows 10]

658
mrmagin

Таким образом, в приложении я могу прикрепить счетчик базовых приоритетов к таким процессам, как Google Chrome. Это показывает его приоритет как "8". Если я смотрю в диспетчере задач, Google Chrome имеет «нормальный приоритет».

У меня вопрос, существует ли какая-либо таблица, показывающая, что число 8 в исполнении совпадает с обычным приоритетом?

РЕДАКТИРОВАТЬ: я только заметил, что процесс простоя имеет приоритет 0. Но в соответствии с этим

https://docs.microsoft.com/en-us/windows/desktop/procthread/scheduling-priorities

«Только нить с нулевой страницей может иметь приоритет ноль».

Я так смущен этим: <

0

2 ответа на вопрос

0
harrymc

Хорошим и очень подробным источником информации является статья
Windows OS Hub: Управление приоритетами процессов в Windows .

Вот некоторые выдержки:

В Windows 32 уровня приоритета, от 0 до 31.

Они сгруппированы следующим образом:

  • 31 - 16 уровни в реальном времени
  • 15 - 1 - динамические уровни
  • 0 - системный уровень, зарезервированный для потока нулевой страницы

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

  • Класс в реальном времени (значение 24),
  • Высокий класс (значение 13),
  • Выше нормального класса (значение 10),
  • Нормальный класс (значение 8),
  • Ниже нормального класса (значение 6),
  • или простой класс (значение 4).

Приоритет, 8который вы наблюдали, является «нормальным» приоритетом. Приоритет 0является самым низким из возможных, поэтому процесс никогда не будет выполняться, пока существует процесс или поток с более высоким приоритетом.

Если вы хотите подробнее узнать о работе Windows, см. Статью Марка Э. Руссиновича и Дэвида А. Соломона:
Процессы, потоки и задания в операционной системе Windows .

0
Jamie Hanrahan

Эту таблицу довольно легко было найти на microsoft.com и в бесчисленном количестве других мест.

enter image description here

Столбец «Базовый приоритет» в диспетчере задач показывает класс процесса (в некоторых документах он называется «класс приоритета процесса»). Обратите внимание, что диспетчер задач (по крайней мере, в Windows 10) помечает класс приоритета «Idle» как «Низкий» (возможно, чтобы избежать путаницы с процессом бездействия и т. Д.).

Класс процесса используется только для инициализации приоритета потоков, созданных в процессе. Каждый поток создается с «нормальным» приоритетом потока. Если процесс относится к «нормальному» классу процесса, это означает, что поток имеет базовый приоритет 8.

(Как ни странно, API CreateProcess принимает аргумент для класса процесса, а CreateThread - нет. Чтобы создать поток с приоритетом потока, отличным от «обычного», необходимо создать поток, а затем изменить его приоритет позже с помощью SetThreadPriority.)

Программы могут изменять приоритеты своих потоков в своем классе процессов. В «нормальном» процессе установка для потока значения THREAD_PRIORITY_HIGHEST устанавливает базовый приоритет этого потока равным 10. Если вы измените класс приоритета процесса (скажем, с помощью диспетчера задач), то базовый приоритет каждого потока изменится в соответствии с таблицей.

В этой таблице много "аномалий имен". «Самый высокий» не является наивысшим приоритетом потока, «самый низкий» не является самым низким, «бездействующий» не означает, что вы ничего не делаете или не будете делать, а «в реальном времени» не гарантирует планирование поведения, подходящее для работы в реальном времени ( это просто более предсказуемо, чем классы не в реальном времени, отчасти потому, что он выше их всех, а отчасти потому, что автоматическая корректировка приоритетов отключена в классе «реального времени»).

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

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

Вы заметите, что на столе нет «0». Обычные приложения не могут запрашивать выполнение с приоритетом 0 через обычные API. Только потоки режима ядра могут работать с нулевым приоритетом. Как вы обнаружили, это зарезервировано для нити нулевой страницы - или тем; на машине NUMA может быть больше одного.

Что касается бездействующего процесса - это и его потоки являются особыми случаями. Каждый объект потока имеет элемент «приоритета», и для незанятых потоков они устанавливаются в 0. Однако члены приоритета незанятых потоков фактически никогда не используются ни для чего, и нет готовой очереди для незанятых потоков. Вместо этого, если планировщик ОС не может найти какой-либо другой поток для работы на доступном процессоре, он просто выбирает свободный поток для этого процессора. (Каждый ЦП имеет свой собственный выделенный незанятый поток.) ​​Таким образом, хотя он, кажется, имеет приоритет 0, он запланирован так, как если бы он имел приоритет отрицательный 1. Даже поток с приоритетом 0 будет иметь приоритет над незанятым потоком.

Термин «бездействующий» имеет по крайней мере еще одно общее значение в Windows. Процесс может «зарегистрироваться для обнаружения простоя». «В режиме ожидания» в этом случае означает, что не было никакого пользовательского ввода (клавиатура или мышь) и не более 10% использования любого процессора или любого диска в течение последних пятнадцати минут. Windows может инициировать различные задачи «уборки» или «очистки», такие как оптимизация размещения файлов, при обнаружении такого рода «простоя». Код, который запускается в ответ на это, не обязательно выполняется в классе незанятых процессов или с приоритетом незанятых потоков. Возможно, вы видели небольшой метод командной строки для запроса запуска «пустых задач»:

C:\> Rundll32.exe advapi32.dll,ProcessIdleTasks 

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

Я написал ответ более подробно о том, как планировщик использует приоритеты потоков, чтобы сделать его выбор здесь .

Справка: https://docs.google.com/viewer?url=https%3A%2F%2Fdownload.microsoft.com%2Fdownload%2F1%2F4%2F0%2F14045a9e-c978-47d1-954b-92b9fd877995%2F97807356648739_samplechapters.pdf Это это набор выдержек из Windows Internals 6-е изд. Соломоном, Руссиновичем и др . Материал, который вы хотите, начинается на странице 62 PDF, фактическая страница книги номер 408.

Извините за поздний ответ здесь, но можно ли с уверенностью сказать, что бездействие - это тип потока с нулевой страницей? Мне трудно найти эту информацию на любой официальной странице от Microsoft. mrmagin 5 лет назад 0
Нет. Потоки нулевой страницы называются так, потому что у них есть определенная задача; они перезаписывают свободные страницы оперативной памяти нулями и перемещают их из списка свободных в нулевой список. Свободные потоки этого не делают. До того, как Windows начала управлять питанием, они буквально ничего не делали - они просто остановили процессор, на котором они были! Сегодня они не совсем бездействуют; в основном они выполняют небольшую работу, связанную с управлением питанием процессора. И, как я уже сказал, они выбраны для выполнения так, как если бы они имели приоритет ** ниже ** нуля, т.е. отрицательный, даже если их приоритетные элементы установлены в ноль. Jamie Hanrahan 5 лет назад 0
Что касается "официальных страниц Microsoft", я добавил ссылку на свой ответ. Jamie Hanrahan 5 лет назад 0

Похожие вопросы