문제

나는 코 루틴을 기본으로 사용하고 장난감 스케줄러를 구현하는 것에 대한 기본 사항을 알고 있습니다. 그러나 나는 그것이 비동기 스케줄러 전체에 대한 과도하게 단순화 된 것으로 가정합니다. 내 생각에는 전체 구멍이 없습니다.

CPU가 유휴/대기중인 스케줄러를 실행하지 않도록하는 방법은 무엇입니까? 일부 섬유는 방금 잠을 자고 다른 섬유는 운영 체제의 입력을 기다립니다.

도움이 되었습니까?

해결책

IO 작업을 이벤트 기반 인터페이스 (선택/폴링)로 멀티 플렉스해야하므로 OS를 활용하여 대기를 수행하면서 다른 섬유를 예약 할 수 있습니다. Select/Poll에는 시간 초과 인증이 있습니다. 수면을 원하는 섬유의 경우 해당 선택/폴링 옵션을 사용하여 수면 통화를 모방하는 우선 순위 큐를 만들 수 있습니다.

차단 작업을 수행하는 섬유를 제공하려고합니다 (읽기/쓰기/수면 등). 각 섬유를 기본 스레드에서 예약하지 않으면 직접 작동하지 않습니다.

보다 http://swtch.com/libtask/ 작업 구현을 위해.

다른 팁

SetContext 함수 제품군을 살펴 봐야 할 것입니다 (http://en.wikipedia.org/wiki/setcontext). 이는 응용 프로그램 내에서 차단 (읽기, 쓰기, 수면 등)을 비동기 형태로 차단하고 스케줄러로 돌아갈 수있는 모든 기능을 재 구현해야한다는 것을 의미합니다.

"스케줄러 파이버"만 Select (), poll () 또는 epoll ()을 사용하여 완료 이벤트를 기다릴 수 있습니다. 즉, 스케줄러가 유휴 상태 일 때 프로세스가 Select/Poll/Epoll 호출에서 자고 CPU를 차지하지 않습니다.

대답하기가 조금 늦었지만 C에서는 C에서 섬유 라이브러리를 실질적으로 구현하고 있다고 언급하고 싶습니다. Libevfibers.

젊은 프로젝트에도 불구하고 생산에 사용됩니다. 소켓을 읽거나 쓰는 것과 같은 고전적인 비동기 작업에 대한 솔루션을 제공 할뿐만 아니라 파일 시스템 IO를 비 블로킹 방식으로 처리합니다. 이 프로젝트는 Libcoro, Libev 및 Libeio의 3 가지 훌륭한 라이브러리를 활용합니다.

코 루틴을 사용하여 ControlFlow를 제어 할 수 있습니다. 그 창조를 지원하는 도서관은 boost.asio입니다.

좋은 예는 다음과 같습니다. 강렬한 코 루틴을 향상시킵니다

구현 관점에서 비동기 이벤트 루프 구현으로 시작할 수 있습니다. 그런 다음 비동기 이벤트 핸들러를 사용하여 해당 섬유로 전환하여 섬유 스케줄링을 구현할 수 있습니다.

수면/대기 섬유는 현재 예약되지 않았 음을 의미합니다. 대신 이벤트 루프로 전환됩니다.

BTW, 실제 코드를 찾고 있다면 http://svn.cmeerw.net/src/nginetd/trunk/ 이는 여전히 진행 중이지만 멀티 스레드 이벤트 루프 위에 파이버 스케줄러를 구현하려고 시도합니다 (Win32 I/O 완료 포트 또는 Linux의 에지 트리거 로폴).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top