concurrency(동시성) 와 parallelism(병렬성) 의 차이를 명확하게 알아보자.
golang.org 싸이트 대문에 Google I/O 2012 Go Concurrency 영상에서 두 차이를 설명하는 URL 을 따라가보면 잘 정리된 슬라이드를 볼 수 있다.
https://blog.golang.org/concurrency-is-not-parallelism
간단히 요약하자면
concurrency 는 다수의 작업을 동시에 처리하기 위한 (비록 한개의 프로세스를 사용하더라도) 구조를 일컫는 용어이고
parallelism 는 다수의 작업을 동시에 다수의 프로스세스에게 할당하여 수행하는 실행하는 방식
을 일컫는 용어이다.
위 슬라이드에서는 책을 소각할때의 예를 들고 있다.
다수의 책이 쌓여 있고 사용자(worker, 슬라이드에선 gopher로 표현)가 카트에 책을 담아 소각장으로 옮겨 소각 하는 과정에서
병렬성만을 생각하고 다수의 worker 를 두어 동시에 카트를 옮기면 빨리 작업이 완료될 것으로 보이지만 책이 쌓여 있는 장소와 소각장이 1개라는 점을 감안하면 책을 카트에 담을때와 소각장에서 소각을 할때는 병목현상으로 느려진다. 병렬성이라는 의미는 동시에 여러 프로세스를 사용한다는 의미일뿐 여기에 각 worker 의 작업 흐름에 대한 제어는 빠져있는 용어다.
동시성을 고려한다면 worker 하나는 책을 옮기는 동안 다른 worker 는 책을 카트에 담거나 책을 소각하는 등의 일을 한다. 이 과정에서 다수의 worker 를 사용할 가능성이 있으며 이는 곧 병렬성과 관련된다. 단순히 여러개의 worker 를 책 옮기는데에만 사용하는 병렬성의 기능을 잘 컨트롤하여 높은 성능을 발휘할 수 있게 한다.
동시성은 단순히 여러개의 프로세스를 사용한다는 의미의 병렬성이라는 말보다 한번더 효율적인 구조를 위해 작업 흐름을 제어하는 구조까지 생각하는 개념으로 풀이된다.
golang 은 기본적으로 concurrency 으로 구현되어 있고, concurrency 를 사용하는 과정에서 다수의 프로세스를 사용할 수 있기에 실행 방식 측면에서는 병렬성도 내포하고 있다.
참고 - 고루틴 동작 방식
https://tech.ssut.me/2017/08/20/goroutine-vs-threads/