3DS에서 AsyncIO Executor를 Rust로 구현하여 멀티태스킹 문제를 해결하다!

by DD
1주 전
조회수 2

3DS의 비선점형 멀티태스킹(Non-Preemptive Multitasking) 환경에서 AsyncIO Executor 구현의 필요성을 제기함

Rust를 사용하여 AsyncIO Executor를 구축하고, `Future`와 `Executor`의 기본 개념을 설명함

WakerExecutor를 활용하여 비동기 작업의 실행 흐름을 제어하는 방법을 제시함

3DS 환경에서의 구현 세부 사항(Implementation Details)은 다음 파트에서 다룰 예정

3DS 멀티태스킹의 문제점과 AsyncIO의 필요성

3DS는 비선점형 멀티태스킹(Non-Preemptive Multitasking)을 사용하므로, 하나의 스레드가 CPU를 독점하면 다른 작업이 실행되지 않는 문제가 발생한다. 이러한 문제를 해결하기 위해 저자는 AsyncIO Executor를 구현하여, 각 작업을 작은 단위로 나누어 실행하고, 작업 간의 전환을 관리한다. 이를 통해 3DS 환경에서도 부드러운 멀티태스킹(Smooth Multitasking)을 가능하게 한다.

Rust 기반 AsyncIO Executor 구현

저자는 Rust를 사용하여 AsyncIO Executor를 구현하며, `Future`와 `Executor`의 핵심 개념을 설명한다. `Future`는 비동기 작업의 결과를 나타내며, `Executor`는 이러한 `Future`를 관리하고 실행하는 역할을 한다. 특히, `Sleep` 구조체를 예시로 들어, `Future`의 `poll` 함수를 구현하는 방법을 보여준다. 구체적인 구현 코드는 본문에 포함되지 않았다.

Waker와 Executor를 활용한 비동기 작업 제어

Rust의 WakerExecutor를 사용하여 비동기 작업의 실행 흐름을 제어한다. Waker는 Executor에게 특정 작업을 다시 실행하도록 요청하는 역할을 하며, Executor는 Waker의 요청에 따라 작업을 실행한다. 저자는 `TaskWaker` 구조체를 통해 Waker를 구현하고, `Executor`의 `poll_task` 함수를 통해 작업을 실행하는 과정을 설명한다. 이를 통해 CPU 자원을 효율적으로 사용하고, 3DS 환경의 제약 사항을 극복한다.

최소 실행 가능 Executor의 구조

저자는 최소 실행 가능(Minimum Viable) Executor의 구조를 제시하며, `Executor`, `Task`, `TaskWaker` 등의 구조체를 정의한다. `Executor`는 작업 큐(Task Queue)를 관리하고, `Task`는 실행할 비동기 작업을 나타내며, `TaskWaker`는 Executor에게 작업을 다시 실행하도록 요청하는 역할을 한다. 이러한 구조를 통해 3DS 환경에서 비동기 작업을 효율적으로 관리하고 실행할 수 있다.

Building an AsyncIO executor for the 3DS