Введение

Способность выполнять задачу не последовательно.

В информатике, конкурентность (concurrency) – это способность различных частей или единиц программы, алгоритма или задачи выполняться в произвольном или частичном порядке, не влияя на конечный результат. Это позволяет выполнять конкурирующие (concurrent) единицы параллельно, что может значительно повысить общую скорость выполнения в многопроцессорных и многоядерных системах. В более строгих терминах, конкурентность относится к возможности разложения программы, алгоритма или задачи на компоненты или единицы вычислений, не зависящие от порядка или частично упорядоченные. По словам Роба Пайка, конкурентность – это композиция независимо выполняющихся вычислений, и конкурентность – это не параллелизм: конкурентность – это умение справляться со многими вещами одновременно, а параллелизм – это делать многие вещи одновременно. Конкурентность касается структуры, а параллелизм – исполнения; конкурентность предоставляет способ структурировать решение для задачи, которая может (но не обязательно) быть распараллелена. Для описания общей конкурентной обработки разработаны различные математические модели, включая сети Петри, исчисления процессов, модель параллельной машины с произвольным доступом к памяти, акторную модель и язык координации Reo.

Проблемы

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

Теория

Теория параллелизма активно развивалась как область исследований в теоретической информатике. Одной из первых работ стала основополагающая работа Карла Адама Петри по сетям Петри в начале 1960-х годов. С тех пор было разработано множество формализмов для моделирования и анализа параллелизма.

Логика

Различные типы временной логики могут быть использованы для анализа поведения параллельных систем. Некоторые из этих логик, такие как линейная временная логика и логика дерева вычислений, позволяют формулировать утверждения о последовательностях состояний, которые может пройти параллельная система. Другие, такие как логика дерева действий, логика Хеннесси-Милнера и временная логика действий Лампорта, строят свои утверждения на основе последовательностей действий (изменений состояния). Основное применение этих логик – написание спецификаций для параллельных систем.

Практика

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