https://jenkov.com/tutorials/java-concurrency/concurrency-vs-parallelism.html 의 한글 번역본이다.
Concurrency vs. Parallelism
Concurrency and parallelism are two terms often used in relation to multithreaded applications. This tutorial explains the difference between concurrency and parallelism.
jenkov.com
"Concurrency(동시성)"와 "Parallelism(병렬성)"이라는 용어는 종종 멀티스레드 프로그램과 관련하여 사용된다.
처음에는 동시성과 병렬성이 동일한 개념으로 보일 수 있지만 동시성과 병렬성은 실제로 다른 의미를 갖는다.
단일 프로세스 내에서 동시성과 병렬성을 살펴보자면
동시성(Concurrency)
동시성은 어플리케이션이 한 번에 하나 이상의 작업에 대해 진행 중임을 의미하거나, 동시에 또는 적어도 동시에 진행되는 것처럼 보이는 것을 말한다. 컴퓨터가 CPU 하나만 있는 경우 응용 프로그램은 정확히 동시에 하나 이상의 작업에 대해 진행되지 않을 수 있지만, 응용 프로그램 내에서 동시에 둘 이상의 작업은 가능하다. 동시에 여러 작업을 진행하려면 CPU가 실행 중에 다른 작업으로 전환된다.
병렬 실행(Parallel Execution)
병렬 실행은 컴퓨터가 하나 이상의 CPU 또는 CPU 코어를 가지고 있고, 동시에 여러 작업에 대한 진행이 이루어지는 경우를 말한다.
그러나 병렬 실행은 병렬성과 동일한 현상을 말하는 것이 아니다.
병렬 동시 실행(Parallel Concurrent Execution)
병렬 동시 실행은 스레드가 여러 CPU 사이에 분산되는 경우를 말하며, 동일한 CPU에서 실행되는 스레드는 동시에 실행되고, 서로 다른 CPU에서 실행되는 스레드는 병렬로 실행됩니다.
병렬성(Parallelism)
병렬성이란 응용 프로그램이 작업을 더 작은 하위 작업으로 분할하여 병렬로 처리할 수 있는 것을 의미한다.
예를 들어, 여러 CPU에서 정확히 동시에 처리될 수 있으며 병렬성은 동시 실행과 동일한 실행 모델을 가리키지 않는다.
진정한 병렬성을 달성하려면 응용 프로그램에 둘 이상의 스레드가 실행되어야 하며, 각 스레드는 별도의 CPU/CPU 코어/그래픽 카드 GPU 코어 등에서 실행되어야 한다.
아래 다이어그램은 큰 작업이 4개의 하위 작업으로 분할되는 것을 보여준다. 이 4개의 하위 작업은 2개의 다른 CPU에서 실행되는 4개의 다른 스레드에 의해 실행된다. 이는 이러한 하위 작업 중 일부가 동시에 실행되고(동일한 CPU에서 실행되는 것), 일부는 병렬로 실행됨을 의미한다.
만약 4개의 하위 작업이 각각 자신의 CPU에서 실행되는 4개의 스레드에 의해 실행되었다면 (총 4개의 CPU), 작업은 완전히 병렬로 이루어졌을 것이다. 하지만 작업에 사용 가능한 CPU 수와 정확히 동일한 수의 하위 작업으로 분할하는 것은 쉽지 않다. 종종, 작업이 현재 작업과 자연스럽게 맞는 하위 작업의 수로 분할하고 다음 스레드 스케줄러가 사용 가능한 CPU들 사이에서 스레드를 분배하도록 하는 것이 더 쉽다.
동시성과 병렬성의 조합(Concurrency and Parallelism Combinations)
동시성은 단일 CPU가 여러 작업을 동시에 진행하는 방법을 말한다.(동시에 진행되는 것처럼 보임)
반면 병렬성은 응용 프로그램이 단일 작업의 실행을 병렬화하는 하는 것을 말하며 일반적으로 작업을 병렬로 처리할 수 있는 하위 작업으로 분할하는 것이다. 이 두 가지 실행 스타일은 동일한 응용 프로그램 내에서 결합될 수 있다.
다음 설명은 이러한 조합들중 일부 내용이다.
동시적이지만 병렬적이지 않음 (Concurrent, Not Parallel)
응용 프로그램은 동시적이지만 병렬적이지 않을 수 있다. 이는 응용 프로그램이 여러 작업을 동시에 진행하는 것처럼 보이지만 (동시에), 응용 프로그램이 각 작업에 대한 진행을 전환하면서 작업을 완료할 때까지 병렬 스레드/ CPU에서 작업이 진행되는 병렬 실행은 없다.
병렬적이지만 동시적이지 않음 (Parallel, Not Concurrent)
응용 프로그램은 병렬적이지만 동시적이지 않을 수 있다. 이는 응용 프로그램이 한 번에 하나의 작업만 처리하고, 이 작업이 병렬로 처리될 수 있는 하위 작업으로 나뉘는 것을 의미한다. 그러나 각 작업(및 하위 작업)은 다음 작업이 분할되고 병렬로 실행되기 전에 완료된다.
동시적이지도, 병렬적이지도 않음 (Neither Concurrent Nor Parallel)
응용 프로그램은 동시적이지도, 병렬적이지도 않을 수 있다. 이는 응용 프로그램이 한 번에 하나의 작업만 처리하고, 작업을 병렬 실행하기 위해 하위 작업으로 분해되지 않는 것을 의미합니다. 이는 작업이 너무 작아서 병렬화하기에 의미가 없는 CLI 응용 프로그램 등에서 발생할 수 있다.
동시적이며 병렬적임 (Concurrent and Parallel)
응용 프로그램은 두 가지 방법으로 동시적이며 병렬적일 수 있다.
첫 번째 방법은 병렬 동시 실행이다.
가장 간단한 방법이며 이는 응용 프로그램이 여러 스레드를 시작한 다음 여러 CPU에서 실행될 때 발생하는 일이다.
두 번째 방법은 응용 프로그램이 여러 작업을 동시에 처리하고, 각 작업을 병렬 실행을 위해 하위 작업으로 분해하는 경우이다.
그러나 이러한 시나리오에서는 동시성과 병렬성의 일부 이점이 손실될 수 있다. 왜냐하면 컴퓨터의 CPU가 동시성 또는 병렬성만으로도 이미 충분히 바쁘기 때문이다. 이를 결합하면 성능 향상이 미미하거나 심지어 성능 손실이 발생할 수도 있다.
맹목적으로 동시 병렬 모델을 채택하기 전에 반드시 분석하고 측정해야 한다.
'Algorithm > 알고리즘 응용' 카테고리의 다른 글
[페이지네이션] - 커서 기반 vs 오프셋 기반 (0) | 2024.02.10 |
---|---|
Rate Limit 을 처리하는 이유 (브루트 포스/SMS 공격 등) (0) | 2024.02.09 |