2014-01-29 1 views
3

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

Я хотел бы знать, в чем преимущества многопоточной программы в одноядерном процессоре ??

+0

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

+0

Другие ответы здесь: [В чем преимущество использования потоковой передачи в программе?] (Http://stackoverflow.com/q/19652554/395718) – Dialecticus

+0

Посмотрите на принятый ответ и (второй) последний комментарий о том, как скорость многопоточности (когда потоки не могут запускаться одновременно)? –

ответ

0

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

2

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

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

Даже если доступно только одно ядро, планировщик потоков ОС даст вам иллюзию параллелизма.

+1

Ваш пример Skype не совсем корректен. Вы можете обрабатывать все то, что вы упомянули поочередно. Просто гораздо проще иметь потоки, делающие отдельные вещи по отдельности. – arne

+0

@arne Я предполагаю, что это можно сделать серийно, но не эффективно. Вам придется прекратить прослушивание сокета, начать обработку графических интерфейсов и продолжать движение туда и обратно. – dcastro

+1

Ну, вы можете проверить сокет для данных через 'select', то же самое с интерфейсом GUI. Но это было бы очень болезненно. Не менее ли он менее эффективен. – arne

1

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

1

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

2

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

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

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

1

Как уже упоминалось, не блокирование - это одно приложение. Другим является разделение логики на несвязанные задачи, которые должны выполняться одновременно. Использование потоков для этого оставляет задачу планирования этих задач в ОС.

Однако обратите внимание, что также возможно реализовать аналогичное поведение с использованием асинхронных операций в одном потоке. «Будущее» и boost :: asio предоставляют способы делать неблокирующие вещи без необходимости прибегать к нескольким потокам.

0

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

В этом случае вам не обязательно нужно несколько потоков, которые могут фактически выполняться параллельно. Кооперативные многозадачные концепции, такие как asynchroneous IO, coroutines, или fibers приходят в виду.

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

1

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

  • Нить может обернуть блокировку/длительный вызов, который вы не можете обойти иначе. Для некоторых операций существуют механизмы опроса, но не для всех.
  • Нить может обернуть почти автономную часть вашего приложения, которая практически не взаимодействует с другим кодом. Например, фоновый опрос для обновлений, мониторинг некоторых ресурсов (например, свободное хранилище), проверка подключения к Интернету. Если вы держите их в отдельном потоке, вы можете сохранить код относительно простым в своей собственной «среде исполнения», не заботясь слишком сильно о влиянии на основную программу, единственное общение с основной логикой - это обычно одно «событие».
  • В некоторых средах вы можете получить больше времени обработки. Это зависит главным образом от того, как работает система планирования ОС, но если это выделяет время на поток, тем больше потоков у вас будет больше, чем ваше приложение будет запланировано.

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

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

То есть, я думаю, что бывают ситуации, когда это очень плохо советуют:

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

Насколько я могу видеть, один ответ был не дано:

Вы будет придется писать многопоточные приложения в будущем!

Среднее количество ядер удваивается каждые 18 месяцев в будущем. Люди узнали однопоточное программирование уже 50 лет, и теперь им противостоят устройства с несколькими ядрами. Стиль программирования в многопоточной среде существенно отличается от однопоточного программирования. Это относится к аспектам низкого уровня, таким как избегание условий гонки и правильной синхронизации, а также высокоуровневые аспекты, такие как общий алгоритм.

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

 Смежные вопросы

  • Нет связанных вопросов^_^