CS 공부를 하다 보면 동시성과 병렬성에 대한 얘기를 심심치 않게 볼 수 있다.
하지만 "동시"와 "병렬"이 비슷한 결을 가지고 있어서인지 두 개념을 혼동하는 경우를 종종 볼 수 있다.
그래서 오늘 포스팅은 비슷하지만 다른 두 개념을 제대로 이해하고자
동시성, 병렬성 각각에 대한 이해와 둘의 차이, 관계에 대해 적어보고자 한다.
✔️ 동시성
(1) 정의
물리학의 상대성이론에서는 "동시성"의 정의에 대해,
물리학에서의 동시성
> 어떤 특정 좌표계에서 어던 두 개의 사건이 같은 시간에 일어나면 그 두 사건이 동시에 일어났다
이렇게 정의하고 있다.
하지만 프로그래밍에서의 동시성은 조금 다른 의미로 사용되며, 싱글/멀티코어 모두에서 구현할 수 있는 개념이다.
프로그래밍에서의 동시성
> 여러 작업들이 동시에 실행되는 것처럼 보이는 것
"동시에 실행되는 것처럼 보이는 것"이기 때문에,
여러 작업들은 위 그림과 같이 T1 -> T2 -> T1 -> T2 -> . . .
이런 식으로 Context Switching을 통해 번갈아 가면서 처리하게 된다.
(2) 문제점
동시성 구현시에는 일반적으로 여러 스레드가 Context switching을 하는 과정에서 여러 문제가 발생하게 된다.
그 중에서 가장 대표적인 두 가지가 있는데, Deadlock과 과도한 오버헤드의 발생이다.
Deadlock
Deadlock이란, 두 개 이상의 스레드가 서로의 자원을 기다리는 상황을 말한다. 순환 참조와 비슷한 느낌으로 생각하면 되는데, 무한히 기다리면서 블로킹 상태에 빠지게 되는 현상이다.
Overhead
Overhead란 어떤 작업을 수행하기 위해서 들어가는 부가적인 리소스를 의미한다.
동시성 구현을 위해 과도한 Context switching이 일어날 경우에, lock을 걸고 해제하는 작업은 과도한 오버헤드를 발생시키게 되어 프로그램의 성능을 저하시킨다.
✔️ 병렬성
(1) 정의
> 여러 작업을 실제로 동시에 처리하는 것
병렬성은 여러 작업을 한 번에(물리적으로 동시에) 처리하는 것을 말한다.
이는 멀티코어 환경에서 멀티 프로세스와 추가적으로 멀티 스레드를 활용해서 구현할 수 있다.
동시성처럼 "동시에 수행되는 것처럼 보이는 것"이 아니라, 실제로 각 코어/스레드에서 여러 작업이 병렬적으로 수행된다.
(2) 무한한 성능 향상?
그럼 코어가 늘어날 수록 그에 비례해서 무한히 성능을 향상시킬 수 있는거 아닌가? 라는 생각을 할 수 있다.
8코어보다 16코어가 2배의 일을, 32코어, 64코어, 128코어. . .
하지만 프로그램에는 동시/병렬/순차 적으로 처리해야 부분들이 각각 있기 때문에, 코어 수에 따른 성능 향상에는 한계가 있으며, 그에 대한 법칙으로 "암달의 법칙"이 있다.
(3) 암달의 법칙
암달의 법칙이란?
암달의 법칙이란, 병렬 처리 시스템의 성능 향상에는 한계가 있다는 법칙이다.
앞서 말했듯 시스템의 모든 부분에서 병렬 프로그래밍을 할 수는 없으므로
실제로 "병렬화시킬 수 있는"부분은 어느 정도인지, 가용 코어는 몇 개인지 등과 같은 지표를 통해
병렬처리를 통한 성능 향상이 얼마나 가능할 지 가늠해볼 수 있다.
E = 1 / { ( 1 - p ) + ( p / N ) }
E: 성능 향상 수치
p: 병렬화 시킬 수 있는 정도(퍼센트)
N: 사용 가능한 프로세서(코어) 수
✔️ 동시성과 병렬성의 차이
지금까지 동시성과 병렬성에 대해 간단히 알아보았다.
하지만 오늘 가장 중요한 주제는 이 둘의 차이점을 명확하게 이해하는 것이다.
간단한 예시를 통해서 동시성과 병렬성의 차이를 생각보다 쉽게 이해할 수 있다.
가장 대표적이며 쉽게 찾아볼 수 있는 예시는 커피머신이다.
- 동시성은 커피머신 한 대 앞에 모든 손님들이 줄을 서서 한명씩 계속 커피를 내리는 것이고,
- 병렬성은 커피머신 두 대 앞에 각각 줄을 서서 동시에 두명이 계속 커피를 내리는 것이다.
그리고 다른 예시를 찾아보다가 다른 어떤 분의 포스팅에서 읽은 예시가 있는데, 난 이게 더 와닿았다.
- 동시성은 티비를 보면서 공부를 하는 것이고,
- 병렬성은 노래를 들으면서 공부를 하는 것이다.
티비를 보면서 공부를 하는 경우에는 티비를 보다가 -> 공부를 하다가 -> 다시 티비를 보다가 -> 다시 공부를 하다가
와 같은 순서로 진행되고,
노래를 들으면서 공부를 하는 경우에는 동시성 예시처럼 번갈아가면서 수행되는게 아니라 두 작업을 동시에 수행한다.
✔️ 동시성과 병렬성의 관계
- 동시에 실행되는 것처럼 보이지만, 실제로는 동시에 실행되지 않는 경우
- 동시에 실행되는 것처럼 보이며, 실제로도 동시에 실행되고 있는 경우
1번은 "동시성"만 가지고, 2번은 "동시성"과 "병렬성" 모두를 가진다고 할 수 있다.
동시에 실행되는 것처럼 보이기만 한다면, 실제 내부 동작여부와는 상관없이 "동시성"을 가진다고 생각하면 된다.
병렬성보다 동시성이 좀 더 넓은 범위의 개념이라고 볼 수 있다.
이렇듯 둘에 대한 비교와 차이점을 주요 포인트로 쓰여진 글이지만 그렇다고 해서 이 둘이 절대 상반된 개념이 아니라는 점을 주의해야 한다.
'CS' 카테고리의 다른 글
[CS] mutableMapOf / linkedMapOf / hashMapOf 차이 (0) | 2023.07.23 |
---|---|
[CS] Java 1.8과 Java 8의 차이 (0) | 2023.07.12 |
GPL과 DSL의 차이 (0) | 2023.06.28 |
Json이 독립적인 데이터 포맷인 이유 (0) | 2023.01.02 |