홍순우
Soonwoo Hong

동시성, 병렬성 그리고 Go에 대해 알게된 내용들

동시성, 병렬성

Rob Pike가 설명하는 concurrency와 parallelism
[출처] https://blog.golang.org/concurrency-is-not-parallelism

동시성(Concurrency)

ex) OS는 마우스, 키보드, 스크린 등 다양한 주변 장치를 제어하지만 이러한 여러 개의 장치를 관리하기 위해서 병렬 작업이 필요한 건 아님. 하나의 CPU 코어로도 처리가 가능함.

병렬성(Parallelism)

ex) 두 개의 코어가 각기 다른 스레드/프로세스를 실행.

Goroutine

이벤트 드리븐 방식의 프로그램 혹은 동시에 여러 외부 자원을 요청하고(e.g. 외부 api 호출, DB 접근 등 I/O intensive한 작업) 응답을 기다리는 프로그램은 동시성을 고려하여 작성할 경우 성능 향상을 얻을 수 있음.

초간단 Go 스케줄러 알아보기

Go 스케줄러는 매 라운드마다 실행 가능한 Goroutine을 찾아 스레드에 할당한다. Go runtime이 생성하는 스레드의 수는 GOMAXPROCS 환경 변수에 의해 결정됨. 하지만 실제로 생성되는 스레드는 GOMAXPROCS보다 많을 수 있음. GOMAXPROCS는 CPU 코어의 수로 초기화되지만 런타임에 변경할 수 있음. (GOMAXPROCS가 정확히 어떻게 사용되는지 잘 모르겠다. 소스 코드에 답이 있을테지만 볼 용기가 안난다.)
Goroutine이 새로 생성되거나 실행 가능한 상태가 되면 각 코어의 local queue에 추가됨. 각 코어는 큐에서 실행 가능한 Goroutine을 찾아서 실행하고 실행이 끝난 Goroutine은 큐에서 제거함. 큐에서 실행 가능한 Goroutine을 찾지 못할 경우 다른 코어의 큐에서 Goroutine을 훔쳐옴(?!) 이를 work-stealing 스케줄링 방식이라고 함.
[출처]
https://rakyll.org/scheduler/
https://github.com/golang/go/blob/master/src/runtime/proc.go