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 동작 흐름

  1. TimerTimeout() 호출
    • timeout = 2.5초
    • 적용 대상: SEND / REPLY block
  2. 바로 다음 커널 호출로 MsgSend() 실행
  3. 서버가 2.5초 내에 처리하면
    • 정상 동작
  4. 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에서의 무한 대기와 데드락을 방지하는 핵심 메커니즘이다.