24.1 스레드란?


고루틴은 경량 스레드로 함수나 명령을 동시에 실행할 때 사용된다. 프로그램 시작점인 main() 함수 역시 고루틴에 의해 실행된다. 한 번에 한 프로세스만 동작시키는 것을 싱글태스킹이라고 하고 동시에 여러개를 실행시키는 것을 멀티태스킹이라고 한다.

프로세스는 메모리 공간에 로딩되어 동작하는 프로그램을 말한다. 프로세스는 스레드를 한 개 이상 가지고 있고, 하나면 싱글 스레드, 여럿이면 멀티 스레드 프로세스라고 한다. 스레드는 프로세스 안의 세부 작업 단위다.

CPU 코어가 스레드를 빠르게 전환해가면서 수행하면 사용자는 마치 동시에 수행하는 것처럼 보이게 된다.

24.1.1 컨텍스트 스위치 비용


CPU가 여러 스레드를 전환하면서 수행하면 더 많은 비용이 든다. 이것을 컨텍스트 스위칭 비용이라고 한다. 스레드를 전환하려면 현재 상태를 보관해야 한다. 그래야 스레드를 다시 전환하고 돌아왔을 때 마지막 실행항 상태에서 이어 실행할 수 있기 때문이다.

이때 스레드의 명령 포인터, 스택 메모리 등의 정보를 저장하게 되는데 이를 스레드 컨텍스트 라고 한다. 컨텍스트는 우리말로 문맥이라고 한다.

스레드가 전환될 때마다 스레드 컨텍스트를 저장하고 복원하기 때문에 스레드 전환 비용이 들게 된다. 적정 개수를 넘어 한 번에 너무 많은 스레드를 수행하면 성능저하가 생긴다.

하지만 GO의 경우 CPU 코어마다 OS 스레드 하나만을 할당해서 사용하기 때문에 비용이 들지 않는다.

24.2 고루틴 사용


고루틴 추가 생성 구문은 다음과 같다.

go 함수

go 키워드를 쓰고 함수를 호출하면 해당 함수를 수행하는 새로운 고루틴을 생성한다. 호출된 함수는 현재 고루틴이 아닌 새로운 고루틴에서 수행된다.