Concurrency vs Parallelism 가이드: 여러 작업을 다루는 것과 동시에 실행하는 것은 다르다
Dev
마지막 업데이트

Concurrency vs Parallelism 가이드: 여러 작업을 다루는 것과 동시에 실행하는 것은 다르다


동기/비동기, blocking/non-blocking을 공부하다 보면 거의 다음 단계처럼 concurrencyparallelism이 등장합니다. 문제는 두 단어가 모두 “여러 작업을 한꺼번에 다루는 느낌”을 주기 때문에, 처음에는 같은 뜻처럼 섞여 버리기 쉽다는 점입니다.

하지만 실제로는 분명히 다른 개념입니다. 둘 다 여러 작업을 다룬다는 공통점은 있지만, concurrency는 여러 작업의 진행이 겹치도록 구조를 만드는 쪽에 가깝고, parallelism은 여러 작업이 같은 시점에 실제로 실행되는 상태에 더 가깝습니다.

이 글에서는 아래 내용을 정리합니다.

  • concurrency와 parallelism이 각각 무엇인지
  • 비동기와 어떤 관계가 있는지
  • 왜 둘을 같은 말로 쓰면 이해가 꼬이는지

핵심은 concurrency는 여러 작업의 진행을 겹치게 관리하는 구조이고, parallelism은 여러 작업이 진짜로 동시에 실행되는 상태라는 점입니다.

Concurrency 란 무엇인가

concurrency는 여러 작업이 진행 중인 상태를 잘 다루는 능력에 가깝습니다. 중요한 것은 작업들이 서로 완전히 같은 순간에 실행되느냐가 아니라, 여러 작업이 겹쳐서 앞으로 나아가느냐입니다.

예를 들어 하나의 런타임이:

  • 작업 A를 조금 진행하고
  • 작업 B로 넘어갔다가
  • 다시 작업 A를 이어서 처리할 수 있다면

그 시스템은 concurrency 관점에서 여러 작업을 함께 다루고 있는 것입니다.

즉 concurrency는 “여러 작업이 동시에 존재하는 상황을 관리하는 구조”라고 이해하면 쉽습니다.

Parallelism 이란 무엇인가

parallelism은 여러 작업이 실제로 같은 시간에 실행되는 상태입니다. 보통 여러 CPU 코어, 여러 실행 유닛, 혹은 별도의 worker가 필요합니다.

예를 들면:

  • 코어 1에서 작업 A 실행
  • 코어 2에서 작업 B 실행

이렇게 물리적으로 동시에 돌아가고 있다면 그것이 parallelism입니다.

즉 parallelism의 핵심은 실제 동시 실행입니다.

요리 비유로 보면 더 쉽다

요리 비유를 쓰면 둘의 차이가 꽤 직관적으로 보입니다.

Concurrency

요리사 한 명이:

  • 물을 올려두고
  • 그 사이에 채소를 썰고
  • 다시 냄비 상태를 확인하는 식으로

여러 작업을 번갈아 처리합니다.

Parallelism

요리사 두 명이:

  • 한 명은 면을 삶고
  • 다른 한 명은 소스를 만드는 식으로

같은 시간에 실제로 일을 합니다.

즉 concurrency는 한 사람이 여러 일을 juggling 하는 느낌이고, parallelism은 여러 사람이 진짜 동시에 일하는 느낌입니다.

왜 둘을 자꾸 헷갈릴까

겉으로 보기에는 둘 다 “많은 일이 함께 일어나는 것”처럼 보이기 때문입니다. 하지만 보는 관점이 다릅니다.

  • concurrency: 여러 작업의 진행이 겹치는가
  • parallelism: 여러 작업이 실제로 같은 시점에 실행되는가

그래서 concurrency가 있다고 해서 반드시 parallelism이 있는 것은 아닙니다. 반대로 parallelism이 있는 시스템도 결국 여러 작업을 관리하는 구조를 함께 가질 수 있습니다.

비동기와는 어떤 관계일까

