카테고리 없음
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;
});
- timer가 생성되면서 만료 시각이 heap에 등록됨.
- io_context.run()이 실행되면,
- 내부적으로 가장 이른 타이머를 추적해서,
- 시간이 되면 해당 콜백을 호출해줌.
⏱️ 정확성
- 정밀한 타이머가 필요할 때 사용하기 좋음
- 내부적으로는 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는 "몇 초 후 특정 작업 실행" 같은 단발성 타이머에 적합하고,
게임 오브젝트의 반복 갱신 같은 작업에는 커스텀 타임휠 구조를 사용하는 것이 좋음.