기술 면접 단골 질문 ‘동시성과 병렬성’ 간편 정리
동시성(Concurrency)과 병렬성(Parallelism)은 대규모 트래픽과 방대한 데이터를 다루는 환경에서는 꼭 알아두어야 하는 핵심 개념입니다. 웹 서비스부터 머신러닝, 빅데이터 분석까지, 많은 기업들이 이 두 가지 기법을 적절히 조합하여 높은 성능과 확장성을 얻고 있습니다. 이 때문에 기술 면접에서도 동시성과 병렬성의 개념적 차이, 그리고 실제 사례나 적용 방식에 관해 묻는 질문이 자주 나오는데요. 이번 글을 통해 미리 개념을 이해해 두시면 도움이 될 거라 생각합니다.

동시성(Concurrency) 개념 정리
동시성이란, 실제로는 하나의 CPU Core만 사용하더라도 매우 빠른 작업 전환(Context Switching)을 통해 여러 작업이 겹쳐 실행되는 것처럼 보이도록 만드는 소프트웨어적 기법입니다. CPU는 한 시점에 한 가지 작업만 처리할 수 있지만, 전환 속도가 워낙 빠르다 보니 여러 프로세스나 스레드가 동시에 동작하는 것처럼 느낄 수 있습니다.
이 방식은 I/O 작업이 빈번히 일어나는 환경에서 특히 효과적입니다. 파일 시스템, 네트워크, 사용자 입력 같은 대기 시간이 긴 작업이 진행되는 동안 CPU가 다른 일을 할 수 있으므로 전체 시스템 응답 속도가 빨라집니다.
Threading
운영체제가 제공하는 스레드(Thread)를 이용하면, 한 프로세스 안에 여러 실행 흐름을 만들 수 있습니다. 스레드는 독립적인 흐름을 갖지만, 사실상 하나의 CPU에서 번갈아 실행되기 때문에 마치 동시 처리되는 듯한 효과가 납니다. 예를 들어, 게임을 개발할 때 그래픽 렌더링 흐름과 사용자 입력 흐름을 분리하면, 좀 더 자연스럽고 효율적인 처리가 가능합니다.
다만 스레드가 많아지면 서로가 같은 자원을 이용할 때 충돌이 일어날 수 있습니다. 예를 들어, 각 스레드가 같은 데이터를 동시에 수정하면 결과가 뒤엉킬 수 있으며, 이를 해결하기 위해서는 데이터 접근 순서를 잘 정하거나 간단한 동기화 기법을 적용해야 합니다.
너무 깊은 수준으로 들어가면 Lock, Mutex, Deadlock 같은 개념이 이어지지만, 큰 흐름에서 보면 “하나의 자원을 동시에 접근하면 문제가 생길 수 있고, 이걸 막으려면 조율이 필요하다” 정도로 이해해도 충분합니다.
Async I/O
비동기 I/O는 네트워크나 디스크 접근처럼 시간이 오래 걸리는 작업을 미리 요청해 둔 뒤, 그 대기 시간에 CPU가 다른 일을 처리하도록 하는 방식입니다. Node.js, Python의 asyncio, JavaScript의 async/await 등이 대표적인 예시이며, 한꺼번에 많은 요청이 들어오는 서버 환경에서 탁월한 성능을 발휘합니다. 싱글 스레드더라도 비동기 I/O를 통해 동시성을 높일 수 있기 때문에, 규모가 큰 시스템에서 아주 중요한 기술로 꼽힙니다.
병렬성(Parallelism) 개념 정리
병렬성은 실제로 여러 개의 CPU 코어나 여러 대의 서버에서 동시에 연산을 수행하는 기법입니다. 물리적으로 코어가 여러 개거나 서버가 여러 대라면, 각 코어나 서버가 서로 다른 작업을 맡아 병렬로 계산하면 되므로 처리 속도가 크게 향상됩니다. 특히 연산량이 클수록 병렬성의 효과가 더욱 두드러집니다.
Multi-Processing
멀티프로세싱(Multi-Processing)은 하나의 컴퓨터 안에서 여러 프로세스를 동시에 실행해 병렬 처리를 실현하는 방식입니다. 프로세스마다 독립된 메모리 공간을 갖기 때문에, 공유 자원 관리가 상대적으로 단순하다는 이점이 있지만, 프로세스 간 통신에는 추가 비용이 듭니다. 멀티코어 CPU 환경이면 운영체제가 여러 프로세스를 코어별로 배치해 실제 병렬 연산을 수행하게끔 해줍니다.
분산 시스템
분산 시스템은 여러 대의 물리 서버(노드)를 네트워크로 연결해 작업을 나눠 병렬로 처리하는 아키텍처입니다. 예컨대, Hadoop이나 Spark 같은 프레임워크는 데이터를 여러 노드에 분산 저장하고 동시에 계산한 뒤 결과를 합침으로써 대량의 데이터를 빠르게 처리합니다. 노드를 늘리면(Scale-Out) 처리 능력도 같이 늘어나지만, 노드 간 데이터를 주고받는 과정이 많아질수록 오버헤드가 커질 수 있습니다.

