본문 바로가기

개발 이야기/ETC

[기타] 병행(Concurrency)과 병렬(Parallelism)의 차이에 대해서

흔히 병행(Concurrency)과 병렬(Parallel)에 대해서 이야기를 할 때 헷갈리는 경우가 많다. 심지어 단어 자체도 비슷한데 의미도 비슷하니 더 헷갈리는 것 같다. 병행과 병렬은 흔히 하나의 물리적인 공간(컴퓨터, 서버)에서 여러 가지 일을 동시간대에 함께 처리하기 위한 기법을 이야기할 때 사용한다. 일단 하나씩 의미를 정리해보자.

 

병행(Concurrency)

병행이란 소프트웨어적인 의미를 가지고 있다. 모든 소프트웨어 프로그램은 컴퓨터에서 동작하면서 작업을 수행할 때 결국은 CPU 연산 과정을 거치게 되는데, 만약 CPU를 하나의 프로세스가 점유하고 있다면 다른 프로세스들은 작업을 수행할 수 없다. 따라서 이런 물리적인 상황을 극복하기 위해서 소프트웨어적으로 작업을 번갈아가며 수행하게 함으로서 여러 프로세스를 교차 수행한다. 교차 과정이 매우 짧은 시간에 여러번 수행되므로 마치 여러 작업들이 동시에 실행되는 것 처럼 보인다. 이런 병행 과정에서는 소프트웨어가 교차적으로 실행될 때 각 작업의 상태를 관리하는 것, 적절한 타이밍에 적절한 작업으로 교차되는 것 등이 중요한 포인트가 될 것이다.

 

병렬(Parallelism)

병렬은 기계적인 의미를 가지고 있다. 반도체 기술이 진화하면서 우리는 멀티 코어 CPU가 당연한 수준의 시대에 살고있다. 이런 상황에서 병렬(Parallel)이란 멀티 코어 환경에서 여러개의 코어에 작업을 각 코어로 분산시켜서 동시에 작업하는 것을 의미하며 실제 물리적으로 여러 작업이 동시에 실행되는 것이다. 당연히 멀티 코어 환경의 병렬 작업은 작업을 어떻게 분산시키느냐가 매우 중요한 포인트이다.

 

 

https://techdifferences.com/difference-between-concurrency-and-parallelism.html

 

 

병행과 병렬의 개념을 구분하는 것이 중요한 이유는 최근 소프트웨어 프레임워크들은 병렬(Parallelism)을 쉽게 사용할 수 있도록 지원하기 때문인데, 아이러니하게도 병행과 병렬의 개념을 잘 구분하지 않고 무작정 병렬 처리를 쉽게 사용가능하다고 무분별하게 남용하면 서버 리소스를 과도하게 사용할 수 있기 때문이다. 이는 당연히 서버 장애로 이어질 수 있는 가능성을 포함하고 있으니 늘 주의하면서 사용해야 한다.