29

Я установил приоритет некоторых процессов, чтобы увидеть, что на самом деле происходит, но, угадайте, что ... Ничего такого; все работает одинаково ...

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

2 ответа2

49

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

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

Чтобы по-настоящему поговорить об этом, нужно упомянуть темы. Процессы не "запускаются" в Windows. Потоки, которые являются частью процессов, являются тем, что выполняется. (Хотя, если у процесса есть только один поток, различие довольно размыто снаружи.)

(Между прочим: маркетинговая терминология, с помощью которой процессор имеет, например, "четыре ядра и восемь потоков", вводит в заблуждение. У процессоров есть ядра, но у процессоров нет "потоков". Потоки являются частью процессов. Ядро ЦП без включенной гиперпоточности может работать в одном потоке; при включенной гиперпоточности ядро может запускать два потока. Но процессоры не имеют потоков.)

Каждый поток всегда находится в одном из нескольких состояний планирования. Наиболее часто встречающиеся состояния: Ожидание (* nix называет это "заблокированным"; в обеих ОС это означает ожидание ввода-вывода или аналогичное, не использует процессорное время и не хочет его); Готов (хочет использовать процессорное время, но сейчас для него нет доступных процессоров); и работает. Только запущенные потоки потребляют процессорное время; т. е. если процесс не имеет запущенных потоков, будет видно, что он использует нулевое время процессора в таких инструментах, как диспетчер задач.

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

Большинство потоков в большинстве систем проводят большую часть своего времени в состоянии ожидания. (Вот почему ваш процесс простоя должен получать более 95% процессорного времени, когда ваша система ничего не делает.) Исключением могут быть "рабочие" потоки таких вещей, как видео или 3D-рендеринг, игры и т.д. Очень немногие потоки действительно могут использовать 100% ЦП, поскольку им обычно приходится работать с некоторыми входными данными, которые они должны откуда-то читать, они обычно создают выходные данные, которые должны быть где-то записаны. И они могут ссылаться на множество различных данных в памяти с течением времени, что может означать, что им приходится ждать, пока устранятся жесткие ошибки страницы.

Но потоки, выполняющие что-то вроде рендеринга видео или 3D-изображения, вполне могут потратить почти все свое время на "вычисления" в ЦП и очень мало ждать ввода-вывода. Такие потоки часто называют "привязанными к вычислениям", что означает, что их общая производительность в основном ограничена скоростью процессора.

Параметр, который вы задаете в диспетчере задач, фактически устанавливает "базовый приоритет" для всех потоков в процессе. Фактический или "текущий" приоритет потока может быть выше (но никогда не ниже базового). Подробнее об этом через минуту. Решения по планированию ("кто запускается и на каком процессоре") всегда принимаются с использованием текущего приоритета потока. Приоритет имеет смысл только для потоков Ready и Running (или, иначе говоря, приоритет не имеет значения для потоков Waiting).

Windows использует алгоритм упреждающего планирования. Если только один поток в системе хочет использовать процессорное время, то не имеет значения, каков его приоритет; он получает 100% процессора. Это не означает, что планировщик "сдерживает" часть возможностей ЦП, когда работает поток с низким приоритетом, на случай, если появится что-то с более высоким приоритетом.

Если два потока хотят использовать ЦП, и они имеют одинаковый приоритет, то они планируются с помощью так называемой «среза по времени», и со временем каждый получает около 50% времени ЦП. Тогда как если они имеют разные приоритеты, то поток с более высоким приоритетом получает 100%, а низший - ничего.

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

Если у вас более одного ядра процессора, все становится более интересным, и приоритеты в целом оказывают меньшее влияние. Предположим, у вас есть два потока, которые хотят работать. И предположим, что у вас есть два или более ядра ЦП, которые не выполняют ничего более равного или более высокого приоритета, чем эти потоки. Тогда ваши два потока получат 100% ядра, независимо от их приоритетов.

(Два человека появляются в супермаркете, и есть две бесплатные шашки. У одного из клиентов есть карточка "идти к голове". Не имеет значения.)

Версия tl; dr (пока): приоритеты не в том, "кто получает долю процессорного времени", а в том, "кто запускается первым".

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

О "базовом приоритете": Windows будет корректировать ("увеличивать" и "затухать") текущий приоритет потоков на основе того, что они сделали недавно. Потоки, которые недавно завершили операции ввода-вывода, обычно будут на две метки выше основания; Потоки пользовательского интерфейса (потоки, которые запускают окно) часто будут значительно выше; Связанные с процессором потоки обычно будут в их основе. Цель этого состоит в том, чтобы поддерживать отзывчивость в пользовательском интерфейсе программы, а также поддерживать поток запросов ввода-вывода к таким вещам, как диски.

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

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

В заключение...

Разумно оставить большинство вещей в "Нормальном". Если вы этого не сделаете, вы легко можете лишиться того, что вам действительно хотелось бы работать (даже если вы можете не знать, что оно существует), например, функции очистки дискового кэша ОС. Действительно, многие процессы ОС будут отличаться от нормальных, и их следует оставлять там, где их помещает Windows.

Разумный вариант использования диспетчера задач для работы с приоритетами - это если у вас есть какая-то задача по загрузке ЦП (например, видео или 3D-рендеринг), и она замедляет использование системы во время ее работы. Правильно, верить этому или нет, понизить приоритет на одну-две ступени. Он с радостью будет использовать все циклы ЦП, которые больше никому не нужны, но останется в стороне от вашего интерактивного использования системы. Работа может занять немного больше времени, но она будет выполнена с минимальным вмешательством в ваше интерактивное использование других программ. Если вам не нравится этот компромисс, не делайте этого! Но установите его на высокий приоритет в попытке "заставить его работать быстрее", и он может повесить весь ваш пользовательский интерфейс, пока не закончится.

Никогда не устанавливайте ничего в так называемый приоритетный класс Realtime.

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

Примечание. Любое приложение видеопроигрывателя должно использовать функцию "Планирование классов мультимедиа" в Vista и более поздних версиях. Это автоматически выдаст до 80% процессорного времени, рассчитанного на относительно короткие промежутки времени. Если вы не можете получить воспроизведение без сбоев, значит что-то не так.

Для получения дополнительной информации см. Главы о потоках и планировании в Windows Internals 6th Edition Соломона, Руссиновича и Ионеску.

См. Также мой ответ здесь для получения информации о том, как установлены приоритеты процессов и потоков, а также значение столбца "Приоритет" в диспетчере задач.

5

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

Например, вы кодируете видео и смотрите другое видео одновременно. Скорее всего, приложение кодирования будет использовать 100% вычислительной мощности на всех ядрах вашего процессора. В результате другие приложения могут заикаться.

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

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