병렬성은 CPU 코어가 많을수록(또는 노드 수가 많을수록) 전체 계산 속도를 비약적으로 끌어올릴 수 있다는 장점이 있습니다. 예를 들어, 머신러닝의 대규모 행렬 연산이나 그래픽 렌더링처럼 연산량이 큰 작업을 여러 코어로 분산해 처리하면, 단일 코어만 사용할 때보다 훨씬 짧은 시간에 같은 결과를 얻습니다.
그러나 하드웨어 자원이 충분해야 하고, 병렬 처리를 위한 코드 수정이나 데이터 구조 재설계가 필요할 때가 많습니다. 프로세스나 노드 간 통신 오버헤드, 데이터 분할·통합 과정, 동기화 문제 등 추가로 고려할 점이 늘어납니다.
동시성과 병렬성의 차이점
- 동시성(Concurrency): 단일 CPU 환경에서도 빠른 전환(Context Switching)을 통해 여러 작업이 동시에 진행되는 것처럼 보이게 하는 기법입니다. CPU가 한순간에는 하나의 작업만 처리하지만, 전환 속도가 매우 빠르므로 여러 작업이 겹쳐 실행되는 듯한 효과를 냅니다.
- 병렬성(Parallelism): 여러 개의 CPU Core 또는 여러 대의 서버(노드)에서 실제로 여러 작업이 물리적으로 동시에 처리되는 기법입니다. 동시성은 주로 소프트웨어적인 방식으로 착시 효과를 내지만, 병렬성은 실제 하드웨어 자원이 여러 개 있어야 의미가 커집니다.
이렇게 구분하긴 해도 실제 업무 환경에서는 동시성과 병렬성을 함께 쓰는 경우가 많은데요. 예를 들어, 싱글 코어에서도 동시성 기법으로 I/O 대기 시간을 최소화하면서 멀티코어나 여러 서버를 활용해 병렬성까지 확보하면, 전체 처리량(Throughput)과 응답성(Response Time)을 모두 높일 수 있습니다.
동시/병렬 처리 예시 살펴보기
웹 서버와 비동기 처리
웹 서버와 비동기 처리는 대규모 트래픽을 동시에 처리해야 하는 상황에서 특히 중요합니다. 일반적으로 많은 사용자가 한꺼번에 접속하면, 네트워크 I/O(데이터베이스 조회, 외부 API 요청 등) 대기 시간이 자주 발생하죠. 비동기 I/O(Async I/O)나 Thread를 활용해 동시성(Concurrency)을 높이면, 한 요청이 대기 상태에 있을 때도 다른 요청을 처리할 수 있어, 전체 시스템 응답 속도가 빨라집니다.
멀티코어 서버 환경이라면, 워커 프로세스나 멀티스레드를 여러 개 두어 병렬성(Parallelism)까지 확보하여, 실제 CPU 코어가 동시에 여러 작업을 분담하게 함으로써 처리량(Throughput)을 극대화할 수 있습니다. 이러한 방식은 Nginx, Node.js, Java 기반 Netty나 Tomcat 같은 서버에서 널리 쓰이며, 대기 시간을 최소화함과 동시에 CPU를 최대한 활용하기 위해 필수적인 패턴으로 자리 잡았습니다.
머신러닝과 병렬 연산
머신러닝과 병렬 연산은 대규모 연산량을 단축하기 위해 필수적으로 고려됩니다. 머신러닝 분야에서는 대규모 데이터셋에 대한 연산(행렬 곱셈, 벡터 연산 등)이 반복적으로 발생하므로, 단일 코어에서 순차적으로 처리하면 학습 시간이 기하급수적으로 늘어날 수 있는데요.
이러한 문제를 해결하기 위해 여러 CPU 코어 혹은 GPU 코어가 동시에 계산을 수행하는 병렬성(Parallelism)을 적극 활용합니다. 예를 들어, TensorFlow나 PyTorch 같은 프레임워크는 GPU 가속을 통해 수천~수만 개의 코어가 병렬로 연산함으로써 모델 학습 시간을 크게 줄입니다.
또한 데이터 입출력, 로깅, 중간 결과 시각화 등은 동시성(Concurrency) 기법을 적용해, 비동기로 처리하면 전체 파이프라인 효율이 높아져, 병렬 연산 성능까지 더욱 효과적으로 활용할 수 있습니다.
Microservices 아키텍처
Microservices 아키텍처는 애플리케이션을 여러 작은 서비스로 나누어, 각각 독립적인 Process로 동작하게 하는 구조입니다. 이때 특정 서비스에 트래픽이 몰리면 그 서비스만 Scale-Out(프로세스나 컨테이너 수 증가)하여 쉽게 확장할 수 있습니다. 또한 멀티코어 서버나 여러 서버 노드를 활용하면, 병렬성(Parallelism)을 확보하여 실제로 여러 코어에서 서비스를 동시에 구동할 수 있죠.
서비스 내부에서는 Thread Pool, 비동기 I/O 등을 사용해 I/O 대기를 최소화하는 동시성(Concurrency) 기법을 적용함으로써, CPU가 할 일이 없도록 방치되지 않게 하는데요. 이러한 조합으로 인해 대규모 트래픽 상황에서도 특정 기능(예를 들어 결제, 인증, 검색 등)이 병목 지점이 되지 않도록 유연하게 확장할 수 있고, 응답성(Response Time)도 안정적으로 유지합니다.
Real-time Data Streaming
Real-time Data Streaming 환경은 실시간으로 쏟아지는 데이터를 빠르게 처리해 의미 있는 결과를 얻고자 할 때 유용합니다. Kafka, Spark Streaming, Flink 등은 메시지 큐 구조와 분산 처리를 결합해, 거대한 데이터 스트림을 여러 Topic이나 Partition으로 나누어 병렬성(Parallelism)을 극대화합니다.
예를 들어, 이벤트가 들어오면 여러 프로세스 혹은 스레드가 동시에 데이터를 받아 분석하고, 결과를 합쳐 즉시 대시보드에 반영하거나 이상 징후를 알림으로 발송할 수 있는데요. 노드 내부적으로는 Thread나 비동기 I/O를 사용해 동시성(Concurrency)을 확보합니다. 이는 I/O 대기 시간을 줄이고, 클러스터 전체적으로는 노드를 늘려 실제 병렬 연산을 수행하므로, 수십만~수백만 건 이상의 이벤트도 빠른 지연(Latency) 안에 처리할 수 있습니다.
이를 통해 금융권의 실시간 거래 모니터링, IoT 센서 데이터 분석, 각종 로그 실시간 분석 등이 가능한 것이죠.

