반응형
고루틴(goroutine)
- Go 언어에서 제공하는 경량 스레드
- 동시성과 병행성을 쉽게 구현할 수 있도록 설계된 기능으로, Go 언어의 주요 특징 중 하나
- 운영 체제의 스레드보다 훨씬 가볍고, 더 적은 메모리로 많은 고루틴을 실행할 수 있다.
- 고루틴의 초기 스택 크기
- 작은 초기 스택 크기: Go 1.4 이후의 고루틴은 약 2KB의 초기 스택 크기를 가지고 시작한다.
- 스택 크기 조절: 고루틴이 더 많은 스택 공간을 필요로 하면 자동으로 스택이 확장되며, 필요하지 않으면 축소한다.
- 사용자 수준 스케줄링
- M스케줄링 모델 : Go 런타임은 많은 수의 고루틴을 소수의 운영 체제 스레드에 매핑하는 M스케줄링 모델을 사용한다
- 경량 컨텍스트 스위칭: 고루틴 간의 컨텍스트 스위칭은 운영 체제의 스레드 간 컨텍스트 스위칭보다 훨씬 가볍다.
- 고루틴의 스케줄링
- 효율적인 스케줄링: Go 런타임의 스케줄러는 고루틴을 효율적으로 관리하여 블로킹된 고루틴이 있을 때 다른 고루틴이 실행될 수 있도록 한다
- 비선점형 스케줄링: Go의 스케줄러는 주기적으로 각 고루틴이 자발적으로 양보하거나 함수 호출 시 스케줄링 포인트에서 실행을 양보하도록 설계되어있다
- 메모리 풀링과 관리
- 메모리 풀링: Go 런타임은 메모리 할당 및 해제를 효율적으로 관리하기 위해 메모리 풀링을 사용한다. 이는 고루틴 생성과 삭제 시 발생하는 메모리 오버헤드를 줄이는 데 도움이 된다
- 가비지 컬렉션: Go는 가비지 컬렉터(GC)를 사용하여 동적으로 할당된 메모리를 관리한다. GC는 메모리를 자동으로 회수하여 메모리 누수를 방지하고, 메모리 사용량을 최적화한다.
- 고루틴의 실행 모델
- 비동기 I/O: Go는 비동기 I/O 작업을 고루틴으로 처리하여 스레드 블로킹을 최소화한다. 이는 많은 고루틴이 동시에 실행될 때도 메모리를 효율적으로 사용할 수 있게 한다.
- 고루틴의 초기 스택 크기
고루틴과 스레드 비교
- 고루틴
- 위의 코드는 10000개의 고루틴을 생성한다. 각 고루틴은 매우 작은 메모리로 시작하고, 비동기적으로 실행된다.
package main import ( "fmt" "time" ) func worker(id int) { fmt.Printf("Worker %d starting\\n", id) time.Sleep(time.Second) fmt.Printf("Worker %d done\\n", id) } func main() { for i := 0; i < 10000; i++ { go worker(i) } time.Sleep(2 * time.Second) }
- Java
- 이 코드는 10000개의 스레드를 생성한다. 각 스레드는 몇 MB의 초기 스택 크기로 시작하므로, 메모리 사용량이 급격히 증가한다.
public class Main { public static void main(String[] args) { for (int i = 0; i < 10000; i++) { new Thread(new Worker(i)).start(); } } } class Worker implements Runnable { private int id; Worker(int id) { this.id = id; } @Override public void run() { System.out.println("Worker " + id + " starting"); try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } System.out.println("Worker " + id + " done"); } }
반응형
LIST
'언어 > GO' 카테고리의 다른 글
Go의 Context (1) | 2024.06.30 |
---|---|
Go 포인터 정리 (0) | 2024.06.29 |