비동기, 병렬성, 동시성은 전부 다른거임

동시성은 동시에 실행되는 것처럼 보이는 것임. 그래서 실제로 동시이냐 아니냐는 중요하지 않음.

병렬성은 실제로 동시에 실행하는 거임. 멀티코어 환경을 말함.

비동기는 순서대로 처리하는 것이 아니라 나눠서 처리하는 거임. 비동기를 통해 동시성을 달성할 수 있고, 싱글코어에서도 가능함.

스레드는 운영체제가 관리하는 비동기 작업임. 메모리 공유하는 멀티프로세스랑 비슷한 개념이라고 생각하면 됨. 운영체제가 싱글코어든 멀티고어든 알아서 처리한다.

비동기는 실행자(스케줄러)가 필요함. 일을 어떻게 실행하다가 중단시킬 것이고, 순서는 어떻게 할 것이고, 병렬성도 알아서 달성시켜줌.

결론: 비동기 프로그래밍을 공부하고, 좋은 스케줄러만 고르면 동시성 달성은 어렵지 않다.



싱글코어에서 비동기가 필요한 이유

os가 멀티태스킹을 하는 이유랑 같음

싱글코어 cpu로도 메모장도 열고, 브라우저도 열고, 이것저것 동시에 키고 싶을 거임.

실제로 동시냐 아니냐는 중요하지 않음. 시피유에 따라 실제로 동시일수도 있고 아닐 수도 있지

중요한건 사용자 경험이 쾌적하다는 거임. 브라우저가 페이지 로딩중일 동안 다른 작업도 가능하지.

마찬가지임. 너가 프로그램을 짜도 비동기로 짜야지 사용자 경험성이 올라감.

게다가 싱글코어에서 연산작업은 비동기로 처리한다고 더 빨라지지 않겠지만, i/o 파일시스템 또는 통신에서는 비동기 처리가 실제 처리속도를 높여줌. 연산작업이라고 하더라도 싱글코어에서 os로부터 계산 점유율을 높여서 빨라질 수 있고, 연산작업에 블럭되지 않으니 사용자와의 상호작용을 계속 열어둘 수 있음. 게다가 멀티코어환경에서는 비동기로 짠 코드가 병렬성덕분에 빨라질 수도 있으니 비동기는 좋은 수단임.



비동기는 동시성을 보장하지 반드시 단일스레드로 작동한다는 것이 아님

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

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

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

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

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