Разница между" сопрограммой "и"нитью"?



каковы различия между" сопрограммой "и"нитью"?

783   5  

5 ответов:

сопрограммы-это форма последовательной обработки: только один выполняется в любой момент времени (так же, как подпрограммы aka процедуры AKA функции-они просто передают эстафету друг другу более плавно).

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

сначала прочитал:параллелизм против параллелизма-в чем разница?

параллелизм-это разделение задач для обеспечения чередования исполнение. Параллельность-это одновременное выполнение нескольких части работы для увеличения скорости. -https://github.com/servo/servo/wiki/Design

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

ответ: в отличие от потоков, которые предварительно запланированы операционной системой, переключатели сопрограммы кооператив, то есть программист (и, возможно, язык программирования и его среда выполнения) контролирует, когда произойдет переключение.

В отличие от потоков, которые являются упреждающие, переключатели сопрограммы являются кооператив (программист контролирует, когда произойдет переключение). Этот ядро не участвует в переключателях сопрограммы. -http://www.boost.org/doc/libs/1_55_0/libs/coroutine/doc/html/coroutine/overview.html

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

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

на однопроцессорной машине потоки timesliced и preempted (переключаются между ними) быстро (в Linux timeslice по умолчанию составляет 100 мс), что делает их параллельными. Однако они не могут выполняться параллельно (одновременно), так как одноядерный процессор может запускать только одну вещь за раз.

сопрограммы и/или генераторы может использоваться для реализации кооперативных функций. Вместо того, чтобы запускаться в потоках ядра и по расписанию в операционной системе они работают в одном потоке, пока не уступят или не закончат, уступая другим функциям, определенным программистом. Языки с генераторы, такие как Python и ECMAScript 6, могут быть использованы для построения сопрограмм. Async / await (см. В C#, Python, ECMAscript 7, Rust) - это абстракция, построенная поверх функций генератора, которые дают фьючерсы/обещания.

в некоторых случаях сопрограммы может ссылаться на стековые функции в то время как генераторы может относиться к функции stackless.

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

например, Java имел "зеленые нити"; это были потоки, которые были запланированы виртуальной машиной Java (JVM) вместо изначально на потоках ядра базовой операционной системы. Они не выполняются параллельно или воспользуйтесь преимуществами нескольких процессоров/ядер, поскольку для этого потребуется собственный поток! Поскольку они не были запланированы ОС, они были больше похожи на сопрограммы, чем на потоки ядра. Зеленые потоки-это то, что Java использовала до тех пор, пока собственные потоки не были введены в Java 1.2.

потоки потребляют ресурсы. В JVM каждый поток имеет свой собственный стек, обычно размером 1 МБ. 64k-это наименьший объем пространства стека, разрешенный для каждого потока в JVM. Размер стека потоков можно настроить в командной строке для JVM. Несмотря на название, потоки не являются свободными из-за их использования ресурсов, таких как каждый поток, нуждающийся в собственном стеке, локальном хранилище потоков (если таковое имеется) и стоимости потока планирование / переключение контекста / аннулирование кэша ЦП. Это одна из причин, почему сопрограммы стали популярными для критически важных приложений с высокой производительностью и высокой параллельностью.

Mac OS позволит процессу выделить только около 2000 потоков, а Linux выделяет 8 МБ стека на поток и позволит только столько потоков, которые поместятся в физическую оперативную память.

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

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

прежде всего, если сопрограммы работают по совместительству (никогда в параллельно), почему кто-то предпочитает их над потоками?

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

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

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

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

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

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

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

одним словом: упреждение. Сопрограммы действуют как жонглеры, которые продолжают передавать друг другу хорошо отрепетированные очки. Потоки (истинные потоки) могут быть прерваны практически в любой момент, а затем возобновлены позже. Конечно, это приносит с собой всевозможные проблемы с конфликтом ресурсов, поэтому печально известная блокировка интерпретатора Gil - Global Python.

многие реализации потоков на самом деле больше похожи на сопрограммы.

Это зависит от языка, который вы используете. Например в Lua Это одно и то же (тип переменной сопрограммы называется thread).

обычно хотя сопрограммы реализуют добровольную отдачу где (вы) программист решаете куда yield, т. е. передайте управление другой подпрограмме.

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

Comments

    Ничего не найдено.