정리하며
결론적으로 동시성(Concurrency)과 병렬성(Parallelism)은 각각 목적과 활용 범위가 다르지만, 현대의 대규모 시스템에서는 둘을 함께 적용해야 최적의 성능을 얻을 수 있습니다.
예를 들어, 웹 서버처럼 I/O가 빈번히 발생하는 서비스에서는 비동기 I/O를 통해 동시성을 확보하고, 동시에 멀티코어 자원을 병렬로 활용해 대규모 트래픽을 빠르게 처리할 수 있습니다. 머신러닝이나 빅데이터 분석처럼 계산량이 엄청난 분야에서는 모델 학습이나 대규모 연산은 병렬성을 통해 처리 시간을 줄이고, 주변 작업(I/O, 로깅, 데이터 관리 등)은 동시성 기법으로 효율화함으로써 전체 파이프라인 성능을 극대화하는 식입니다.
이번 글을 통해 동시성과 병렬성의 개념에 대해 정확히 파악하는 계기가 되었길 바랍니다. 다음 글에서는 기술 면접에서 자주 등장하는 ‘스타 스키마’와 ‘스노우플레이크 스키마’에 대해 살펴보겠습니다.
©️요즘IT의 모든 콘텐츠는 저작권법의 보호를 받는 바, 무단 전재와 복사, 배포 등을 금합니다.