QNX RTOS: 8-6. Kernel Timeouts
2026. 1. 2. 16:52ㆍ운영체제/QNX
1. Kernel Timeout이 필요한 이유
QNX의 IPC(Message Passing)는 매우 강력하지만, 다음과 같은 상황이 문제를 만든다.
- 클라이언트가 MsgSend()를 호출했는데
- 서버가 아직 receive하지 않음
- 서버는 받았지만
- reply를 매우 늦게 보내거나
- 아예 죽어버림
이 경우 클라이언트 스레드는:
- SEND block
- REPLY block
상태에서 무한정 멈출 수 있다.
실시간 시스템에서 이는 치명적이다.
2. Kernel Timeout의 개념
Kernel Timeout은:
- “이 스레드가 특정 커널 블로킹 상태에 들어가면”
- “지정한 시간 이후에는 강제로 timeout 처리해라”
라는 요청을 커널에 사전 등록하는 방식이다.
핵심 특징:
- 타이머가 아님
- 스레드의 블로킹 상태에 직접 적용
- 커널이 직접 관리

3. TimerTimeout() API 개요
QNX는 Kernel Timeout 설정을 위해 다음 API를 제공한다.
TimerTimeout(clockid_t id,
int flags,
const struct sigevent *notify,
const struct timespec *ntime,
uint64_t *otime);
주요 용도:
- MsgSend() timeout
- MsgReceive() timeout
- MsgReply() timeout
- 기타 커널 블로킹 상태
4. 대표적인 사용 사례: MsgSend 타임아웃
4.1 시나리오
- 클라이언트 스레드
- 서버에 메시지를 보냄
- 2.5초 이상 block되면 실패 처리하고 싶다
4.2 동작 흐름
- TimerTimeout() 호출
- timeout = 2.5초
- 적용 대상: SEND / REPLY block
- 바로 다음 커널 호출로 MsgSend() 실행
- 서버가 2.5초 내에 처리하면
- 정상 동작
- 2.5초 초과 시
- MsgSend()가 -1 반환
- errno = ETIMEDOUT
4.3 반환 값
- 성공: 정상적인 MsgSend() 결과
- 실패:
- return -1; errno = ETIMEDOUT;
→ 타임아웃은 예외가 아니라 정상적인 제어 흐름의 일부로 처리해야 한다.
5. Kernel Timeout의 중요한 성질 (매우 중요)
5.1 Timeout은 “상대적(relative)”이다
- 타임아웃 시간은
- TimerTimeout()를 호출한 시점 기준
- 절대 시간 아님
5.2 다음 “커널 호출 하나”에만 적용된다
이게 가장 중요한 포인트다.
TimerTimeout()는
“바로 다음 커널 호출 하나”에만 적용된다.
즉:
TimerTimeout();
MsgSend(); // ← 여기 적용됨
은 정상 동작하지만,
TimerTimeout();
some_function(); // 내부에서 커널 호출 발생
MsgSend(); // ← 여기에는 적용 안 됨
이면 타임아웃은 이미 자동 취소된다.
왜?
- Kernel Timeout은
- “다음 커널 진입 시점에만 유효”
- 다른 커널 호출이 끼어들면
- 커널은 “아, timeout 소비됨”으로 판단하고 제거
→ TimerTimeout과 대상 커널 호출은 반드시 연속돼야 한다
5.3 자동 취소(auto-cancel)
- TimerTimeout은
- 명시적으로 취소하지 않아도
- 다음 커널 호출 후 자동으로 사라진다
- 반복 사용하려면
- 매번 TimerTimeout()를 다시 설정해야 한다
6. 즉시 timeout(Non-blocking) 용도
Kernel Timeout은 다음 용도로도 사용 가능하다.
- “절대 block되면 안 된다”
- “지금 당장 처리 못 하면 실패”
이 경우:
- timeout 값을 0 또는 매우 작은 값으로 설정
- 결과적으로:
- 블로킹 없이 즉시 ETIMEDOUT 반환
→ 일종의 non-blocking IPC 패턴 구현 가능
7. Timer 기반 timeout vs Kernel Timeout 비교
구분Timer + signal/pulseKernel Timeout
| 동작 위치 | 사용자 레벨 | 커널 레벨 |
| 대상 | 일반 코드 | 커널 블로킹 상태 |
| 적용 방식 | 이벤트 수신 | 커널이 직접 해제 |
| 오차 | 스케줄링 영향 | 매우 정확 |
| 코드 복잡도 | 높음 | 낮음 |
| 사용 목적 | 주기/이벤트 | IPC 보호, 데드락 방지 |
→ MsgSend/Receive 보호에는 Kernel Timeout이 정석
8. 실무 설계 가이드
- IPC에서 block 가능성이 있으면:
- 무조건 Kernel Timeout 고려
- TimerTimeout() 호출 직후:
- 다른 함수 호출 금지
- 바로 MsgSend(), MsgReceive() 호출
- timeout은:
- 에러가 아니라 정상적인 분기 조건
- 주기 타이머와 혼동 금지:
- Kernel Timeout은 타이머가 아님
9. 한 줄 요약
QNX Kernel Timeout은
타이머가 아니라 커널 블로킹 상태에 대한 안전장치로,
TimerTimeout()를 통해
다음 커널 호출 하나에만 적용되는 시간 제한을 설정함으로써
IPC에서의 무한 대기와 데드락을 방지하는 핵심 메커니즘이다.
'운영체제 > QNX' 카테고리의 다른 글
| QNX RTOS: 10-1. Overview of Resource Managers (0) | 2026.01.23 |
|---|---|
| QNX RTOS: 9-1. Images & Buildfiles (0) | 2026.01.02 |
| QNX RTOS: 8-4. High-Resolution Timers (0) | 2026.01.02 |
| QNX RTOS: 8-3. Timers (0) | 2026.01.02 |
| QNX RTOS: 8-2. Getting and Setting the System Clock (0) | 2026.01.02 |