본문 바로가기

Concurrency

동시성(Concurrency)와 병렬성(Parallelism)

프로그래밍을 하다 보면 동시성 처리에 대한 고민을 해야 되는 경우가 있다.

그런데 동시성이라는 말과 병렬성이라는 비슷하지만 다른 개념이라는 것은 알고 있지만 명확하게 설명을 할 수가 없었다.

그래서 개념을 정리하고자 여러 블로그들을 서치하여 가장 괜찮은 내용을 참조하여 정리를 하려고 한다.

동시성(Concurrency) 병렬성(Parallelism)
동시에 실행되는 것 같이 보이는 것 실제로 동시에 여러 작업이 처리 되는 것
싱글 코어에서 멀티 쓰레드를 동작 시키는 방식 멀티 코어에서 멀티 쓰레드를 동작시키는 방식
한번에 많은 것을 처리 한번에 많은 일을 처리
논리적인 개념 물리적인 개념

시간 관점


동시성(Concurrency)

동시성에서 말하는 동시는 물리적으로 완전히 동일한 한 시점만을 말하는 것이 아니라 사실 상 동시라고 간주할 수 있는 시점(virtually at the same time) 도 포함한다. 물리적으로 미세하게 다른 시점일지라도 애플리케이션 관점에서 동시라고 간주할 수 있는 시간 간격에서 복수의 태스크가 수행된다면 동시성이 있다.

그래서 동시성은 CPU(또는 코어)가 1개인 상황에서도 가능하다. 시분할 시스템을 통해 사실 상 동시라고 간주해도 무방한 시간에 여러 개의 태스크를 진행시키고 있다면 동시성이 있다.

병렬성(Paralleism)

병렬성에서 말하는 동시는 물리적으로 완전히 동일한 시점(physically and literally at the smae time) 이다.
그래서 CPU(또는 코어)가 1개인 상황에서는 병렬성을 가질수 없다.

작업 독립성 관점


독립성은 관점에 따라 다르게 해석될 수 있지만, 그런 상대성을 용인하고 바라보면 다음과 같이 비교할 수 있다.

동시성(Concurrency)

동시성에는 독립적인 복수 개의 Task에 대하여 순서를 고려하지 않고 동시에 실행 한다.
1부터 200까지 더하는 Task와 1에서 300까지 곱하는 Task를 동시(virtually at the same time)에 실행 한다면 이 두개의 Task는 독립적이며, 이런 Task를 동시(virtually at the same time)에 처리한다면 동시성이 있다.

순서를 고려하지 않는다는 것은 순서를 지키지는 경우와 지키지 않는 경우 모두를 포괄 한다.

병렬성(Paralleism)

병렬성에서는 하나의 Task를 여러 부분으로 쪼개서 동시에 실행 한다.

1에서 200까지 더하는 하나의 Task를 1-100, 101-200 이렇게 2개의 구간 합으로 나누고, 이를 2개의 CPU(또는 코어)에서 각각 동시에 실행하면 병렬성이 있다.

그림


이미지 출처: https://www.codeproject.com/Articles/1267757/Concurrency-vs-Parallelism

동시성과 병렬성의 조합


Q1. 동시성이 있으면서 병렬성은 없을 수 있는가.

어떤 관점에서든 CPU(또는 코어)가 1개인 상황에서는 병렬성이 있을 수 없다.

Q2. 동시성은 없으면서 병렬성은 있을 수 있는가.

작업 독립성 관점에서 얘기한 더하기 구간 합은 병렬성은 분명히 있지만, 동시성이 있다고 보는 것은 관점에 따라 다르다.
구간 합 자체를 별개의 Task로 보면 동시성이 있다고 볼 수 있다.
하지만, 구간 합을 별개의 Task가 아니라 전체합이라는 하나의 Task를 나눈 것으로만 본다면 동시성이 없다고 볼 수 있다.

Q3. 동시성과 병렬성 모두 있을 수 있는가.

1에서 200까지 더하는 하나의 Task를 1-100, 101-200 이렇게 2개의 구간합으로 나누고, 이를 1번, 2번 CPU(또는 코어)에서 각각 동시에 실행하고, 동시에 1에서 200까지 곱하는 하나의 Task를 1-100, 101-200 이렇게 2개의 구간곱으로 나누고, 이를 3번, 4번 CPU(또는 코어)에서 각각 동시에 실행 한다고 생각해보자.

더하기와 곱하기라는 독립적인 2개의 Task를 동시에 실행하므로 동시성이 있고, 더하기라는 하나의 Task를 구간합으로 나눠서 동시(physically and literally at the smae time)에 실행하고, 곱하기라는 하나의 Task를 구간곱으로 나눠서 동시(physically and literally at the smae time)에 실행하므로 병렬성도 있다.

정리


동시의 차이

  • 동시성(Concurrency)에서 말하는 동시성은 사실 상 동시라고 간주해도 되는 시간 간격을 의미
  • 병렬성(Parallelism)에서 말하는 동시성은 완전히 동일한 시점을 의미

작업 독립성의 차이

  • Concurrent하게 실행되는 작업은 일반적으로 서로 독립적
  • Parallel하게 실행되는 작업은 일반적으로 원래 하나인 작업을 동시에 실행할 수 있도록 분할한 작업을 의미

Go 언어를 만든 Rob Pike에 의하면,

Concurrency는 독립적인 여러 작업을 한 번에 수행하도록 설계하는 쪽에 무게를 둔 개념
Parallelism은 하나의 작업을 설계된 대로 분할해서 동시에 수행하는 쪽에 무게를 둔 개념

참고