Темы против Async
Я читал на проточной модели программирования по сравнению с асинхронной моделью из этой действительно хорошей статьи. http://krondo.com/blog/?p=1209
Однако в статье упоминаются следующие моменты.
- Асинхронная программа просто превзойдет программу синхронизации, переключаясь между задачами всякий раз, когда есть ввод-вывод.
- Управление потоками осуществляется операционной системой.
Я помню, как читал, что потоки управляются операционной системой, перемещая TCB между Ready-Queue и Waiting-Queue (среди других очередей). В этом случае потоки не тратят время на ожидание или не делают?
В свете вышесказанного, каковы преимущества асинхронных программ над потоковыми программами?
Ответы
Ответ 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
Надеюсь, что это будет полезно.