QNX RTOS: 8-1. Timing Architecture

2026. 1. 2. 11:08운영체제/QNX

1. “지금 몇 시인가?” – Free-Running Counter 기반 시간

1.1 기본 개념

  • QNX 8에서 현재 시간의 기준
    → 하드웨어가 제공하는 free-running counter
  • 모든 플랫폼은 고해상도, 단조 증가(monotonic) 카운터를 제공해야 한다는 것이 QNX의 전제

1.2 ClockCycles()

  • QNX는 이를 하드웨어 독립적 API로 감싼 함수 제공
  • uint64_t ClockCycles(void);
  • 내부적으로는:
    • x86_64 → RDTSC
    • ARM → 아키텍처별 counter 레지스터
  • 커널 시스템 콜이 아님
    • 사실상 inline assembly
    • 매우 빠름 (유저 공간에서도 사용 가능)

1.3 멀티코어 동기화 요구 사항

QNX가 요구하는 조건:

  • 모든 코어에서 값이 동기화되어야 함
  • 코어를 옮겨 다니며 읽어도:
    • 값이 절대 감소하지 않음
    • 항상 같거나 증가

즉:

core0 → core1 → core0

ClockCycles 값은 항상 non-decreasing

1.4 해상도 요구

  • 나노초(ns) 단위 수준
  • 수 ns 이내 허용
  • μs 단위는 부적합

→  실시간 시스템에서 latency/프로파일링/트레이싱의 기반


2. ClockCycles의 실제 시간 변환

ClockCycles는 “틱 수”이므로 초 단위 변환 정보가 필요하다.

2.1 System Page (syspage)

  • 부팅 시 startup 코드가 채움
  • 프로세스마다 read-only로 매핑

접근 방법:

SYSPAGE_ENTRY(qtime)->cycles_per_sec
  • cycles_per_sec = 초당 counter 증가량
  • 일반적으로 CPU 클럭 주파수와 동일

2.2 예시

  • CPU 2.6GHz
  • cycles_per_sec ≈ 2,600,000,000

시간 계산:

time_sec = (ClockCycles() - start) / cycles_per_sec;

2.3 pidin으로 확인

실행 중인 시스템에서:

pidin syspage=qtime

→ CPS (cycles per second) 필드 확인 가능


3. 타이머(System Timers) – “시간이 지나면 깨워줘”

3.1 목적

  • “지금 시간”이 아니라
  • 미래 시점에 이벤트 발생
    • sleep
    • timeout
    • periodic task

3.2 구현 방식

  • 코어 로컬(core-local) 하드웨어 타이머
  • 각 CPU 코어마다:
    • countdown 또는 compare 타이머
    • 인터럽트 발생

3.3 처리 흐름

  1. 커널이 타이머 프로그래밍
  2. 타이머 만료
  3. core-local timer interrupt 발생
  4. 해당 코어의 clock IST (Interrupt Service Thread) 실행
  5. 대기 중인 스레드 깨움

3.4 시스템 tick

  • 기본 tick resolution: 1 ms
  • (설정에 따라 변경 가능)

4. 핵심 정리 (블로그용 요약)

QNX 시간 구조 요약

목적 현재 시간 측정 미래 이벤트
기반 free-running counter core-local HW timer
해상도 ns 수준 보통 ms
멀티코어 전 코어 동기화 필수 코어 로컬
사용 예 프로파일링, latency 측정 sleep, timeout

5. 중요한 설계 철학

  • Time ≠ Timer
  • 시간 측정은:
    • 글로벌
    • 락 없음
    • 초고속
  • 타이머는:
    • 인터럽트 기반
    • 코어 로컬
    • 정확한 wake-up

→  리눅스와 달리
→  “시간 자체”를 인터럽트에 의존하지 않음