1 분 소요


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가 컨텍스트 전환을 하지 않고,
프로세스가 여러 응용프로그램을 동시에 실행할 수 있도록 일정 시간 주기나 유휴 상태이거나,
논리적으로 차단될 때 자발적으로 컨트롤을 양보하는 방식입니다.


그림 1. M:P:N 쓰레딩.


분산 스케줄러는, 고루틴 폴(poll) 순서에서 유휴 쓰레드가 작업 스틸링(stealing)하여 성능을 개선했습니다.




참고자료

Gloang Scheduling

Common

그림 2. big o notation.

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

댓글남기기