2010-10-26 5 views
41

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

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

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

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

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

+0

Я думаю, вы имеете в виду синхронный и асинхронный. – someguy

+4

Нет, я имел в виду Threaded vs. Async. Я упомянул первый пункт только потому, что это я понял из статьи. – 2010-10-26 13:41:51

ответ

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

Чтобы разработать немного: 1. Часть ввода-вывода потокового кода относительно проста, но управление общим состоянием между потоками (с использованием блокировок/очередей/и т. Д.) Без условий гонки - вот что делает его сложным. Использование асинхронной модели означает, что вы в то же время меньше работаете, поэтому легко избегать гонок. 2/3. каждый поток будет потреблять по крайней мере одну страницу памяти стека (обычно 4 КБ или 8 КБ), а также некоторую неизвестную сумму памяти для других структур данных, связанных с состоянием этого потока. –

4

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

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

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

-1

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

+3

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

0

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

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

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

6

Есть два способа создания темы:

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

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

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

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

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

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

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

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

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

Надеется, что это полезно.

+0

https://www.youtube.com/watch?v=kdzL3r-yJZY – Lakshmipathi

+0

Ссылка на потенциальное решение всегда приветствуется, но, пожалуйста, [добавить контекст вокруг ссылки] (// meta.stackoverflow.com/a/8259), поэтому ваши друзья-пользователи будут иметь представление о том, что это такое и почему оно есть. ** Всегда указывайте наиболее релевантную часть важной ссылки, если целевой сайт недоступен или постоянно находится в автономном режиме. ** Принимайте во внимание, что быть более чем ссылкой на внешний сайт_ является возможной причиной [Почему и почему как удаляются некоторые ответы?] (// stackoverflow.com/help/deleted-answers). – Machavity

+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Из обзора] (/ review/low-quality-posts/17067843) – gobrewers14

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