TL;DR — в чем разница между параллельным и параллельным программированием

Один из моих самых успешных постов на данный момент — подробное объяснение моего любимого вопроса из интервью (подробности см. в разделе Как HashMap работает в Java?). В результате я решил создать серию постов, разбивающих больше вопросов. Все вопросы, на которые будут даны ответы в этой серии статей, были использованы в процессе найма моим нынешним работодателем.

В сегодняшней статье мы сосредоточимся на параллельном и параллельном программировании. Итак, без лишних слов, начнем!

Разница между параллелизмом и параллелизмом

Хотя параллелизм и параллелизм связаны, они определенно не одно и то же. Хотя параллелизм и параллелизм связаны, они определенно не одно и то же. Существует множество определений параллелизма и параллелизма. Мой личный фаворит:

Параллелизм — это (ну…) параллельное выполнение задач, тогда как параллелизм — это иллюзия параллельной работы.

Хотя это неточное определение, оно дает хорошее понимание того, что оно означает. Поясним это на примере. Предположим, что мы хотим слушать музыку на Spotify во время игры на нашем компьютере.

Предположим, что у нас есть 2 процессора на нашей машине. В таком случае мы можем запускать наши песни на одном процессоре, а нашу игру — на другом процессоре. иллюстрация исполнения будет выглядеть примерно так:

Как мы видим, каждый процессор занят выполнением независимой задачи. Теперь предположим, что наша машина имеет только 1 ЦП. В таком сценарии мы не сможем запустить обе задачи одновременно, так как у нас на машине только 1 физический процессор. Решением этой проблемы было бы разбить 2 задачи на небольшие интервалы. Как только мы это сделаем, мы можем переключаться между двумя на нашем процессоре. Если интервалы достаточно малы, с точки зрения пользователя задачи будут казаться параллельными. В этом сценарии наше выполнение будет выглядеть примерно так:

В приведенном выше примере наша система имеет только 1 ЦП. Тем не менее, запуск наших потоков с небольшими интервалами позволяет пользователю чувствовать, что они выполняются одновременно.

Расширенный параллелизм

Давайте теперь предположим, что наш бюджет на наш компьютер невелик. Мы можем позволить себе только машину с 1 процессором и одним потоком. Можно ли будет добиться одновременного выполнения?

Хотя вначале этот вопрос может показаться сложным, на самом деле это возможно. Для решения этой проблемы мы можем использовать шаблон проектирования цикл событий. Решением было бы запустить наш код в ЦП, пока он не дойдет до операции блокировки. Блокирующей операцией может быть вызов диска (например, база данных) или вызов ввода-вывода (например, вызов REST API). Когда это произойдет, событие будет передано в очередь blocked, и будет выполнена следующая задача. По истечении заданного времени ожидания событие будет возвращено в очередь выполнения и обработано снова.

На следующей диаграмме показан общий пример базового цикла обработки событий:

Фактически, некоторые языки, такие как JavaScript и асинхронное выполнение NodeJS, основаны именно на этой модели.

Обратите внимание, что если, например, ваша задача никогда не достигнет блокирующей операции, ваша программа застрянет, и никакое другое выполнение не произойдет. Например, запустив следующий код:

Заключение

Параллелизм и параллелизм — связанные, но разные понятия. Параллелизм — это возможность выполнять множество задач одновременно или в одно и то же время. Параллелизм — это возможность одновременного выполнения множества задач с использованием разных процессоров или ядер. Другими словами, параллелизм — это частный случай параллелизма, когда многие задачи выполняются одновременно. Более того, параллелизм может быть достигнут с помощью 1 ЦП или даже одного потока.

Надеюсь, вам понравилось и вы узнали что-то новое. Если вы хотите быть в курсе моих последних мыслей и идей, вы можете подписаться на мою рассылку новостей. Вы также можете найти меня в LinkedIn или Twitter. Оставайтесь на связи и продолжайте общение!

Первоначально опубликовано на https://yonatankarp.com.