선반(미정 카테고리)

Concurrency, Parallelism 이해하기

minu94 2021. 7. 18. 13:06

병렬 프로그래밍을 작성하다보면, Concurrency, Parallelism에 대한 내용이 자주 나오게 된다. 항상 헷갈리는 이 두가지 단어의 의미를 프로그래밍 관점에서 정리해보도록 하자!

단어의 정확한 의미를 알고 있는 것은 건물을 지을때 기초를 다지는 것과 비슷하다고 생각한다.
단어의 정확한 의미를 알게 되면, 해당 단어에서 파생된 많은 응용지식들을 이해함에 있어서 도움이 많이 된다.

 

Concurrency

한국어로 "동시성"이라고 해석되며 프로그래밍 관점에선, 보통 하나의 CPU Core가 여러개의 일을 효율적으로 처리하는 것을 의미한다. 물론 여러개의 CPU가 일을 효율적으로 처리하는것또한 포함 된다. Concurrency는 프로그램을 더 유용(more usable)하게 만드는 것을 의미한다.

좀 더 디테일하게 이해해보자.
CPU의 core는 하나의 순간(몇초 혹은 그보다 작은 몇 밀리세컨드)에 하나의 thread밖에 처리하지 못한다. 이때 해당 thread가 실제로 CPU의 자원을 활용하지 않고, CPU보다 몇 배는 느린 다른 자원(I/O..)들을 기다리기 위해 CPU를 점유 할 필요는 없다.
만약, CPU의 연산이 필요하지 않는 경우 다른 thread가 CPU를 쓰게 양보한다면 프로그램이 좀 더 유용해 질 것이다.
간단하게 정리하면, Concurrency는 CPU가 덜 지루하게 만들기 위함이라고 볼 수 있다.

 

Parallelism

한국어로 "병렬화"라고 해석되며 프로그래밍 관점에선, 여러 장치가 동시에 여러 계산을 수행하여 프로그램 수행시간을 더욱 빠르게 만드는 것을 의미한다. Parallelism인지 아닌지를 판별하기 위해선, 여러개의 작업이 반드시 동일한 구조를 갖는 하위작업을 포함할 필요는 없다.

병렬화의 가장 친밀한 예는 자바의 parallelStream이다. parallelStream은 source stream을 임계점까지 split한 후 나눠진 작업들을 각각의 쓰레드에 할당한다. 이러한 과정을 거쳐 1 ~ 100 개의 source가 들어 있는 stream은 N개로 나누어져 하나의 thread가 1 ~ 100개의 source를 처리하는 것보다 더 빠르게 프로그램을 수행 할 수 있다.

 

정리하기

정리하자면, 두개의 용어를 이해하기 위해선 누구의 관점에서 바라봐야 되냐로 볼 수 있을 것 같다.
Concurrency하나의 CPU Core입장에서 덜 지루하게 일을 처리하기 위해 쉬는 동안 다른 일을 처리하는 것으로 볼 수 있다.
Parallelism여러개의 Task입장에서 일을 빨리 끝내기 위해 여러개의 Core에서 처리되어지는 것으로 볼 수 있다.

 

개인적인 사견

어떤 사람은 Concurrency가 time-slicing 기반의 virtual Parallelism이라고도 얘기한다. 예를 들어, Concurrency의 가장 일반적인 구현방법인 OS-MultiTasking은 CPU의 유휴시간(CPU가 thread의 작업을 처리할 수 있는시간)을 slot으로 slicing하여 동작 가능한(I/O waiting이 없는 상태인) thread를 처리하게 한다.
이러한 방법은 Parallelism 정의에서 얘기한 완벽히 동시에 두개의 일이 처리가 되는건 아니지만, slot의 시간이 굉장히 짧고 thread가 동시에 처리 되는 것처럼 switching된다면 넓은 의미에서 Parallel하다고 보여 질 수 있다고 볼 수 있다.(개인적인 의견입니다)