15. 코루틴/파이버 기반 동시성: 스택풀 vs 스택리스, 유저모드 스케줄링
난이도 상 해설 보기 →
문제
문제 15 — 코루틴/파이버 기반 동시성: 스택풀 vs 스택리스, 유저모드 스케줄링
면접 질문
-
코루틴(coroutine) 이란 무엇인가? OS 스레드와 비교했을 때 "누가 스케줄링하는가"(커널 vs 유저모드), "컨텍스트 전환 비용", "메모리 사용량"이 어떻게 다른지 설명하라.
-
스택풀(stackful) 코루틴(예:
boost::context, 파이버(fiber), Lua 코루틴)과 스택리스(stackless) 코루틴(예: C#async/await, C++20co_await상태머신)의 구조적 차이를 설명하라. 각각 "임의의 깊이에서 양보(yield)할 수 있는가?", "호출 스택을 통째로 보존하는가?"의 관점에서 답하라. -
코루틴이 "협조적(cooperative) 스케줄링"이라는 말의 의미는 무엇인가? 이것이 왜 락 없이도 데이터 레이스를 피할 수 있게 해주는지, 그리고 어떤 대가(하나가 안 양보하면?)가 따르는지 설명하라.
응용 시나리오
게임서버의 몬스터 AI 로직을 원래는 상태 머신(state machine)으로 짰는데, 로직이 복잡해지면서(순찰 → 대기 → 추적 → 공격 → 복귀) 콜백이 중첩되어 가독성이 나빠졌다. 팀에서 "파이버 기반 코루틴으로 AI를 순차적인 코드처럼 짜자"는 제안이 나왔다.
// 코루틴으로 표현한 AI (의사코드)
void MonsterAI(Fiber& self) {
while (true) {
Patrol();
self.yield(); // (A) 한 틱 양보
if (SeePlayer()) {
while (!InAttackRange()) {
MoveTowardPlayer();
self.yield(); // (A) 한 틱 양보
}
Attack();
self.yield();
}
}
}
- 이 방식이 콜백 기반 상태 머신보다 코드 가독성 면에서 어떤 이점을 주는지 설명하라.
self.yield()가 호출되는 지점(A)에서 내부적으로 무슨 일이 일어나는지(스택 보존/복원 관점) 설명하라. - 몬스터 수천 마리를 동시에 이 방식으로 돌린다면, "스레드 수천 개"와 비교해 메모리·컨텍스트 전환 비용이 왜 훨씬 싼지 설명하라.
- 이 코루틴들을 여러 워커 스레드에 분산해서 돌리려 한다면(예: 몬스터를 스레드풀에 N분의 1씩 배정), 무엇을 추가로 신경 써야 하는가(공유 월드 데이터 접근, 코루틴 자체의 스레드 어피니티)?
- C#에서 같은 AI 패턴을 구현한다면
IEnumerator/yield return기반 코루틴(스택리스)과async/await는 각각 어떤 한계가 있는지 비교하라.
답안 작성
내 답안 · 자동 저장
직접 답을 작성한 뒤, 위 해설 보기에서 모범답안과 대조하세요.