Зачем мне использовать несколько потоков для одной задачи обработки, если я могу увеличить приоритет программы? - PullRequest
5 голосов
/ 18 января 2012

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

Однако я использую систему с одним ядром.Итак, мой вопрос: почему бы не до начала моего приложения, чтобы оно получало больше процессорного времени от ОС?Я пишу приложение на основе сервера, и оно будет единственной большой вещью, работающей там.

Какие бы были плюсы и минусы в установке prio? :)

Ответы [ 5 ]

2 голосов
/ 18 января 2012

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

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

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

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

Все потоки имеют приоритеты, которые являются фактором как приоритета их процесса, так и их приоритета в этом процессе.Поток с низким приоритетом в процессе с высоким приоритетом превосходит поток с высоким приоритетом в процессе с низким приоритетом.

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

Большинство извремя, большинство потоков в любом случае мало что делает, что видно из того факта, что большая часть времени использования ЦП в большинстве систем ниже отметки 100% (гиперпоточность искажает это, внутреннее планирование в ядрах означает, что гиперпоточная система можетбыть полностью насыщенным и, кажется, работает только на 70%).Как бы то ни было, обычно все делается, и поток, у которого неожиданно много работы, будет делать это с обычным приоритетом, почти в то же время, что и при более высоком.

Однако, хотя выгода для этого занятого потока вышеприоритет, как правило, мало или ничего, декремент велик.Поскольку это единственный поток, который получает любое время процессора, все остальные потоки застряли.Все остальные процессы поэтому зависают на некоторое время.В конце концов, планировщик замечает, что все они ждали около 3 секунд, и исправляет это, повышая их до наивысшего приоритета и предоставляя им большие срезы, чем обычно.Теперь у нас есть всплеск активности, так как потоки, у которых нет времени, внезапно становятся потоками с наивысшим приоритетом, которым требуется процессорное время.В каждом потоке есть поток, кроме высокоприоритетного, и система перестает блокироваться, хотя, вероятно, все еще много приложений, показывающих «Не отвечает» в заголовках.Это далеко от идеала, но это эффективный способ справиться с потоком с более высоким, чем обычно, приоритетом, который так долго захватывает ядро.

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

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

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

1 голос
/ 18 января 2012

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

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

Однако, если операция обработки данных идет медленно из-за некоторых ограничений, не связанных с процессором (например, если он связан с вводом-выводом или полагается на другой процесс), то:

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

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

1 голос
/ 18 января 2012

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

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

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

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

0 голосов
/ 18 января 2012

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

0 голосов
/ 18 января 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...