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