Threads vs. Async - PullRequest
       1

Threads vs. Async

58 голосов
/ 26 октября 2010

Я читал о многопоточной модели программирования в сравнении с асинхронной моделью из этой действительно хорошей статьи.http://krondo.com/blog/?p=1209

Однако в статье упоминаются следующие моменты:

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

Я помню, что читал, что потоки управляются операционной системой путем перемещения TCB между Ready-Queue и Waiting-Queue (среди других очередей).).В этом случае потоки также не тратят время на ожидание?

В свете вышесказанного, в чем преимущества асинхронных программ перед многопоточными?

Ответы [ 6 ]

64 голосов
/ 26 октября 2010
  1. Очень сложно написать код, который является потокобезопасным.С помощью асинхронного кода вы точно знаете, где код будет перемещаться от одной задачи к другой, и поэтому условия гонки намного сложнее.
  2. Потоки потребляют достаточное количество данных, поскольку каждый поток должен иметь свой собственныйстек.В асинхронном коде весь код использует один и тот же стек, а стек остается небольшим из-за непрерывного разматывания стека между задачами.
  3. Потоки являются структурами ОС и, следовательно, занимают больше памяти для поддержки платформы.Нет такой проблемы с асинхронными задачами.
9 голосов
/ 28 февраля 2016

Существует два способа создания тем:

синхронная обработка потоков - родитель создает один (или несколько) дочерних потоков, а затем должен ждать завершения каждого дочернего процесса. Синхронная многопоточность часто упоминается как модель fork-join .

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

ресурс - http://www.amazon.com/Operating-System-Concepts-Abraham-Silberschatz/dp/0470128720

4 голосов
/ 26 октября 2010

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

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

Обратите внимание, что в однопроцессорной системе асинхронные программы, как определено здесь, эквивалентны многопоточным программам.

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

  2. Предположим, у вас есть 2 задачи, которые включают IO (на многопроцессорной машине).В этом случае Async и Threads работают более или менее одинаково (производительность может варьироваться в зависимости от количества ядер, планирования, интенсивности процесса и т. Д.).Кроме того, Async требует меньше ресурсов, меньше накладных расходов и менее сложен для программирования многопоточных программ.

Как это работает?Поток 1 выполняет задачу 1, так как он ожидает ввода-вывода, он перемещается в очередь ожидания ввода-вывода.Точно так же поток 2 выполняет задачу 2, так как он также включает ввод-вывод, он перемещается в очередь ожидания ввода-вывода.Как только его запрос ввода-вывода разрешен, он перемещается в готовую очередь, чтобы планировщик мог запланировать выполнение потока.

Async выполняет задачу 1 и, не дожидаясь завершения ввода-вывода, продолжает выполнение задачи 2, а затем ожидаетдля IO обеих задач завершить.Выполняет задачи в порядке завершения ввода-вывода.

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

В приведенном ниже видео объясняется, что такое Async vs Threaded model, а также когда следует использовать и т. Д., https://www.youtube.com/watch?v=kdzL3r-yJZY

Надеюсь, это полезно.

0 голосов
/ 18 февраля 2014

см. http://en.wikipedia.org/wiki/Thread_(computing)#I.2FO_and_scheduling

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

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

0 голосов
/ 16 апреля 2013

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

...