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

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

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

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

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

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

2 ответа2

0

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

Столбец "Базовый приоритет" в диспетчере задач показывает класс процесса (в некоторых документах он называется "класс приоритета процесса"). Обратите внимание, что диспетчер задач (по крайней мере, в 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.df это набор выдержек из Windows Internals 6-е изд. Соломоном, Руссиновичем и др. Материал, который вы хотите, начинается на странице 62 PDF, фактическая страница книги номер 408.

0

Хорошим и очень подробным источником информации является статья
Концентратор ОС Windows: управление приоритетами процессов в Windows.

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

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

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

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .