이 글은 원 저자 Jakob Jenkov의 허가로 포스팅된 번역물이다.

원문 URL : http://tutorials.jenkov.com/java-concurrency/concurrency-vs-parallelism.html



 용어 '컨커런시' 와 '페러럴리즘' 은 멀티쓰레드 프로그램 관계에서 흔히 사용된다. 하지만 이 두 용어의 정확한 의미가 무엇일까?

이에 대한 간단한 대답은, "아니오" 이다. 이 둘은 상당히 비슷해 보이긴 하지만 다른 용어이다. 이 둘의 차이를 이해하는 데에 시간이 조금 필요했고, 때문에 이 주제를 튜토리얼에 추가하기로 마음먹었다. '컨커런시 vs '페러럴리즘'.


 

컨커런시


 컨커런시는 한 어플리케이션이 하나 이상의 task를 가지고, 동시에 실행된다. 만일 컴퓨터의 CPU가 하나라면, 어플리케이션은 '동시에' 다수의 task를 가질 수 없을 수 있다. 하지만 하나 이상의 task는 어플리케이션 내부에서 작동한다. 한 task가 시작되기 전, 이전의 task는 완전히 종료되지 않는다.

 

 


페러럴리즘


 페러럴리즘은 한 어플리케이션이 다수의 subtasks로 나뉘고 이 subtasks들이 병렬로 작동하는 것이다. 정확히 같은 시간에 작동하는 다수의 CPU를 예로 들 수 있다.


 


컨커런시 vs. 페러럴리즘 In Detail


 보다시피, 컨커런시는 한 어플리케이션이 다수의 task를 어떻게 다루는가와 관련이 있다. 어플리케이션은 한번에 한 task를 순차적으로 가지거나, 다수의 task를 동시에 가질 수 있다. 반면 페러럴리즘은 한 어플리케이션이 각각의 task를 어떻게 다루는가와 관련이 있다. 어플리케이션은 task를 처음부터 끝까지 연속적으로 가지거나, 한 task를 다수의 subtask 로 나누고 이들이 병렬로 작동하게끔 한다.


한 어플리케이션은 동시성(concurrency)을 가질 수 있고, 병행성(parallelism)은 가지지 않을 수 있다. 이것은 하나 이상의 task를 동시에 가진다는 말이고, 이 task들은 subtask로 나뉘지 않는다. 또한, 한 어플리케이션은 병행성을 가지고 동시성은 가지지 않을 수 있다. 이것은 한번에 하나의 task만을 가진다는 말이고, 이 task가 다수의 subtask로 나뉘어 병렬로 작동한다.


이에 더하여, 어플리케이션은 동시성과 병행성 둘 다 가지지 않을 수도 있다. 이는 오직 한번에 한 task만을 가지고 이 task는 절대 subtask로 나뉘지 않는다는 말이다.


마지막으로, 어플리케이션은 동시성과 병행성 모두를 가질 수도 있다. 이 두 형태는 동시에 다수의 task로 작동하며, 각 task는 subtask로 나뉘어 병렬로 작동하기도 한다. 하지만, 이 경우에 동시성과 병행성의 이점을 잃을 수도 있다. 컴퓨터의 CPU가 이미 다른 작업을 처리하느라 바쁘게 돌아가고 있다면, 동시성과 병행성 모두 의미가 없다. 이 둘을 결합하는 일은 그저 약간의 성능 향상 혹은 오히려 성능의 저하를 야기하기도 한다. 맹목적으로 이 모델을 사용하기 전에 정확한 분석과 측정이 요구되는 이유이다.

 

'Java > Concurrency' 카테고리의 다른 글

경합 조건과 임계 영역(Race Conditions and Critical Section)  (1) 2017.04.09
자바 쓰레드 시작하기  (0) 2017.04.09
컨커런시 모델  (0) 2017.04.09
멀티쓰레딩의 단점  (0) 2017.04.09
멀티쓰레딩의 장점  (0) 2017.04.09

+ Recent posts