OS가 스레드 동시성을 보장하듯이 스케줄러는 비동기작업의 동시성을 보장함


그럼 병렬성은 어떻게 달성하느냐?


프로그램 스케줄러가 내부 판단하에 스레드를 생성하게 되면은 OS 스케줄러가 내부 판단 하에 스레드를 물리적 스레드와 병렬적으로 매칭했을 경우에만 병렬성이 달성됨.


즉 스케줄러가 단일스레드여도 병렬성은 안되고, 스레드를 생성해도 os 스케줄러가 단일코어로 작업시키면 병렬성은 달성이 안됨. 근데 중요한 것은 병렬성을 프로그래머가 판단해서 이래라 저래라 할 게 아니라는거임. 걍 병렬성은 생각 안하고 코드는 원래 하던대로 동시성만 고려하며 비동기적으로 짜면 됨.


프로그램 스케줄러가 무조건 스레드를 생성하지 않는 이유는, 스레드는 생성과 유지에 비용이 크고, 대부분의 경우 단일스레드로 처리할 때가 빠르기 때문임.


예) GO 언어의 고루틴 스케줄러는 대부분 단일스레드를 사용하지만 경우에 따라 멀티스레드를 사용한다.

고언어는 runtime.GOMAXPROCS 함수를 통해 고루틴이 생설할 수 있는 최대 스레드의 개수를 정할 수 있고, 기본값으로는 물리적 스레드(코어)의 개수로 설정되어 있다.