동시성 병렬성 스레드 - dongsiseong byeonglyeolseong seuledeu

서점에 가면 다양한 언어별로 동시성을 다루는 책들을 많이 볼 수 있습니다. 프로그래밍을 하다 보면 이러한 동시성 처리가 필요한 경우가 있습니다. 그런데 동시성이라는 말을 종종 병렬성과 혼동되어 사용하는 경우가 있습니다. 그래서 이번에 한번 정리를 해볼까 합니다.

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

먼저 동시성과 병렬성의 차이를 표로 살펴보았습니다. 그러나 표로만 봐서는 조금 잘 안 와닿는 면이 있어서 몇가지 그림을 통해 좀 더 살펴 보겠습니다.

동시성 병렬성 스레드 - dongsiseong byeonglyeolseong seuledeu

처음으로 보이는 이 그림은 직관적으로 잘 설명이 되어 있습니다. 동시적으로 실행되는 것과 병렬로 실행되는 것과 함께 추가적으로 2개의 작업이 순차적으로 실행되는 모습도 나와있습니다.

두번째 그림은 싱글 코어와 멀티 코어에서 동작하는 모습을 비교하는 그림입니다.

싱글 코어에서는 2개의 작업을 동시에 실행되는 것 처럼 보이기 위해 번갈아 가면서 작업을 수행합니다. 이때 다른 작업으로 바꾸어 실행할 때 내부적으로 Context switch가 일어납니다. 이 부분은 링크에 들어가보시면 더 자세한 내용을 살펴보실 수 있습니다.

마지막 그림은 실생활과 관련된 그림을 살펴보겠습니다.

이 그림을 보면 하나의 커피머신이 있는데 커피를 받기 위한 사람들의 줄이 2줄로 되어 있습니다. 그래서 서로 번갈아가면서 커피를 타게 되는 것이죠. 이러한 것을 동시성 처리라고 정의하고 있습니다. 반면에 병렬 처리의 경우는 2개의 커피 머신이 있고 각 커피 머신마다 하나의 줄을 가지고 있어서 각각의 줄마다 커피를 받을 수 있는 것을 병렬 처리라고 할 수 있습니다. 

그림을 예로 들면서 보니 잘 이해가 됩니다. 이렇게 3가지 그림을 통해 동시성과 병렬성에 대해서 알아보았습니다.

References

  • parallelism concurrency
  • Concurrency vs Parallelism
  • concurrent and parallel programming

멀티스레드의 동시성(Concurrency)과 병렬성(Parallelism)

멀티스레드는 동시성 방식이나 병렬성 방식으로 수행된다.


동시성(Concurrency)

싱글 코어에서 멀티스레드를 동작시키기 위한 방식으로, 멀티 태스킹을 위해 여러 개의 스레드가 '번갈아가면서' 실행되는 성질을 말한다. 그래서 이는 정말 물리적으로 동시에 동작하는 것은 아니다. 

💡 멀티 코어에서 멀티 스레드를 이용하여 이 동시성을 만족할 경우에는 실제 물리적 시간으로 동시에 실행된다.

참고로 멀티 스레드로 이 동시성 이라는 특성을 만족시킬 수 있는 것이지 동시성과 멀티 스레드는 사실 항상 함께할 순 없는 개념이다. 그 반례로 싱글 스레드에서 코루틴(Coroutine)을 이용하여 동시성을 만족할 수 있다.

💡코루틴(Coroutine)

싱글 스레드에서도 루틴(routine) 이라는 단위(맥락상 함수와 동일)로 루틴간 협력이 가능하며, 동시성 프로그래밍을 지원하고 비동기 처리를 쉽게 도와주는 개념을 말한다. 자세한 설명은 다른분이 설명해주신 이 글을 참고 바란다.


병렬성(Parallelism)

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

💡 동시성(Concurrency)의 '동시'와 병렬성의 설명에 있는 '동시' 때문에 헷갈릴 수 있으니 주의하기 바란다.

각 용어의 정확한 의미를 분석한 좋은 글이 있으니 참고 바란다.

보통 동시성에 비해서 병렬성은 각 코어들이 동시에 실행되므로 CPU의 유휴 시간(idle time)이 줄어들어 성능이 좋다. 그러나 CPU 수보다 처리해야 할 프로세스나 스레드 수가 많다면 CPU를 사용하기 전까지 대기가 발생한다.


💡 그래서 유휴 시간을 줄이고 성능이 좋아지는 스레드 적정 개수를 아는 것이 중요한데, 이는 별도로 포스팅 한 후 여기 링크를 달아두겠다.


동시성 병렬성 스레드 - dongsiseong byeonglyeolseong seuledeu
https://seamless.tistory.com/42

싱글 코어에서는 위에서 설명했듯 여러 작업을 동시에 실행되는 것처럼 보이기 위해 번갈아 가면서 작업을 수행하는데,

이때 다른 작업으로 바꿔서 실행할 때 내부적으로 콘텍스트 스위칭(Context Switching)이라는 게 일어난다.

💡 콘텍스트 스위칭(Context Switching)에 대해서는 별도로 포스팅해뒀으니 참고 바란다.


출처

동시성과 병렬성의 용어에 대한 정확한 이해와 분석 - '시간'을 기반으로

vagabond95.me/posts/concurrency_vs_parallelism/

멀티스레드의 동시성과 병렬성

https://seamless.tistory.com/42

처음에 접하면 항상 헷갈리기 쉬운 동시성(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 라는 개념을 어떻게 다르게 다루는지 확인해볼 필요가 있겠다.


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

동시성 병렬성 스레드 - dongsiseong byeonglyeolseong seuledeu

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

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

동시성 병렬성 스레드 - dongsiseong byeonglyeolseong seuledeu

위 케이스는 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개의 쓰레드를 사용했을 때보다 코스트가 낮다.