Подтвердить что ты не робот

Темы против Async

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

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

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

Async выполняет задачу 1 и не дожидаясь ее завершения ввода-вывода  продолжается с помощью Задачи 2, тогда он ждет ввода ИО обеих задач. Это  завершает задачи в порядке завершения ввода-вывода.

Async лучше всего подходит для задач, связанных с вызовами веб-сервисов, запросов к базе данных  звонки и т.  Темы для интенсивных процессов.

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

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