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 처리 흐름
- 커널이 타이머 프로그래밍
- 타이머 만료
- core-local timer interrupt 발생
- 해당 코어의 clock IST (Interrupt Service Thread) 실행
- 대기 중인 스레드 깨움
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
→ 리눅스와 달리
→ “시간 자체”를 인터럽트에 의존하지 않음
'운영체제 > QNX' 카테고리의 다른 글
| QNX RTOS: 8-3. Timers (0) | 2026.01.02 |
|---|---|
| QNX RTOS: 8-2. Getting and Setting the System Clock (0) | 2026.01.02 |
| QNX RTOS: 7-3. Handling Interrupts 실습 (0) | 2025.12.26 |
| QNX RTOS: 7-3. Handling Interrupts (0) | 2025.12.26 |
| QNX RTOS: 7-2. Programming PCI Bus Devices (0) | 2025.12.26 |