Skip to content
Go back

[Grokking Concurrency] Ch2 Sequential Execution & Parallel Execution

Edit page

순차 실행

순차 실행은 일반적인 프로그램 처리 방식으로 이전 작업이 완료된 후에 다음 작업을 실행하는 방식입니다. 일반적인 Task는 순차적인 규칙과 순서에 따라 실행되므로 가장 익숙한 방식이다.

장점

단점

병렬 실행

병렬 실행의 필요

세탁기 예시를 생각해보자 세탁이라는 Task가 실행되면 세탁기를 켜고 세탁을 하게 되고 세탁이 끝나면 세탁기를 끄는 Task가 실행된다. 이 과정은 순차적으로 실행된다. 하지만 이 과정에서 세탁을 하기 위해 세탁기를 켜야 하므로 세탁이 끝날 때까지 기다려야 한다.

그렇다면 세탁기를 여러개 운영해서 세탁을 병렬적으로 하게하면 어떨까? 같은 시간내에 더 많은 세탁을 할 수 있을 것이다. 세탁기 병렬 실행

같은 성능의 세탁기를 여러개 운영하면 같은 시간내에 더 많은 세탁을 할 수 있을 것이다. 앞서 말했 듯 성능을 높인 수직 확장이 아닌 개수를 늘려 수평 확장으로 처리율을 높였다.

병렬 컴퓨팅을 위해 필요한 것

위와 같이 병렬 컴퓨팅(병렬 실행)을 위해서 작업 독립성과 하드웨어 지원이 필요하다.

작업 독립성

병렬 컴퓨팅은 각 작업이 순차적으로 실행하는 것이 아닌 순서 상관 없이 동시에 실행할 수 있도록 하는 것이다. 그 과정에서 각 작업은 독립적으로 실행되어야한다. 그래서 각 병렬 작업은 독립적으로 작업이 분해(Decomposition)되어야한다. 물론 모든 작업들이 독립적일 수 없으므로 의존적인 작업들은 동기화(Synchronize) 과정이 필요하다. 동기화는 다른 작업이 완료된 후 다음 작업을 시작하는 Blocking 과정이다.

동기화가 필요치 않거나 적게 필요한 작업을 처치 곤란 병렬(embarrassingly parallel) 이라고 한다. 이는 병렬 컴퓨팅의 가장 기본적인 형태로 여러개의 병렬 작업이 동시에 실행되며 각 작업은 독립적으로 실행된다.

하드웨어 지원

병렬 컴퓨팅을 위해서는 하드웨어 지원이 필요하다. CPU의 멀티 코어가 필요로 요구된다.

암달의 법칙(Amdahl’s Law)

암달의 법칙은 태스크를 병렬로 실행할 때 전체 태스크의 성능을 계산하는 공식이다. 위에서 말했듯이 실제 우리가 처리할 태스크는 대부분 순차적인 태스크와 병렬적인 태스크가 혼합되어 있다. 그중에서 병렬로 실행할 수 있는 태스크를 우리가 병렬로 실행하면 결국 아래 그림과 같이 태스크 시간이 줄어들게 된다.

병렬 실행에 투입되는 리소스가 늘어날 수록 결국 병렬 태스크의 시간은 0에 가까워지고, 순차 처리 태스크의 시간만 남게 된다. 결국 병렬로 실행할 수 있는 태스크의 비율이 전체 태스크의 비율에 따라 성능이 결정된다. 우리가 일상생활에서 마트에 사람은 쾌적하게 쇼핑할 수 있게 돌아다니지만 결국 계산대에서 사람들은 병목을 겪게 되는 것과 같다. amdahl's law

암달의 법칙을 아래와 같이 수식화를 할 수 있다.

SPEEDUP=1(1P)+PNP=>병렬화할수있는태스크의비율N=>병렬로실행할수있는프로세스의수SPEEDUP = \frac{1}{(1 - P) + \frac{P}{N}} \\ P => 병렬화할 수 있는 태스크의 비율 \\ N => 병렬로 실행할 수 있는 프로세스의 수

수식을 기반으로 성능을 100배 이상 향상시키기 위해서 프로세스가 2500개라 가정할 때, 병렬화할 수 있는 태스크의 비율은 99%이상이어야 한다.

암달의 법칙을 통해 병렬 처리 했을 시 얼만큼의 성능 향상이 가능한지 확인 할 수 있다. 오버헤드가 병렬 실행 이익보다 큰 경우도 있기 때문에 무조건적인 병렬화는 고민해봐야한다.

