Golang 스케줄러 Part.0 - 소개
Go scheduler: Implementing language with lightweight concurrency(by Dmitry Vyukov)
영상을 참고하여 작성했습니다.
Golang을 사용하여 멀티쓰레드 소프트웨어(Multi-threaded software)를 설계하기 위해서는
OS 와 Go 스케줄러에 대한 이해가 중요합니다.
Go 언어는 동시성(Concurrency) 지원이 내장되어 있고,
동시성의 기본 요소는 고루틴입니다.
논리적으로 고루틴은 실행하는 쓰레드로 비슷한 요소는:
- OS 쓰레드
- 코루틴(coroutine)
- 그린 쓰레드(Green Thread)
JVM(자바 가상 머신)이 관리하는 쓰레드입니다.
Go 스펙
요구사항과 제한사항
-
프로세서당 백만 개도 실행할 수 있는 고루틴
고루틴을 쓰레드당 하나만 사용할 수도 있지만, 쓰레드는 비용이 크기 때문에
많은 고루틴을 실행하기 위해서는 다른 설계가 필요했습니다.다음은 대표적인 쓰레드 비용입니다:
- 메모리
쓰레드는 최소 32KB 이상의 메모리가 필요합니다. (사용자 스택, 커널 스택, 커널 디스크립터 등) - 성능(syscalls)
고루틴을 생성하거나, 동기화를 위해 시스템 콜을 사용 - 스택 사이즈 제한
쓰레드 풀을 적용해도 고루틴을 만들 때만 빨랐고,
쓰레드 비용은 여전히 발생했습니다. - 메모리
- 병렬 실행, 확장성(parallel and scalable)
- 최소한의 API
- 무한한 스택(Stack)
- IO 핸들링, syscalls, C calls
스케줄러(Scheduler)
M:P:N 스케줄러
고루틴의 아이디어는 코루틴을 쓰레드 셋으로 다중화
(multiplex independently executing functions—coroutines—onto a set of threads) 한 것입니다.
코루틴(Coroutine) 이란:
실행을 일시 중단하고 다시 시작할 수 있어, 서브루틴이 비선점 멀티태스킹(non-preemptive multitasking)
할 수 있도록 만든 컴퓨터 프로그램 구성요소입니다.선점형 스케줄러(Preemptive Scheduler) 란:
OS가 나중에 작업을 재개할 의도로 수행 중인 작업을 중단하고 실행 대기열에 뒤에 추가한 후
다른 작업을 실행하는 방식입니다.협력형 스케줄러(Cooperating Scheduler) 란:
비선점형(Non-preemptive)라고도 불리며, OS가 컨텍스트 전환을 하지 않고,
프로세스가 여러 응용프로그램을 동시에 실행할 수 있도록 일정 시간 주기나 유휴 상태이거나,
논리적으로 차단될 때 자발적으로 컨트롤을 양보하는 방식입니다.
분산 스케줄러는, 고루틴 폴(poll) 순서에서 유휴 쓰레드가 작업 스틸링(stealing)하여 성능을 개선했습니다.
참고자료
Gloang Scheduling
- Dmitry Vyukov — Go scheduler: Implementing language with lightweight concurrency
- Scheduling In Go : Part I - OS Scheduler
- Scheduling In Go : Part II - Go Scheduler
- Scheduling In Go : Part III - Concurrency
- Introduction 2016 NUMA Deep Dive Series
- Go FAQ - Why goroutines instead of threads?
… to multiplex independently executing functions—coroutines—onto a set of threads - Work Stealing
Common
notation | description |
---|---|
O(1) | constant time |
O(log n) | log time |
O(n) | linear time |
O(n log n) | log linear time |
O(n2) | quadratic time |
O(n3) | cubic time |
O(2n) | exponential time |
댓글남기기