Что произойдет, если я установлю приоритет реального времени для однопоточного процесса на многоядерном ПК?

Что произойдет, если я установлю приоритет реального времени для однопоточного процесса на многоядерном ПК?

Я имею в виду операционную систему Windows 10, но полагаю, что ответ может быть независимым от ОС.

В Windows уровень приоритета реального времени является наивысшим и используется, например, для обработки ввода с клавиатуры и мыши.

Из того, что я прочитал в интернете:

Если перевести ресурсоемкий процесс в режим реального времени, клавиатура и мышь перестанут реагировать, поскольку ОС не получит достаточно процессорного времени для обработки этих входных данных.

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

См., например, этот пост Microsoft:Когда вы устанавливаете 100%-ный приоритет ЦП-программы в режиме реального времени, вы получаете то, что просили..

Вопрос:

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

Если я запускаю однопоточный процесс с приоритетом реального времени, я понимаю, что он будет выполняться без остановки, пока не завершится. Но если у меня есть второе ядро, смогу ли я использовать свой ПК, пока этот процесс выполняется, благодаря этому второму ядру?

Если да, то это имеет практическое применение.Я могу запустить вычислительную задачу, результат которой мне нужен как можно скорее, на одном ядре, при этом продолжая использовать свой ПК на другом ядре.

решение1

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

Это преувеличение. Есть несколько вещей, которые делают это неправдой:

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

  2. Большинство потоков не тратят весь свой код на выполнение в ЦП, поэтому они не будут использовать 100% ЦП независимо от их приоритета. Большинству потоков время от времени приходится чего-то ждать. Обычно они ждут завершения ввода-вывода, или устранения ошибки жесткой страницы, или какого-либо другого потока, который сообщит, что им больше не нужно ждать. (Другой поток может находиться в том же процессе или в другом.)

  3. Первые этапы обработки прерываний от аппаратных устройств (включая прерывания от часов реального времени) происходят независимо отлюбойПотоковый код. У этого материала нет «приоритета», поскольку приоритет — это атрибут потока, но прерывания не обрабатываются потоками. Они имеют приоритет над потоковым кодом независимо от приоритета последнего. Вы можете увидеть время, используемое этим материалом, как «Системные прерывания» на вкладке «Подробности» диспетчера задач Windows 10.

Класс приоритета реального времени отличается от других классов приоритета следующим:

  1. Он имеет более высокий приоритет, чем все остальные классы приоритета (разумеется).

  2. Потоки процессов в этом классе не получают автоматически настроенные приоритеты в зависимости от их недавней активности, как это происходит с потоками процессов в других классах по умолчанию. (Настройку приоритета потоков можно отключать и включать программно, но по умолчанию она включена для процессов, не выполняющихся в реальном времени.)

Но если у меня есть второе ядро, смогу ли я использовать свой ПК во время работы этого процесса благодаря этому второму ядру?

Вероятно. На самом деле, это так, даже если у вас только одно ядро ​​с включенной гиперпоточностью.

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

решение2

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

В идеале вы должны использовать что-то для выделения ядер, а не приоритет. Приоритет влияет на весь процессор. Если вы используете VBox, например, то установка большего количества потоков будет намного эффективнее для многозадачности и использования его одновременно, чем установка приоритета.

TL;DR Если многозадачность с ресурсоемкими задачами ЦП, выделяйте ядра задачам и не переопределяйте приоритет на реальный режим. При необходимости может помочь использование виртуализации для сегментации ресурсов.

Связанный контент