Go루틴은 고에서 concurrency(동시성)을 다루기 위한 도구이다.
concurrency에 대한 설명은 parallelism과의 차이를 통해 설명하는게 이해에 가장 좋은듯 하다.
Concurrency VS Parallelism
비유적 표현으로 설명하자면 한 광대가 "저글링 돌리기 => 훌라후프 10개 하기 => 공 타기" 순차적으로 관객에게 보여주면 concurrency이고 "저글링을 돌리면서 훌라후프 10개를 하면서 공 타기"를 동시에 하면 Parallelism이다.
그럼 Go루틴은 왜 Concurrency일까? 이를 이해하기 위해선 Go루틴이 어떤 구조로 동작하는지 살펴볼 필요가 있다.
How Go routine work
- G = Goroutine
- M = OS Thread
- P = Processor
프로세스의 수는 컴퓨터의 cpu 수다.
하나의 프로세스 내부에 생성된 쓰레드에 Go루틴이 맵핑되어 동작한다. 여기서 각각의 쓰레드가 동시에 수행되는 것이 아닌 하나의 쓰레드에서만 Go루틴을 수행하고 나머지는 대기한다. 만약 동작중인 Go루틴에서 I/O 요청과 같은 일로 block 상태에 빠지면 다른 쓰레드에 있는 Go루틴이 실행된다.
==> 하나의 프로세스에서 하나의 Go루틴만 실행된다.
프로세스가 여러개면 여러개의 Go루틴이 수행되는건 당연한것 같다. 부가적으로 동작방식에 더 자세히 알고 싶다면 밑의 기사를 읽어보자!! 어렵지 않고 나보다 설명을 잘해준다...
https://betterprogramming.pub/deep-dive-into-concurrency-of-go-93002344d37b
A Deep Dive Into Go Concurrency
The strongest programming language in terms of concurrency
betterprogramming.pub
그래도 조금 요약하자면
1. Go루틴은 OS 쓰레드에 비해 생성 삭제에 굉장히 적은 비용이 든다. 쓰레드는 다른 쓰레드와의 분리를 위해 많은 메모리가 필요로 하지만 Go루틴은 쓰레드가 독자적으로 할당받은 stack 내부에서 2KB만 사용하기 때문에 비용적으로 훨씬 좋다.
2. 프로세스의 local queue에 할당된 Go루틴이 없다면 여러 방법을 통해 Go루틴을 뺏어온다...
등이 있다.
결국 GO에서는 생성, 삭제, context switching 비용이 높은 OS Thread를 이용해 concurency나 Parallelism을 제공하지 않고 OS Thread 내부에서 동작하는 경량화된 쓰레드 Go루틴을 통해 Concurrency를 제공한다. 그래서 빠르고 강력하다!
추가 참고:
https://osmh.dev/posts/goroutines-under-the-hood
Goroutines Under The Hood - Blog by Osamh aloqaily
Introduction Go has been around since 2012, developers are starting to recognize how powerful it is and are slowly transitioning to developing their projects with Go. It’s becoming extremely popular in “modern enterprises” for many reasons, one of wh
osmh.dev
'IT 일기 > GO' 카테고리의 다른 글
Go 컨텍스트란? Cancle, Deadline, Timeout, Value (0) | 2023.04.03 |
---|---|
Go 채널이란? (0) | 2023.04.02 |
Go Slice 사용법, 구조 그리고 append() 원리까지 Deep Dive (0) | 2023.03.29 |
Understand SOLID in Go (0) | 2023.03.24 |
vscode Terminal 설정 변경 (Go에서 sqlite3 사용하기) (0) | 2023.03.23 |