이건 얼마 전에 혼자 고민하다 나름대로 내놓은 결과임.
러스트의 Tokio가 어떻게 구현될까 생각을 좀 해봤음.
회사에서 싱글스레드 - 비동기 런타임을 러스트로 구현한다는 목표가 문서 어딘가 있었거든.
우선 Worker 스레드가 하나 필요함.
Worker 스레드에서는 각종 유저의 Task가 실행되는 스레드임.
IO 스레드가 하나 필요함.
epoll이든 select든 iocp든 여러 소켓의 Recv를 처리할 하나의 IO스레드가 필요함. 여기서 IO 이벤트가 발생하면 Task 대기 큐에서 Task를 꺼내서 워커스레드에서 진행시켜야 함.
Timer 스레드가 하나 필요함.
비동기로 코드를 짤 때 자주 쓰는 것이 Delay따위의 시간을 두고 다시 흐름을 진행시키는데, 이런 일정 시간 뒤에 Task를 대기 큐에서 꺼내서 워커 스레드로 보내는 작업을 하는 역할을 함.
... 여서 온전히 싱글 스레드만으로는 비동기 런타임을 구현하지 못 하겠다는 생각에 도달했음.
고수분들의 코멘트 부탁
스레드 하나에서 워커 IO 타이머 다 관리하고 스케줄링 하는데 뭐하러 나눔?
비동기를 너무 고급기능부터 생각할 필요가 없음 그냥 유저레벨 루틴(함수)를 선점스케줄링하면 비동기 구현은 거의 다 만든거임
일단 스케줄러를 만들고 나서 성능향상을 위해 Worker IO Timer 스레드를 만들고 스케줄러가 작업을 잘 할당하도록 만드는거지
그렇게 스레드 3개로 나눠놨는데한 특정 스레드로 작업이 몰려서 성능향상이 없으면 스레드풀을 만들어놓고 여러 스레드를 그 작업에 할당하는거지 IO처리가 많으면 IO스레드를 늘리는 식으로
오 비동기 이글보고 이해햇습니다 - dc App
농담아니라 ㅇㅇ가 설명한게 우리학교 운영체제 교수님보다 난듯 - dc App
헷갈렸다 선점스케줄링이 아니라 비선점스케줄링이었네 선점이면 멀티스레딩이랑 차이가 없지
빡대갈이라 그런데 왜 유저레벨 함수를 비선점 스케줄링한게 비동기 구현임??
이벤트 드리븐으루 하려고 해도 내부에선 타이머로 구현댐?? - dc App
대부분 비동기 구현은 유저입장에서 루틴이 끝나거나 IO, Timer에 대기하기 전까진 계속 실행됨 반면 멀티스레딩은 OS가 강제로 컨텍스트 스위칭 시켜서 대기를 하지 않아도 교대로 실행시킴
이벤트는 구현체에 따라서 다른데 결국 이벤트가 발생하더라도 현재 실행중인 루틴이 멈추기 전까진 핸들러가 실행이 안댐 근데 스레드를 여러개 만들면 루틴 하나가 CPU 갈구는 작업으로 오래 붙잡고 있어도 나머지 스레드에서 이벤트 처리를 하겠지
물론 비선점에 우선순위까지 넣어서 강제로 우선순위가 낮은 루틴을 일시정지 시키는 비동기 구현체 같은것도 있을거 같은데 어쨌든 OS 스레드 스케줄링처럼 실행시간을 공평하게 분배하려는 목적은 아닐거임
맞워요 주로 그렇게 짜죠. Redis 나 libuv 같은거 소스보샘
고루틴이나 토키오 둘다 워크 스틸링 방식임