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

3074
Moses

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

Почему это? Происходит ли что-то еще или что еще нужно сделать?

18
Это как в реальной жизни. Если у вас более высокий приоритет по посадке в самолет, чем у другого пассажира, это не значит, что полет займет у вас меньше времени! Mehrdad 9 лет назад 6

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

29
Andon M. Coleman

Priority does not help when the bottleneck is the CPU itself. What priority actually does is affect the scheduling algorithm the Operating System uses to determine which process runs next since there are not enough processors in most systems to run every process continuously.

A higher-priority task will make its way to the top of the queue quicker, so this helps with general latency, but if your process is exhausting the entire timeslice it is allocated on actual computation then scheduling is not going to change anything there. Changing the priority is more useful when you have a process that is waiting on I/O and you want it to be more responsive.

Приоритет помогает, когда узким местом является слишком много выполняемых потоков. Потоки с более высоким приоритетом в Windows, которые остаются работоспособными в конце своего временного интервала, получат еще один шанс запустить в предпочтении поток с более низким приоритетом (Windows старается не истощать потоки с низким приоритетом и иногда повышает их). Приоритет мало влияет на потоки, ожидающие ввода-вывода - Windows временно повышает приоритет потока после завершения ввода-вывода, в зависимости от типа ввода-вывода, на котором он ожидал. Mike Dimmick 9 лет назад 5
4
Jason

Priority is CPU time. Are all cores being 100% utilized all the time? If not, then priority would have no effect. Quite often the CPU is not the bottleneck, and it's memory, disk, or GPU resources.

3
Mike Dimmick

Приоритет имеет значение только в том случае, если потоков больше, чем доступных ядер ЦП. Когда это происходит, приоритет определяет, какие потоки запускаются. В большинстве систем не хватает вычислений для любого конфликта на CPU: все потоки заблокированы, ожидая, что что-то произойдет. Возможно, вам придется что-то набрать, переместить мышь, коснуться экрана или получить данные, поступающие с диска, из сети, с другого подключенного устройства или до завершения работы другого потока с критически важными данными. состав. Возможно, что часть программы будет ждать чтения с диска или некоторой памяти, которая была выгружена для последующего чтения, а не явно читать файл.

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

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

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

До Windows Vista приоритет потока не влиял на скорость выполнения операций ввода-вывода. Начиная с Windows Vista, операции ввода-вывода также могут иметь приоритет, который по умолчанию исходит из приоритета потока.

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

0
Jon Onstott

In general, it takes extra effort to make a program use more than one CPU (by adding multi-threading). So even if the program has the highest available priority, it may only be using one core.

Other possible issues:

  • The program could be inefficient / poorly written
  • It could be slowed down due to "slow" disk access or a slow network
0
sdenham

Even boosting the I/O priority of a I/O-bound process will not necessarily cause it to run faster. For example, if it is a consumer of data produced by a separate, possibly remote, process, and it is keeping up with the rate at which that source produces the data, then it cannot go faster or have a higher throughput.

