All Articles

동시성(Concurrency) 과 병렬성 (Parallelism) 올바른 개념 잡기

처음에 접하면 항상 헷갈리기 쉬운 동시성(Concurrency) 과 병렬성(Parallelism) 에 대해 정리해보고자 한다.

시간으로 풀어보기

동시성과 병렬성은 각 작업이 진행되는 시간의 관점에서 살펴봐야 올바르게 이해할 수 있다고 생각되었다.

우선 위키에서 정의하는 각 개념을 살펴보자.

Concurrent computing is a form of computing in which several computations are executed concurrently.

Parallel computing is a type of computation where many calculations or the execution of processes are carried out simultaneously.

풀이해보면 다음과 같다.

  • Concurrent computing 은 여러 계산이 동시에 실행되는 컴퓨팅의 한 형태이다.
  • Parallel computing 은 많은 계산 또는 프로세스 실행이 동시에 수행되는 계산 유형이다.

이러한 내용 때문에 처음에 둘을 구분하는 어려움이 생긴다. 각 개념을 한글로 풀이하면 같은 의미가 되기 때문이다. (사전에서도 동의어로 취급하고 있다.) 즉, Computer Science 내에서 concurrently / simultaneously 라는 개념을 어떻게 다르게 다루는지 확인해볼 필요가 있겠다.


그림으로 살펴보며 맥락을 이해해보자. example1

위 그림에서 화살표는 각 task 가 수행되는 동안의 타임라인을 나타낸 것이며 (쓰레드가 아니다!) 각 영역은 task 가 수행되는 시간을 의미한다.

위 그림은 각 task 가 concurrently 하게 진행된다고 얘기할 수 있다. 하지만 simultaneously 하게 진행된다고 확신할 수 없다. 아직까지는 무슨 맥락인지 이해가 어렵다. 좀 더 low level 에서 살펴보자.

example2

위 케이스는 low level 에서 Task A, B 가 수행될 수 있는 일부 경우의 수를 나열한 것이다. 각 케이스에 대한 상태는 다음과 같다.

  • Case 1 은 concurrently 하게 진행되며, simultaneously 하게 진행되지는 않는다.
  • Case 2 는 concurrently 하고 simultaneously 하게 진행된다.

CS 내에서 각 단어에 대한 의미는 다음과 같다.

  • concurrently : 2개 이상의 ask (= 코드, 알고리즘 등) 를 수행할 때, 각 task 는 다른 task 의 수행시점에 상관없이 수행이 가능하다는 의미이다. (sequencial 의 반의어이다.) 즉, N 개의 task 의 실행 시간이 타임라인 상에서 겹칠 수 있다.
  • simultaneously : 우리가 일반적으로 사용하는 ’동시에’ 라는 단어의 맥락과 일치한다.

단어에 대한 의미를 알았으니 각 케이스를 다시 살펴보자.

  • Case 1 은 먼저 시작된 task 가 끝나지 않아도 또 다른 task 를 시작할 수 있다. 즉, 동시성을 만족한다. 하지만 적절하게 시간을 나눠 자원을 interiving 하고 있으므로 물리적으로 정확히 같은 시간대에 동시에 수행되는 것은 아니다. 따라서 병렬성은 만족하지 않는다.
  • Case 2 는 먼저 시작된 task 가 끝나지 않아도 또 다른 task 를 시작할 수 있다. 즉, 동시성을 만족한다. 또한 같은 시간대에 각 task 가 동시에 수행되므로 병렬성을 만족한다.

위 케이스들을 통해 알 수 있는 것은 동시성은 병렬성이기 위한 필요조건이지만 충분조건은 아니다. 즉,

  • 병렬성을 만족하면, 동시성도 만족하게 된다.
  • 하지만 동시성을 만족한다고 병렬성을 만족하는 것은 아니다.

정리

먼길을 돌아왔다. 동시성과 병렬성을 정리해보자.

동시성

동시성은 2개 이상의 task 가 있을 때 서로 다른 task 의 실행 시점에 상관없이 task 실행이 가능하다는 의미를 가진다.

병렬성

병렬성은 2개 이상의 task 가 있을 때 각 task 가 물리적인 시간으로 동시에 실행이 가능하다는 의미를 가진다.

추가적으로 리서치 했을 당시 개인적으로 혼동을 주었던 설명들을 모아 위 개념으로 풀어봤다.

동시성이란

  • 싱글 코어에서 멀티 스레드를 동작시키기 위한 방식으로, 멀티 태스킹을 위해 여러 개의 스레드가 번갈아가면서 실행되는 성질을 말한다.

    → 멀티 스레드로 동시성을 만족시킬 수 있는 것이지 동시성과 멀티 스레드는 연관이 없다. 반례로 코틀린은 싱글스레드에서 코루틴을 이용하여 동시성을 만족할 수 있다.

  • 동시에 실행되는 것처럼 보이는 것

    → 싱글 코어에서 멀티 스레드를 이용해 동시성을 구현하는 일부 케이스에 대한 내용이다. 멀티 코어에서 멀티 스레드를 이용하여 동시성을 만족할 경우에는 실제 물리적 시간으로 동시에 실행된다.

병렬성이란

  • 멀티 코어에서 멀티 스레드를 동작시키는 방식으로, 한 개 이상의 스레드를 포함하는 각 코어들이 동시에 실행되는 성질을 말한다.

    → 부분적으로만 맞는 내용이다. 병렬성의 핵심은 물리적인 시간에 동시에 수행되는 것이지 멀티 코어에 포커스가 맞춰져서는 안된다. 그 예로 네트워크 상의 여러 컴퓨터에게 분산작업을 요청하는 분산 컴퓨팅이 있다.


예제 케이스

마지막으로 개념을 완전히 이해하는데 도울 수 있도록 몇가지 예제 케이스를 정의한다.

각 task 가 수행되는 시간을 1이라고 가정한다.

  • 싱글 코어, 1개의 쓰레드에서 순차적으로 2개의 task 진행 - 동시성과 병렬성 모두 만족하지 못함. seqeuncial 한 작업. 총 수행시간은 2
  • 싱글 코어, 1개의 쓰레드에서 2개의 task 가 자원을 interleaving 하며 진행 - 동시성을 만족하지만 병렬성을 만족하지 못함. 총 수행 시간은 2 + @ (있을수도 없을 수도 있다. interleaving 코스트)
  • 싱글 코어, 2개의 쓰레드에서 2개의 task 가 자원을 interleaving 하며 진행 - 동시성을 만족하지만 병렬성은 만족하지 못함. 총 수행 시간은 2보다 작다.
  • 멀티 코어, 2개의 쓰레드에서 2개의 task 가 동시에 진행 - 동시성, 병렬성을 모두 만족함. 총 수행 시간은 2보다 작다.
  • (보너스) 코틀린 내에서 싱글 코어, 1개의 쓰레드내에서 2개의 코루틴을 통해 2개의 task 가 진행 - 동시성은 만족하지만 병렬성은 만족하지 못함. 총 수행 시간은 2보다 작으며, 2개의 쓰레드를 사용했을 때보다 코스트가 낮다.