흔히 병행(Concurrency)과 병렬(Parallel)에 대해서 이야기를 할 때 헷갈리는 경우가 많다. 심지어 단어 자체도 비슷한데 의미도 비슷하니 더 헷갈리는 것 같다. 병행과 병렬은 흔히 하나의 물리적인 공간(컴퓨터, 서버)에서 여러 가지 일을 동시간대에 함께 처리하기 위한 기법을 이야기할 때 사용한다. 일단 하나씩 의미를 정리해보자.
병행(Concurrency)
병행이란 소프트웨어적인 의미를 가지고 있다. 모든 소프트웨어 프로그램은 컴퓨터에서 동작하면서 작업을 수행할 때 결국은 CPU 연산 과정을 거치게 되는데, 만약 CPU를 하나의 프로세스가 점유하고 있다면 다른 프로세스들은 작업을 수행할 수 없다. 따라서 이런 물리적인 상황을 극복하기 위해서 소프트웨어적으로 작업을 번갈아가며 수행하게 함으로서 여러 프로세스를 교차 수행한다. 교차 과정이 매우 짧은 시간에 여러번 수행되므로 마치 여러 작업들이 동시에 실행되는 것 처럼 보인다. 이런 병행 과정에서는 소프트웨어가 교차적으로 실행될 때 각 작업의 상태를 관리하는 것, 적절한 타이밍에 적절한 작업으로 교차되는 것 등이 중요한 포인트가 될 것이다.
병렬(Parallelism)
병렬은 기계적인 의미를 가지고 있다. 반도체 기술이 진화하면서 우리는 멀티 코어 CPU가 당연한 수준의 시대에 살고있다. 이런 상황에서 병렬(Parallel)이란 멀티 코어 환경에서 여러개의 코어에 작업을 각 코어로 분산시켜서 동시에 작업하는 것을 의미하며 실제 물리적으로 여러 작업이 동시에 실행되는 것이다. 당연히 멀티 코어 환경의 병렬 작업은 작업을 어떻게 분산시키느냐가 매우 중요한 포인트이다.
병행과 병렬의 개념을 구분하는 것이 중요한 이유는 최근 소프트웨어 프레임워크들은 병렬(Parallelism)을 쉽게 사용할 수 있도록 지원하기 때문인데, 아이러니하게도 병행과 병렬의 개념을 잘 구분하지 않고 무작정 병렬 처리를 쉽게 사용가능하다고 무분별하게 남용하면 서버 리소스를 과도하게 사용할 수 있기 때문이다. 이는 당연히 서버 장애로 이어질 수 있는 가능성을 포함하고 있으니 늘 주의하면서 사용해야 한다.
'개발 이야기 > ETC' 카테고리의 다른 글
성능 테스트, 부하 테스트, 스트레스 테스트란? (0) | 2021.08.19 |
---|---|
Gradle Wrapper란? (0) | 2021.03.23 |
임의(Arbitrary)값과 무작위(Random)값은 어떻게 다를까? (0) | 2021.03.18 |
[기타] Retry 전략에 대해서(Exponential Backoff, Jitter) (5) | 2021.02.23 |
[기타] 개발 환경(Phase)이란 무엇일까? (0) | 2021.02.22 |