Computer Science

동시성 vs 병렬성 차이, 싱글코어에서도 동시성이 되는 이유

동시성은 여러 작업을 번갈아 다루는 구조의 문제이고, 병렬성은 같은 순간에 실행되는 하드웨어의 문제입니다. 싱글코어에서도 동시성이 성립하는 이유와 Swift Concurrency라는 이름의 의미를 정리했습니다.

이석우iOS Developer4분 읽기
동시성 vs 병렬성 차이, 싱글코어에서도 동시성이 되는 이유 대표 이미지

동시성(concurrency)과 병렬성(parallelism), 한국어로도 영어로도 비슷하게 생겨서 자주 섞여 쓰입니다.

그런데 CPU 코어가 하나뿐이던 시절에도 컴퓨터는 음악을 틀면서 문서를 편집했어요. 물리적으로 한 번에 하나밖에 못 하는 기계가 어떻게 “동시에” 여러 일을 했을까요.

이 질문에 답할 수 있으면 두 개념은 이미 구분된 겁니다. 답을 못 하겠다면, 이 글이 정확히 그 지점을 정리해 드릴 거예요.

Swift Concurrency, GCD(Grand Central Dispatch)의 concurrent queue 같은 이름들도 마찬가지예요. 정확히 이해하려면 이 구분이 바탕이 됩니다.

바리스타 한 명의 교대 작업과 두 명의 동시 작업을 대비한 비교 썸네일
바리스타 한 명이 번갈아 만들면 동시성, 두 명이 같이 만들면 병렬성

핵심 요약입니다.

  1. 동시성: 여러 작업을 번갈아 진행하며 “동시에 다루는” 구조의 문제. 논리적 개념
  2. 병렬성: 여러 작업이 물리적으로 같은 순간에 실행되는 것. 하드웨어의 문제
  3. 싱글코어에서도 동시성은 가능하다. 병렬성은 코어가 여러 개여야 한다
  4. 동시성은 코드 구조로 만들고, 병렬성은 그 구조를 하드웨어가 활용한 결과다

커피 머신 한 대로 이해하기

바리스타가 한 명(코어 1개)인 카페를 상상해 볼게요.

주문이 두 개 들어왔습니다. 바리스타는 A 손님의 에스프레소를 추출하는 동안 B 손님의 우유를 데우고, 추출이 끝나면 A 잔을 마저 만들고, 다시 B로 돌아갑니다. 두 주문이 “동시에 진행 중”이지만, 어느 순간을 캡처해도 바리스타는 한 가지 일만 하고 있어요.

이게 동시성입니다. 작업을 잘게 쪼개 번갈아 진행하면서 여러 일을 함께 다루는 구조요.

바리스타를 한 명 더 고용하면(코어 2개), 이제 두 주문이 정말로 같은 순간에 만들어집니다. 이게 병렬성이에요.

중요한 건 이거예요. 바리스타가 한 명이어도 “주문을 번갈아 처리하는 운영 방식”은 성립하고 두 명이 되는 순간 그 방식이 그대로 물리적 동시 실행으로 확장됩니다.


컴퓨터로 옮기면

싱글코어 시절의 멀티태스킹이 정확히 바리스타 한 명의 카페입니다.

운영체제가 수십 밀리초 단위로 CPU를 이 프로세스 저 프로세스에 번갈아 배정합니다(시분할). 그러니 사람 눈에는 음악 재생과 문서 편집이 동시에 돌아가는 것처럼 보였어요.

싱글코어 시분할과 멀티코어 동시 실행을 대비한 동시성·병렬성 다이어그램
싱글코어는 번갈아 진행(시분할), 멀티코어는 같은 순간에 실행

멀티코어가 되면서 병렬성이 추가됐습니다. 이제는 정말로 코어 4개가 같은 순간에 4개의 스레드를 실행해요.

그래서 관계를 이렇게 정리해 볼게요.

  • 동시성 없이 병렬성만: 서로 무관한 작업을 코어별로 하나씩 돌리는 경우
  • 병렬성 없는 동시성: 싱글코어 시분할
  • 동시성 + 병렬성: 현대 컴퓨팅의 기본. 쪼개 놓은 작업을 여러 코어가 나눠 실행

Go 언어를 만든 롭 파이크의 유명한 강연 제목이 이 구분을 한 문장으로 요약합니다.

“동시성은 병렬성이 아니다(Concurrency is not parallelism).”

그는 동시성을 “여러 일을 다루는 것(dealing with)”, 병렬성을 “여러 일을 하는 것(doing)“이라고 갈랐어요.


Swift Concurrency라는 이름의 의미

애플이 async/await 체계에 붙인 이름이 Swift “Concurrency”인 것도 이 관점에서 보면 정확합니다.

async/await, Task, actor는 전부 “작업을 어떻게 쪼개고, 어디서 중단하고, 어떤 순서로 재개할지”를 표현하는 도구입니다. 즉 동시성 구조를 짜는 언어 장치예요.

그 구조가 실제로 몇 개 코어에서 병렬로 돌지는 런타임과 시스템 스케줄러가 결정합니다. 개발자는 구조(동시성)를 선언하고 병렬 실행은 시스템의 몫이라는 역할 분담이죠.

async let a = fetchProfile()   // 동시에 '진행될 수 있는' 구조 선언
async let b = fetchFeed()
let result = try await (a, b)  // 병렬로 돌지는 시스템이 결정

TaskGroup으로 작업 100개를 만들어도 코어가 8개면 같은 순간에 도는 건 최대 8개입니다. 나머지는 번갈아 진행되죠. 동시성 구조 안에서 병렬성은 하드웨어만큼만 나옵니다.

100개 작업 칩을 8개 코어 슬롯으로 배분하는 스케줄러 일러스트
동시성 구조를 선언하면 병렬 실행 여부는 시스템이 결정합니다

면접에서 한 문장으로

“동시성은 여러 작업을 번갈아 진행하며 함께 다루는 논리적 구조이고, 병렬성은 여러 작업이 물리적으로 같은 순간에 실행되는 것입니다. 그래서 싱글코어에서도 동시성은 가능하지만 병렬성은 불가능합니다.”

꼬리 질문도 대비해 두면 좋아요. “싱글코어 멀티태스킹은 어떻게 가능했나”(시분할), “동시성 코드가 항상 병렬로 도나”(아니요, 스케줄러가 결정) 정도가 이어집니다.


정리

  • 동시성은 작업을 쪼개 번갈아 진행하며 여러 일을 함께 다루는 구조. 논리 차원의 개념이다
  • 병렬성은 여러 작업이 물리적으로 같은 순간 실행되는 것. 하드웨어 차원의 개념이다
  • 싱글코어에서도 동시성(시분할)은 가능하지만 병렬성은 불가능하다
  • 롭 파이크: 동시성은 여러 일을 “다루는 것”, 병렬성은 여러 일을 “하는 것”
  • Swift Concurrency는 동시성 구조를 선언하는 도구이고, 실제 병렬 실행은 시스템이 결정한다
  • 커피 머신 비유: 바리스타 1명이 번갈아 만들면 동시성, 2명이 같이 만들면 병렬성