여기서 또 자주 섞이는 개념이 async입니다. 하지만 비동기 역시 같은 뜻은 아닙니다.

  • 비동기: 오래 걸리는 작업을 기다리며 전체 흐름을 멈추지 않는 구조
  • concurrency: 여러 작업이 겹쳐 진행되게 만드는 구조
  • parallelism: 여러 작업이 실제로 동시에 실행되는 상태

즉 비동기 코드는 concurrency를 만들기 쉽게 도와줄 수는 있지만, 그것이 자동으로 parallelism을 의미하지는 않습니다.

예를 들어 JavaScript의 event loop 기반 비동기 코드는 여러 요청과 후속 작업을 겹쳐 다루는 데 유리합니다. 하지만 그것만으로 CPU 계산이 여러 코어에서 동시에 실행된다는 뜻은 아닙니다.

왜 이 차이가 중요할까

이 차이를 이해하면 아래 질문들이 훨씬 잘 풀립니다.

  • 비동기 코드를 썼는데 왜 CPU 코어 하나만 바쁜지
  • 서버가 많은 요청을 동시에 처리하는 것처럼 보이는데 왜 무조건 병렬은 아닌지
  • 어떤 문제는 concurrency 설계가 중요하고, 어떤 문제는 parallelism이 중요한지

예를 들면:

  • 많은 네트워크 요청을 겹쳐 처리한다 -> concurrency가 중요
  • 무거운 이미지 변환 작업을 여러 코어로 나눈다 -> parallelism이 중요

즉 문제의 성격에 따라 필요한 설계 포인트가 달라집니다.

실무에서는 어떻게 구분하면 좋을까

아래처럼 나누면 꽤 실용적입니다.

I/O 중심 작업

웹 서버, API 호출, 파일 읽기처럼 기다리는 시간이 큰 작업은 concurrency 구조가 아주 중요합니다.

CPU 중심 작업

이미지 처리, 압축, 대규모 계산처럼 연산량이 큰 작업은 parallelism이 더 중요해지는 경우가 많습니다.

정리하면:

  • 기다림이 큰 문제 -> concurrency가 체감 효과를 많이 줌
  • 계산량이 큰 문제 -> parallelism이 더 직접적인 효과를 줌

JavaScript에서 자주 생기는 오해

1. async 코드면 곧바로 병렬 처리다

아닙니다. async는 concurrency 구조를 만들기 쉽게 해 주지만, 병렬 실행과는 다른 문제입니다.

2. concurrency 와 parallelism 은 그냥 같은 말이다

아닙니다. 하나는 구조와 관리 방식에 가깝고, 다른 하나는 실제 실행 상태에 가깝습니다.

3. parallelism 이 언제나 더 좋다

문제에 따라 다릅니다. I/O 중심 시스템에서는 concurrency 설계가 훨씬 더 중요할 때도 많습니다.

공부 순서로는 어디쯤에 둘까

보통 아래 순서로 보면 가장 자연스럽습니다.

  1. 동기 vs 비동기 가이드
  2. Blocking vs Non-Blocking 가이드
  3. Concurrency vs Parallelism
  4. Event Loop 가이드

이 흐름으로 가면 기다리는 방식, 호출 제어, 여러 작업 관리, 런타임 스케줄링이 한 줄로 연결됩니다.

FAQ

Q. concurrency 가 있으면 parallelism 도 있는 건가요

항상 그렇지는 않습니다. 하나의 실행 흐름만으로도 concurrency 구조는 만들 수 있습니다.

Q. parallelism 이 있으면 concurrency 도 있는 건가요

관련은 있지만, 개념적으로는 여전히 구분해서 보는 편이 좋습니다.

Q. JavaScript 는 concurrency 만 있고 parallelism 은 없나요

기본 실행 모델은 concurrency 쪽 설명이 더 잘 맞지만, 환경에 따라 worker 같은 별도 병렬 도구도 사용할 수 있습니다.

먼저 읽어볼 가이드

검색 유입이 많은 핵심 글부터 이어서 보세요.

광고