From: 실용주의 프로그래머 20주년 기념판

'동시성concurrency'은 둘 이상의 코드 조각이 실행될 때 동시에 실행 중인 것처럼 행동하는 것이다. 그리고 '병렬성parallelism'이란 실제로 동시에 실행되는 것이다.

동시성을 얻으려면 실행 중에 코드의 다른 부분으로 실행을 전환할 수 있는 환경에서 코드를 구동해야 한다. 보통은 파이버fiber나 스레드, 프로세스 등을 사용하여 동시성을 구현한다.

병렬성을 얻으려면 두 가지 일을 동시에 할 수 있는 하드웨어가 필요하다. CPU 하나에 있는 여러 개의 코어일 수도 있고, 컴퓨터 한 대에 있는 여러 CPU이거나 아니면 네트워크로 연결된 여러 대의 컴퓨터일 수도 있다. 1

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

From: 누구나 쉽게 배우는 클로저

  • concurrency

동시성(concurrency)은 동시에 한 가지 이상의 업무를 관리하는 것을 뜻한다. 여기서 과업(task)은 "뭔가 처리해야 할 것"을 의미하며 하드웨어나 소프트웨어로 구현하는 것을 뜻하지는 않는다. 레이디 가가(Lady Gaga)의 노래 "Telephone"을 활용하여 동시성을 설명해볼 수 있다. 가가는 다음과 같이 노래한다.

나는 손에 술잔을 든 채 문자를 보낼 수는 없다네~
(I cannot text you with a drink in my hand, eh)

여기서 그녀는 오로지 한 가지 과업(술 마시기)만을 관리한다고 설명하고 있다. 그녀는 한 가지 이상의 업무를 관리할 수 없다고 거절하고 있다. 하지만 만약 동시에 할 수 있다면 아마 다음과 같이 노래했을 것이다.

나는 술잔을 내려놓고 문자를 보내네,
그런 다음 전화기를 내려놓고 계속 한 잔 하네~
(I will put down this drink to text you,
then put my phone away and continue drinking, eh)

이 같은 가상의 세상에서 레이디 가가는 두 가지 과업을 처리하는데, 술 마시기와 문자 보내기가 그것이다. 그런데 그녀는 두 가지 일을 동시에 처리하지는 않는다. 그 대신 두 가지 업무를 상호 배치(interleave)한다. 여기서 상호 배치할 때는 하던 일을 완전히 끝마치고 교대 하지는 않는데, 가가는 단어 하나를 입력한 후 전화기를 내려놓고, 술잔을 들어 한 모금 마시고, 다시 전화기를 들어 단어 하나를 더 입력하는 식이다. 3

  • parallelism

병렬(parallelism)이란 동시에 한 가지 이상의 과업을 처리하는 것을 뜻한다. 만약 가가 여사가 병렬로 두 가지 업무를 수행한다면 다음과 같이 노래할 것이다.

나는 한 손으로 문자 보내며 다른 손으로는 술을 마신다네~
(I can text you with one hand while I use the other to drink, eh)

병렬은 동시성의 한 갈래로서, 여러 가지 업무를 동시에 처리하기 전에 우선 그 다중 업무를 관리해야 한다.

클로저는 병렬로 쉽게 처리하게 하는 여러 기능이 있다. 레이디 가가 시스템이 손 여러 개로 동시에 업무를 처리하는 방식으로 병렬을 구현한다면, 컴퓨터 시스템은 보통 다중 프로세서로 여러 개의 업무를 동시에 처리하는 식으로 동작한다.

병렬을 분배(distribution)와 구별하는 것이 중요하다. 분배된 컴퓨팅은 병렬 컴퓨팅의 특별한 경우인데 이때 서로 다른 컴퓨터가 프로세서가 되며 업무는 네트워크를 통해 컴퓨터에 분배된다. 마치 레이디 가가가 "내가 한잔하는 동안 이 친구에게 문자 좀 보내줘."하고 비욘세에게 부탁하는 것과 같다. 3

참고 문헌

  • 실용주의 프로그래머 (20주년 기념판) / 데이비드 토머스, 앤드류 헌트 저/정지용 역/김창준 감수 / 인사이트(insight) / 2판 1쇄 발행 2022년 02월 24일
  • [DANI] 누구나 쉽게 배우는 클로저 / 다니엘 히긴보텀 저 / 김종덕 역 / 비제이퍼블릭(BJ퍼블릭) / 초판 1쇄 발행 2016년 08월 30일 / 원제: Clojure for the Brave and True
  • [JANG] Practical 모던 자바 / 장윤기 저 / 인사이트(insight) / 초판 1쇄 2020년 09월 21일

주석

  1. 실용주의 프로그래머 (20주년 기념판). 6장. 241쪽. 

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

  3. [DANI] 9장. 동시와 병렬의 개념.  2