구스타프슨의 법칙

암달의 법칙만 본다면 병렬 컴퓨팅으로 태스크 성능 개선이 쉽지 않다고 생각할 수 있지만, 구스타프슨의 법칙의 관점에서는 조금 다르게 볼 수 있다.

관점의 전환

암달의 법칙은 고정된 작업 크기에서 얼마나 빠르게 처리할 수 있는지에 초점을 맞춘다. 하지만 구스타프슨의 법칙은 다른 질문을 던진다.

“같은 시간 내에 얼마나 더 큰 문제를 해결할 수 있을까?”

실제 현실에서 우리는 어떻게 컴퓨팅 자원을 사용할까? 예를 들어, 이미지 처리 작업을 생각해보자.

더 많은 컴퓨팅 자원이 생기면 같은 시간에 더 많은 이미지를 처리하거나, 더 높은 해상도의 이미지를 처리하거나, 더 복잡한 필터를 적용할 수 있다. 이것이 바로 구스타프슨의 법칙이 말하고자 하는 핵심이다.

구스타프슨의 법칙 수식

SPEEDUP=(1P)+N×PP=병렬화할수있는태스크의비율N=병렬로실행할수있는프로세스의수SPEEDUP = (1 - P) + N \times P \\ P =\> 병렬화할 수 있는 태스크의 비율 \\ N =\> 병렬로 실행할 수 있는 프로세스의 수

암달의 법칙과 비교해보면 수식의 형태가 다르다는 것을 알 수 있다. 암달의 법칙에서는 PN\frac{P}{N}로 병렬 부분이 분모에 있어 N이 커질수록 효과가 감소하지만, 구스타프슨의 법칙에서는 N×PN \times P로 N이 커질수록 선형적으로 성능이 향상된다.

암달 vs 구스타프슨

두 법칙의 가장 큰 차이는 문제의 크기를 어떻게 보느냐이다.

구분암달의 법칙구스타프슨의 법칙
문제 크기고정가변 (확장 가능)
질문얼마나 빨라질까?같은 시간에 얼마나 더 많이 처리할까?
성능 한계순차 부분에 의해 제한됨선형적 확장 가능
관점비관적낙관적

동시성 vs 병렬성

일반적으로 동시성(Concurrency)과 병렬성(Parallelism)을 같은 의미로 사용하는 경우가 많다. 하지만 이 둘의 가장 큰 차이점에는 자원에서 발생한다.

핵심 차이

쉽게 말해 동시성은 싱글 코어에서 여러 스레드를 빠르게 번갈아가며 실행해서 마치 동시에 돌아가는 것처럼 ‘속이는’ 기술에 가깝고, 병렬성은 멀티 코어를 이용해 진짜로 동시에 작업을 수행하는 것이다.

커피숍 비유

가장 유명한 커피숍 비유를 들어보자.

동시성 (Concurrency)

병렬성 (Parallelism)

concurrency-parallelism

관점의 차이

병렬과 동시성 이 둘의 가장 큰 차이는 관점의 차이다.

언제 뭘 써야 할까?

동시성은 I/O가 많을 때 유리하다. DB 조회나 API 호출처럼 기다리는 시간이 많은 작업에서 기다리는 동안 멍하니 있지 않고 다른 일을 처리하면 효율적이다. (Node.js에서 이벤트 루프)

병렬성은 계산이 많을 때 유리하다. 이미지 처리나 머신러닝 학습처럼 CPU가 쉴 새 없이 돌아가야 하는 작업들은 코어 여러 개를 풀가동해서 병렬로 처리하는 게 답이다.

정리하며

Rob Pike

Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once.

결국 동시성은 일을 구조화하는 방법이고, 병렬성은 일을 수행하는 방식이다. 요즘은 웹 서버 같은 곳에서 이 두 가지를 적절히 섞어서(동시성으로 요청을 받고, 병렬성으로 처리를 하고) 사용하는 게 일반적이다.

무조건 빠르다고 좋은 건 아니다. 동시성을 잘못 쓰면 디버깅 지옥(Race Condition)에 빠질 수 있고, 병렬성도 오버헤드 때문에 오히려 느려질 수 있다. 상황에 맞춰 적절히 쓰는 지혜가 필요하다.


Edit page
Share this post on:

Next Post
소프트웨어 마에스트로 16기 후기, 이하늘 멘토님과 함께하며