처음에 접하면 항상 헷갈리기 쉬운 동시성(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 라는 개념을 어떻게 다르게 다루는지 확인해볼 필요가 있겠다.
위 그림에서 화살표는 각 task 가 수행되는 동안의 타임라인을 나타낸 것이며 (쓰레드가 아니다!) 각 영역은 task 가 수행되는 시간을 의미한다.
위 그림은 각 task 가 concurrently 하게 진행된다고 얘기할 수 있다. 하지만 simultaneously 하게 진행된다고 확신할 수 없다. 아직까지는 무슨 맥락인지 이해가 어렵다. 좀 더 low level 에서 살펴보자.
위 케이스는 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개의 쓰레드를 사용했을 때보다 코스트가 낮다.