← 전체 강의 목록

02강 · 여러 일을 처리하는 방법

동시성
vs 병렬성

여러 일을 번갈아 진행하는 것과 여러 실행 자원이 실제로 동시에 일하는 것은 어떻게 다를까?

먼저 흐릿한 부분을 골라 보자

선택한 항목을 오늘 설명의 출발점으로 삼는다. 여러 개를 골라도 괜찮다.

지금 가장 설명하기 어려운 항목

아직 선택하지 않았다. 아래 시간선부터 살펴보자.

같은 작업 A와 B를 시간선으로 비교하기

“한 순간에 실제로 몇 개의 작업이 실행되는가?”를 보면서 동시성과 병렬성을 구분해 보자.

동시성: 코어 하나가 작업을 번갈아 처리 1단계 / 8단계
코어 1
A A B B A B A B

지금 코어 1이 작업 A의 첫 단계를 실행하고 있다. 한 순간에 실행되는 작업은 하나다.

동시성 모드에서는 코어 1개가 A와 B를 번갈아 처리한다. 빠른 전환 때문에 둘이 함께 진행되는 것처럼 보인다.

동시성: 여러 일을 겹쳐 진행

여러 작업을 모두 진행 중으로 관리하는 구조다. 한 순간에 하나만 실행해도 동시성을 만들 수 있다.

  • 싱글 코어 가능 — 작업을 짧게 번갈아 실행할 수 있다.
  • 기다림 활용 — 네트워크 응답을 기다리는 동안 다른 일을 한다.
  • 핵심 질문 — “현재 기다리는 일을 두고 다른 일을 진행할 수 있는가?”

병렬성: 실제로 같은 순간에 실행

서로 다른 코어·GPU·Worker 같은 실행 자원이 같은 순간에 여러 작업을 처리하는 방식이다.

  • 여러 실행 자원 필요 — 서로 다른 계산 장치가 필요하다.
  • 작업 분할 — 일을 나누고 결과를 합치는 설계가 필요하다.
  • 핵심 질문 — “실제로 같은 순간에 몇 개의 작업이 계산되는가?”

이 개념은 어디에서 사용될까?

컴퓨터는 한 가지 일만 하지 않기 때문에, 동시성과 병렬성을 구분해야 한다.

운영체제의 멀티태스킹

브라우저·음악·에디터를 한 코어에서 번갈아 실행하면 동시성, 여러 코어에서 나누어 실행하면 병렬성이다.

웹 서버 요청 처리

요청 A의 DB 응답을 기다리는 동안 요청 B를 받는 것은 동시성이다. 여러 코어가 각각 계산하면 병렬성도 함께 나타난다.

이미지·영상 계산

이미지 영역이나 영상 프레임을 여러 코어 또는 GPU에 나누어 같은 순간에 처리하면 병렬성이다.

JavaScript는 동시성과 병렬성을 어떻게 만날까?

하나의 JavaScript 이벤트 루프에서 JS 코드는 한 번에 하나씩 실행된다. 그러나 브라우저와 Node.js는 별도 실행 자원을 제공하므로, JavaScript가 병렬성과 관계없다고 단정하면 안 된다.

이벤트 루프 여러 사건의 실행 순서를 관리한다. 한 번에 하나의 JS 코드를 실행한다.
Web Worker 브라우저의 별도 실행 흐름에서 작업한다. 무거운 계산을 나눌 때 사용할 수 있다.
Node.js worker_threads Node.js에서 여러 스레드로 작업을 나누어 실제 병렬 실행을 할 수 있다.

표로 한 번 더 비교하기

기준 동시성 병렬성
초점 여러 일을 겹쳐 진행하도록 관리하는 구조 여러 실행 자원이 같은 순간에 실행하는 방식
싱글 코어 가능 서로 다른 작업의 실제 동시 실행은 어려움
예시 time slicing, 이벤트 루프, 비동기 I/O 멀티 코어 CPU, GPU, Web Worker
기억할 말 “기다리는 동안 다른 일을 할 수 있나?” “실제로 같은 순간에 계산하나?”

내 말로 설명해 보기

정의를 외우기보다 아래 질문에 상황을 넣어 답해 보자.

  1. 싱글 코어에서 A와 B가 동시에 움직이는 것처럼 보이는 이유는 무엇인가?
  2. 네트워크 응답을 기다리는 동안 다른 요청을 처리하는 서버는 어떤 개념을 사용하는가?
  3. 이미지의 왼쪽과 오른쪽을 서로 다른 코어가 같은 순간에 계산하면 무엇인가?
  4. “JavaScript는 싱글 스레드니까 병렬성과 관계없다”는 말을 어떻게 고쳐야 하는가?
  5. 동시성과 병렬성이 한 프로그램 안에서 함께 사용될 수 있는 이유는 무엇인가?

이해 확인 퀴즈

먼저 답을 적어 본 뒤 정답을 열어 보자.

  1. 참/거짓: 동시성을 사용하려면 반드시 CPU 코어가 두 개 이상 있어야 한다.
  2. 객관식: 다음 중 병렬성에 가장 가까운 상황은 무엇일까?
    1. 한 코어가 브라우저와 음악 앱을 빠르게 번갈아 실행한다.
    2. 서버가 DB 응답을 기다리는 동안 다른 요청을 받는다.
    3. 두 코어가 이미지의 서로 다른 영역을 같은 순간에 계산한다.
    4. 이벤트 큐에서 다음 콜백을 선택한다.
  3. 짧은 설명: 동시성과 병렬성의 차이를 “구성”과 “실제 실행”이라는 말을 사용해 설명해 보자.
  4. 상황 판단: 서버 요청 A가 파일을 기다리는 동안 요청 B를 처리한다. 이 상황에서 동시성이 나타나는 이유는 무엇일까?
  5. JavaScript 연결: 하나의 JavaScript 이벤트 루프와 Web Worker의 실행 차이를 설명해 보자.
정답과 해설 보기

1. 거짓. 싱글 코어에서도 작업을 짧게 번갈아 처리하거나, 한 작업이 응답을 기다리는 동안 다른 작업을 진행하면 동시성을 만들 수 있다.

2. C. 두 코어가 같은 순간에 서로 다른 이미지 영역을 계산하므로 실제 병렬 실행이다. A와 B는 동시성의 예다.

3. 동시성은 여러 작업이 겹쳐 진행되도록 순서와 대기를 구성하는 방법이고, 병렬성은 여러 실행 자원이 여러 작업을 같은 순간에 실제로 처리하는 방식이다.

4. 요청 A의 대기 시간에 서버가 놀지 않고 요청 B를 진행하기 때문이다. 이 사례만으로 두 요청의 CPU 코드가 같은 순간에 실행되었다고 볼 수는 없다.

5. 하나의 이벤트 루프에서는 JS 코드가 한 번에 하나씩 실행된다. Web Worker는 별도 실행 흐름에서 작업하므로 여러 Worker를 사용하면 작업을 실제 병렬로 실행할 수 있다.