Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Чем отличается конкурентное , параллельное, многопоточное и асинхронное программирование? кратко

Лекция



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

Есть несколько разных понятий, связанных с областью параллельных вычислений.

  • Конкурентное исполнение (concurrency)
  • Параллельное исполнение (parallel execution)
  • Многопоточное исполнение (multithreading)
  • Асинхронное исполнение (asynchrony)

Каждый из этих терминов строго определен и имеет четкое значение.

Конкурентность (concurrency)

Конкурентность (*) (concurrency) - это наиболее общий термин, который говорит, что одновременно выполняется более одной задачи. Например, вы можете одновременно смотреть телевизор и комментить фоточки в фейсбуке. Винда, даже 95-я могла (**) одновременно играть музыку и показывать фотки.

(*) К сожалению, вменяемого русскоязычного термина я не знаю. Википедия говорит, что concurrent computing - это параллельные вычисления, но как тогда будет parallel computing по русски?

(**) Да, вспоминается анекдот про Билла Гейтса и многозадачность винды, но, теоретическивинда могла делать несколько дел одновременно. Хотя и не любых.

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

Конкурентное исполнение говорит о том, что за определенный промежуток времени будет решена более, чем одна задача. Точка.

Параллельное исполнение

Параллельное исполнение (parallel computing) подразумевает наличие более одного вычислительного устройства (например, процессора), которые будут одновременно выполнять несколько задач.

Параллельное исполнение - это строгое подмножество конкурентного исполнения. Это значит, что на компьютере с одним процессором параллельное программирование - невозможно;)

Параллельное программирование подразумевает разбиение одной задачи на независимые подзадачи, которые можно рассчитать параллельно, а затем объединить результаты. Один из примеров -- это map-reduce. Это частный случай многопоточного программирования.

Многопоточность

Многопоточность - это один из способов реализации конкурентного исполнения путем выделения абстракции "рабочего потока" (worker thread).

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

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

Асинхронное исполнение

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

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

Асинхронное программирование подразумевает инициацию некоторой операцию, об окончании которой главный поток узнает спустя некоторое время. Обычно это применяется для работы с системой ввода-вывода: диски, сеть и т.д. При этом, если это все сделано правильно, никакого потока нет. Также часто под выражением "выполнить асинхронно" подразумевают, что выполнение некоторого кода будет произведено не в текущем потоке, а в соседнем, при этом текущий поток не будет заблокирован. Но мой взгляд, это не совсем корректно.

CPU-bound и IO-Bound операции

Еще один важный момент, с точки зрения разработчика - разница между CPU-bound и IO-bound операциями. CPU-Bound операции нагружают вычислительные мощности текущего устройства, а IO-Bound позволяют выполнить задачу вне текущей железки.

Разница важна тем, что число одновременных операций зависит от того, к какой категории они относятся. Вполне нормально запустить параллельно сотни IO-Bound операций, и надеяться, что хватит ресурсов обработать все результаты. Запускать же параллельно слишком большое число CPU-bound операций (больше, чем число вычислительных устройств) бессмысленно.

различие простыми словами

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

Вы пригласили друга Карена и копаете вместе,

периодически задевая друг-друга лопатами.

Пока вы копаете бассейн, Карен

копает канаву под водопровод.

Никто никому не мешает.

Вы пригласили бригаду землекопов,

а сами с Кареном пошли пить пиво.

Когда бригада все сделает,

к вам придут за деньгами.

работа нескольких потоков.

При этом не факт, что все потоки будут активны.

Возможно, что работает один поток, а другой спит.

Когда первый поток закончил работу,

он может разбудить второй, а сам заснуть

разбиение одной задачи на независимые

подзадачи и выполнение этих подзадач

одновременно разными потоками.

Пример: вычисление среднего значения

двумерного массива. Каждый поток

может посчитать сумму своей строки,

а потом все это объединить

когда мы ставим какую-то задачу, но не ждем ответа,

а продолжаем делать свою работу.

А когда будет готов ответ - нас уведомят.

Пример: попросить секретаря сварить кофе.

Мы не ждем этого кофе и занимаемся своими делами,

а когда кофе будет готов - нам его принесут.


Возвращаясь к исходному вопросу: нет смысла выполнять в 1000 потоков метод Calc, если он является CPU-Intensive (нагружает центральный процессор), поскольку это приведет к падению общей эффективности вычислений. ОС-ке придется переключать несколько доступных ядер для обслуживания сотен потоков. А этот процесс не является дешевым.

Самым простым и эффективным способом решения CPU-Intensive задачи, заключается в использовании идиомы Fork-Join: задачу (например, входные данные) нужно разбить на определенное число подзадач, которые можно выполнить параллельно. Каждая подзадача должна быть независимой и не обращаться к разделяемым переменным/памяти. Затем, нужно собрать промежуточные результаты и объединить их.

Именно на этом принципе основан PLINQ. О чем можно почитать тут: Джозеф Албахари. Параллельное программирование.

Выглядит это очень интересно:

IEnumerable yourData = GetYourData();
var result = yourData.AsParallel() // начинаем обрабатывать параллельно
  .Select(d => ComputeMD5(d)) // Вычисляем параллельно
  .Where(md5 => IsValid(md5))
  .ToArray(); // Возврвщаемся к синхронной модели

В этом случае, число потоков будет контролироваться библиотечным кодом в недрах CLR/TPL и метод ComputeMD5 будет вызван параллельно N-раз на компьютере с N-процессорами (ядрами).

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

Из статьи мы узнали кратко, но содержательно про конкурентное программирование
создано: 2019-01-25
обновлено: 2024-11-14
3



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей

Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Высоконагруженные проекты.Паралельные вычисления. Суперкомпьютеры. Распределенные системы

Термины: Высоконагруженные проекты.Паралельные вычисления. Суперкомпьютеры. Распределенные системы