From: Practical 모던 자바

여러 가지 일을 동시에 처리하기 위한 기법은 크게 병행(Concurrency), 병렬(Parallel) 그리고 분산(Distribute)으로 구분한다.

분산은 여러 대의 원격 서버 혹은 물리적인 장비에 작업을 분산시켜서 처리한다는 개념으로 세 가지 용어 중 가장 쉽게 이해할 수 있는 개념이다. 하지만 병행과 병렬은 하나의 물리적인 서버에서 동작한다는 공통점이 있어서 정확히 구분해서 설명하기 어렵고 구분해서 사용하지 않기도 한다. 그림 6.1을 통해 2개의 용어를 이해해 보자.

Concurrency      │              Parallel
     CPU 1       │       CPU 1            CPU 2
╔═════════════╗  │  ╔═════════════╗  ╔═════════════╗
║  ┌───────┐  ║  │  ║  ┌───────┐  ║  ║  ┌───────┐  ║
║  + Job 1 +  ║  │  ║  │       │  ║  ║  │       │  ║
║  └───────┘  ║  │  ║  │       │  ║  ║  │       │  ║
║  ┌───────┐  ║  │  ║  │       │  ║  ║  │       │  ║
║  │ Job 2 │  ║  │  ║  │       │  ║  ║  │       │  ║
║  └───────┘  ║  │  ║  + Job 1 +  ║  ║  │ Job 2 │  ║
║  ┌───────┐  ║  │  ║  │       │  ║  ║  │       │  ║
║  + Job 1 +  ║  │  ║  │       │  ║  ║  │       │  ║
║  └───────┘  ║  │  ║  │       │  ║  ║  │       │  ║
║  ┌───────┐  ║  │  ║  │       │  ║  ║  │       │  ║
║  │ Job 2 │  ║  │  ║  │       │  ║  ║  │       │  ║
║  └───────┘  ║  │  ║  └───────┘  ║  ║  └───────┘  ║
╚═════════════╝  │  ╚═════════════╝  ╚═════════════╝
"그림 6.1 병행과 병렬"을 보고 그린 그림

그림 6.1은 2개의 작업을 동시 처리할 때 병행과 병렬의 차이를 보여준다. 병행은 하나의 CPU 코어에서 소프트웨어적인 기법으로 동시에 여러 작업을 교차하면서 실행하는 것이며, 병렬은 여러 개의 코어에 작업을 배분해서 동시에 작업을 실행하는 것이며, 병렬은 여러 개의 코어에 작업을 배분해서 동시에 작업을 실행하는 것이다. 둘 다 동시에 작업한다는 의미지만 병행은 하나의 CPU 코어에서 동시에 작업하기 위해 가장 기초가 되는 소프트웨어 작업 기법이고, 병렬은 멀티 코어 하드웨어 환경을 최대한 잘 활용하기 위한 기법으로 이해하면 된다. 그런 의미에서 병행은 프로그램의 성질이고 병렬 실행은 기계적인 특징을 가지고 있다.

그림 6.1 에서는 병행과 병렬을 설명하기 위해 극단적으로 분리했지만, 엄밀히 말하면 오른쪽의 멀티 코어 환경에서는 병렬과 병행 작업이 동시에 일어난다. 작업이 여러 코어로 배분될 뿐만 아니라 하나의 코어에서 여러 작업이 병행해서 동작한다. 1

참고 문헌

  • [JANG] Practical 모던 자바 / 장윤기 저 / 인사이트(insight) / 초판 1쇄 2020년 09월 21일

주석

  1. [JANG] 6장 병렬 프로그래밍