카테고리 없음

boost asio timer

denny 2025. 4. 8. 15:25

Boost.Asio의 timer는 일반적으로 타이머 기반 비동기 작업을 처리할 때 사용되고, 내부적으로는 heap 기반의 priority queue 스타일 구조로 구현돼 있어. 이는 Time Wheel과는 다르게, 정확성 위주로 동작하는 구조야.


🧠 Boost.Asio의 타이머는 어떻게 동작하나?

✅ 기본 구조 요약

  • boost::asio::steady_timer, deadline_timer, high_resolution_timer 등이 있음
  • 내부적으로는 **비동기 이벤트 루프(io_context)**와 연결되어 동작함
  • 타이머는 설정된 시간이 지나면 io_context에 callback을 post
  • io_context는 자체적으로 등록된 타이머들을 **우선순위 큐(min-heap)**에 보관하고, 가장 빨리 만료될 타이머를 우선 실행함

📦 핵심 구성 요소 (정리)

구성 요소 설명

io_context 모든 비동기 작업의 중심, 타이머도 여기 등록됨
steady_timer 일정 시간 후 동작을 예약할 수 있음
타이머 큐 내부에 min-heap 형태로 동작하는 타이머 큐 존재
reactor OS 레벨 타이머/이벤트 처리와 연동됨 (epoll, kqueue 등)

📜 동작 흐름 요약

boost::asio::steady_timer timer(io_context, std::chrono::seconds(5));
timer.async_wait([](const boost::system::error_code& ec) {
    std::cout << "Timer expired!" << std::endl;
});
  1. timer가 생성되면서 만료 시각이 heap에 등록됨.
  2. io_context.run()이 실행되면,
  3. 내부적으로 가장 이른 타이머를 추적해서,
  4. 시간이 되면 해당 콜백을 호출해줌.

⏱️ 정확성

  • 정밀한 타이머가 필요할 때 사용하기 좋음
  • 내부적으로는 OS의 고정밀 타이머나 std::chrono를 기반으로 정확한 시각 비교를 함
  • 오차 범위는 steady_clock의 정밀도에 따라 다름

📦 내부 구현 참고

소스코드 참고:

  • boost::asio::detail::deadline_timer_service
  • 내부적으로 timer_queue라는 구조를 유지하며 heap 형태로 관리함
  • 커널 타이머와 연동되기도 하고, 시스템 타이머에 의존하는 경우도 있음

✅ Time Wheel과 비교

항목 Boost.Asio 타이머 Time Wheel

정밀도 높음 (밀리초 단위) 틱 간격에 의존 (대충 수ms~수십ms)
구조 Min-Heap 기반 원형 슬롯 큐
오브젝트 수에 따른 성능 오브젝트 수가 많아지면 느려짐 (O(logN)) 오브젝트 수에 거의 영향 없음 (O(1))
유스케이스 소켓 타임아웃, HTTP 타이머 등 MMORPG, 게임서버 업데이트 간격

🧪 결론

  • Boost.Asio 타이머는 정밀하고 안정적이지만, 대량의 오브젝트에 주기적으로 사용하는 데는 부적합해.
  • MMORPG 서버에서 수천 개 오브젝트를 주기적으로 갱신할 경우엔 Time Wheel이 성능적으로 훨씬 효율적.
  • Boost.Asio는 "몇 초 후 특정 작업 실행" 같은 단발성 타이머에 적합하고,
    게임 오브젝트의 반복 갱신 같은 작업에는 커스텀 타임휠 구조를 사용하는 것이 좋음.