Contrary to what is categorically stated in the first sentence of the currently-accepted answer (https://superuser.com/a/752587/322588), priority changes are most effective when the CPU is the bottleneck, as explained in Mike Dimmick's answer (https://superuser.com/a/752864/322588). Furthermore, the statement in the accepted answer's second paragraph, "if your process is exhausting the entire timeslice it is allocated on actual computation then scheduling is not going to change anything there" is completely wrong unless the process already generally has the highest priority of all runnable threads whenever it is waiting to run. This is because in all other circumstances, raising the priority is likely to get it more timeslices per wall-clock interval.

Mike Dimmick pointed out the problems with this answer a couple of days ago, and provided a much better answer, yet the first inexplicably continues to gain votes. Its author's claim that he is merely dumbing-down his answer for us dummies is not plausible, because it is not merely simple, or even simplistic, it is flat-out wrong, at least with regard to CPU-bound processes.

Disclaimer: I do not know Mr. Dimmick, though I can tell he knows what he is writing about.

Возможно, вы неправильно поняли; вопрос был о процессах *** работающих *** быстрее. Процессы, связанные с процессором, исчерпают весь свой блок планирования (квант) и затем в конце переходят в очередь готовых процессов. В настольной операционной системе, такой как Windows, это означает, что процесс имеет шансы 1 / квант-Гц запускаться каждую секунду. Изменение приоритета (как правило) не меняет длину временных интервалов. Для завершения всегда требуется одинаковое количество квантов планирования. *** Важно отметить, что именно так Windows фактически измеряет время выполнения процесса: количество запланированных квантов. Andon M. Coleman 9 лет назад 0
Процесс может * закончиться * раньше, но он все еще *** выполняется *** для того же количества единиц планирования. Когда процесс, связанный с вводом / выводом, помещает себя в список ожидания, он может получить второй шанс для запуска и выгрузить запущенный процесс с более низким приоритетом до истечения его кванта, если его операция ввода / вывода завершится. Связанные с процессором процессы не имеют такой свободы, они исчерпывают весь свой временной интервал и затем переходят в готовую очередь. *** Для них *** возможно запускать сразу после этого, если они имеют достаточно высокий приоритет, но это не имеет ничего общего с тем, как Windows измеряет время выполнения. Andon M. Coleman 9 лет назад 0
Приоритет ожидающего процесса ввода-вывода существенно отличается, и он может оказать ощутимое влияние на время выполнения в Windows, о котором сообщается. Опять же, Windows измеряет время выполнения как количество квантов, срок действия которых истек (даже если процесс тратит 1 мс из фактически запущенного кванта 10 мс, а затем добровольно ожидает оставшиеся 9 мс для операций ввода-вывода, ядро ​​Windows считает, что это значение составляет 10 мс пользовательского режима выполнения). Вытеснение может помочь приложениям, связанным с вводом / выводом, занять меньше квантов для завершения. Другие ядра (например, Linux) могут правильно измерять частичные кванты во время выполнения процесса, но Windows не может. Andon M. Coleman 9 лет назад 0
@ AndonM.Coleman Начиная с Vista и позже, да, может и делает. Jamie Hanrahan 8 лет назад 0
@JamieHanrahan: Ну, вы всегда можете позвонить [`timeBeginPeriod (...)`] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd757624 (v = vs.85) .aspx ), что-нибудь интерактивное уже делает. Игра обычно устанавливает это в ** 1 **, когда это запускается, и это применяет интервал планирования 1 мс по всей доске ко всему, что работает в системе. Он не изолирован только от процесса, который это сделал. Это одна из причин, по которой трудно воспринимать Windows всерьез для многозадачности. Andon M. Coleman 8 лет назад 0
@ AndonM.Coleman timeBeginPeriod фактически не меняет разрешение временных интервалов. Временные интервалы по-прежнему считаются с кратностью ~ 15 мсек (теперь определяется по 15 прерываниям по времени вместо одного). Однако, начиная с Windows Vista, Windows считывает счетчик циклов ЦП (код операции RDTSC) при каждом переключении контекста в поток и из потока и использует его, чтобы повысить точность учета как времени, так и времени ЦП. например, если вы ждете после использования 1 мс временного интервала, с вас не взимается плата за весь временной интервал, а при повторном запуске вы получаете возможность запустить оставшуюся часть временного интервала. Jamie Hanrahan 8 лет назад 0
@ AndonM.Coleman Теперь я думаю, что мы можем видеть источник вашего замешательства. Заданный вопрос о ** скорости ** приложения, но метрика, которую вы описываете и на которой основываете свой аргумент, представляет собой счетчик квантов - показатель использования ресурсов, а не показатель в отношении времени, как вы подтвердите в первом предложении вашего второго ответа. sdenham 7 лет назад 0

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