본문 바로가기

computer science

동시성과 병렬성

동시성 (Concurrency)과 병렬성(Parallelism)에 대해서 예시를 통해서 아래와 같이 설명할 수 있다.

 

한 식당이 있고,

요리사 A, B, C가 있다.

 

요리는 라면, 피자, 파스타가 있고,

레시피는 단순하게 아래와 같다고 가정한다. 

라면 : 1. 물 끓이기 2. 스프 넣기

피자 : 1. 반죽 2. 토핑올리기 3. 오븐에 넣기

파스타 : 1. 면 끓이기 2. 소스 만들기 3. 조리하기 

 

 

동시성

요리사 A가 라면 물 끓이기 -> (스위칭) -> 파스타 면 끓이기 -> (스위칭) -> 피자 반죽하기 -> 라면 스프 넣기 ...

이처럼 한 명의 요리사 스위칭하며 여러 작업을 수행할 수 있다.

 

 

 

병렬성

요리사 A가 라면 : 1. 물 끓이기 2. 스프 넣기

요리사 B가 피자 : 1. 반죽 2. 토핑올리기 3. 오븐에 넣기

요리사 C가 파스타 : 1. 면 끓이기 2. 소스 만들기 3. 조리하기 

즉, 멀티 프로세싱이 가능하다. 

 

정리하면, 

동시성은 논리적 개념으로 멀티 스레딩에서 사용되기도 하고 싱글 스레드에서 사용되기도 합니다. 또한 싱글 코어 뿐만 아니라 멀티 코어에서도 각각의 코어가 동시성을 사용할 있습니다.

 

병렬성은 물리적 개념으로 멀티 코어에서만 가능한 개념이다. 병렬성에서 동시성도 함께 사용될 수 있다. 

 

 

 

GIL

 

멀티 프로세싱 작업시, 여러 스레드로 작업이 진행될 때 메모리를 공유하게 되는데, 이 때 하나의 스레드에서 에러가 발생하면 다른 스레드들에서도 에러가 발생할 수 있다. 이때 이러한 문제점을 극복하기 위해서 GIL이 존재한다.

 

> 한 번에 1개의 스레드만 유지하는 락

> 본질적으로 스레드가 다른 스레드를 차단해서 제어를 얻는 것을 막아줍니다. 멀티 스레딩의 위험으로부터 보호하는 것입니다.

> 파이썬 멀티 스레딩은 동시성을 사용하여 io bound 코드에서 유용하게 사용될 있지만, cpu bound 코드에서는 GIL 의해 원하는 결과를 얻을 없습니다. (파이썬에서는 스레드로 병렬성 연산을 수행하지 못합니다.)

 

 

 

ThreadPoolExecutor: I/O 작업에 적합하고, 스레드를 사용하여 실행합니다. 

ProcessPoolExecutor: CPU-intensive한 작업에 적합하고, 프로세스를 사용하여 실행합니다.