Golang - 특징

1 분 소요

Go Routine VS Thread

  1. 메모리 소비
    • 일반적인 쓰레드를 사용하려면 약 1MB가 필요하다. guard page(쓰레드간 메모리 범람 방지)까지 포함해서
    • 고루틴은 오직 스택 메모리 영역에 2KB정도만 있으면 된다.
    • 다른 서버로의 요청 1개 당 하나의 쓰레드로 관리한다면 분명 out of memory error가 발생할 것이다.
    • 많은 쓰레드를 만들어낼수록 하나의 프로세스 자원에서 힙영역이 줄어들게 된다.
  2. 생성과 철거
    • 쓰레드는 os로부터 리소스를 요청하고 반납해야한다.
    • 그러나 고루틴은 런타임 동안에 생성되고 철거된다. 따라서 os는 고루틴이 생성되고 철거하는 일련의 과정을 모른다. (고루틴의 존재조차 모른다.)
    • 고루틴은 런타임에 의해서 관리된다. (os가 아닌) 그래서 특정 고루틴이 Blocking되면 해당 고루틴이 올라간 os스레드가 Blocking되는 영향을 주는게 아니라 런타임이 대신에 다른 고루틴으로 스케쥴링하기 때문에 이는 리소스 자원 낭비가 아니다.
    • 단순히 처음 runtime.GOMAXPROCS(n) 을 통해 사용할 프로세서의 수를 결정하여 os에게 요청하면 된다.
  3. Context Switching
    • 일반 스레드와 비교했을 때 Context Switching할 때 저장하고 복구하는 데이터의 양이 훨씬 적다.
    • → Context Switching비용이 비교적 굉장히 작다.
  4. 고루틴은 다중화(multiplexed)된 스레드 모델
    • 여러 개의 os쓰레드 위에서 여러개의 고루틴이 돌아간다.

메모리 공유의 문제 → 채널

  • 멀티 쓰레드 프로그램을 짜면 항상 동시에 값을 변경하게 되는 공유 메모리 자원이 존재한다.
  • 보통은 뮤텍스로 락을 걸고 해제하는 방식의 동기화작업을 하는데
  • 고루틴에선 채널을 이용하면 된다.

Go 의 특징

  • 컴파일 속도가 매우 빠르다. 마치 인터프리터 언어만큼
  • 도커 이미지가 매우 가볍다.
  • 같은 기능을 구현하여 돌렸을 때 cpu, memory 점유율이 매우 적다.
  • spring webflux보다 동시성 프로그래밍 하기에 좀 더 적합 ??
  • gc가 일어날 때 stw시간이 거의 없을 정도로 짧다.
  • 고성능의 network io를 위해 비동기처리를 고민할 필요 없이 고루틴을 띄워서 동기io를 사용해도 성능이 충분히 나온다.
  • heap기반의 메모리할당밖에 없는 java와 달리 stack, heap 할당을 쓰기 때문에 gc 오버헤드가 적다.
  • 가상머신(jvm) 위에서 실행되는 것이 아니라 go는 빌드된 것이 네이티브 바이너리 형식이라 어디서든 실행될 수 있다. (당연히 golang이 안깔려있어도 된다.)
  • 문법이 쉽다. 예약어가 25개밖에 안된다.
  • 컴파일 속도가 타언어에 비해 매우 빠르다. java는 maven, gradle이라는 빌드툴을 사용해서 뽑아내는데 go에선 그런거 필요없이 자체적으로 바이너리 파일로 빌드해낸다. 거의 인터프리터 언어만큼의 효율이 나온다.
  • go는 함수형 프로그래밍 언어이지만 구조체 struct 를 통해 객체지향 코드(duck typing)을 구현할 수 있다.
  • https://www.s-core.co.kr/insight/view/물어보는-사람이-많아서-정리했습니다-go언어/
  • https://covenant.tistory.com/204?category=727168

카테고리:

업데이트:

댓글남기기