운영체제의 물리적 프로세서, 쓰레드와 go 런타임의 논리적 프로세서, 고루틴으로 나뉘어져 있음.
논리적 프로세서는 하나의 운영체제 쓰레드에 개별적으로 바인딩됨
Go 1.5부터는 코어 갯수만큼 논리 프로세서를 생성하고, 그 이전에는 기본적으로 하나의 논리 프로세서만 할당
하나의 논리적 프로세서도 수많은 고루틴을 동시적으로 실행 가능
운영체제 쓰레드 - 논리적 프로세서 - local run queue - global run queue - Go 런타임 스케쥴러
system call이 발생하면 해당 쓰레드랑 고루틴을 묶어서 논리프로세서에서 떼어낸 다음 해당 쓰레드가 system call이 완료되는걸 기다리게끔 만듬. 그리고 논리프로세서에는 새로운 쓰레드와 고루틴을 투입하고 system call이 완료되면 고루틴을 local run queue로 다시 이동, 쓰레드는 다시 사용할 것을 대비해서 풀링.
네트워크 io가 발생하면 고루틴만 분리해서 netpoller로 이동. netpoller가 io 준비 완료를 알리면 다시 고루틴을 논리 프로세서에 할당해서 작업 수행.