QNX RTOS: 4-4. Thread
2025. 11. 26. 16:23ㆍ운영체제/QNX
QNX는 스레드와 동기화를 위해 세 가지 레벨의 API를 제공함. 개발자는 이 중에서 무엇을 쓸지 선택해야 하는데, 결론부터 말하면 표준(Portable) API를 써야 함.
1. QNX가 제공하는 3가지 Thread API
- Base Kernel Functions (QNX 고유)
- ThreadCreate(), SyncMutexLock()
- 커널에 직접 요청을 날리는 가장 Low-level 함수.
- POSIX Functions (표준)
- pthread_create(), pthread_mutex_lock()
- 리눅스나 유닉스에서 쓰는 것과 동일한 표준 API.
- C11 Threading Functions (표준)
- thrd_create(), mtx_lock()
- C11 표준에 추가된 스레딩 라이브러리.
2. API 계층 구조: Wrapper 패턴
이 API들은 서로 별개가 아님. Portable API(POSIX, C11)는 커널 함수 위에 얹혀진 래퍼(Wrapper) 계층임.
- 구조: Application -> POSIX Library (pthread_*) -> Kernel Call (Thread*)
- 즉, 네가 pthread_create()를 호출하면, 라이브러리 내부에서 파라미터를 정리해서 결국 ThreadCreate() 커널 콜을 날리게 됨.
3. 왜 커널 함수(ThreadCreate)를 직접 쓰면 안 되는가?
"커널 함수를 직접 쓰면 오버헤드가 줄어서 더 빠르지 않을까?"라고 생각할 수 있지만, QNX는 이를 권장하지 않음(Not intended for direct use).
이유는 커널 함수가 **"완전한 구현체(Complete Implementation)"**가 아니기 때문임. 커널 함수는 딱 커널이 해야 할 일만 수행함.
결정적 차이: 스택 할당 (Stack Allocation)
- pthread_create()의 동작:
- 사용자 영역에서 스레드를 위한 **스택 메모리(Stack)**를 할당함.
- 스택의 위치와 크기 정보를 가지고 ThreadCreate()를 호출함.
- ThreadCreate()의 동작:
- 그냥 스레드 엔티티만 만듦. 스택이 어디 있는지, 크기가 얼마인지는 호출자가 다 알아서 넣어줘야 함.
즉, 커널 함수를 직접 쓰려면 pthread 라이브러리가 대신해주던 메모리 할당, 초기화 작업 등을 개발자가 일일이 다 구현해야 함. 실수할 확률이 매우 높고 이식성도 떨어짐.
4. 결론: POSIX가 정답이다
C11 스레드도 있지만, 현업에서는 압도적으로 **POSIX (pthread)**가 표준임. QNX도 이를 권장하며, 앞으로의 강의 내용도 POSIX 함수를 기준으로 진행될 것임.
💡 요약
- API는 Kernel(Native), POSIX, C11 세 가지가 있음.
- POSIX는 Kernel 함수를 감싸고 있는 형태임.
- Kernel 함수는 스택 할당 같은 준비 작업을 안 해주므로 직접 쓰지 마라.
- 그냥 pthread_create 쓰면 됨.
'운영체제 > QNX' 카테고리의 다른 글
| QNX RTOS: 4-6. Threads - Operations (0) | 2025.11.26 |
|---|---|
| QNX RTOS: 4-5. Threads - Creation (0) | 2025.11.26 |
| QNX RTOS: 4-3. Processes - Detecting Termination (0) | 2025.11.26 |
| QNX RTOS: 4-2. Processes - Creation (0) | 2025.11.26 |
| QNX RTOS: 4-1. Processes and Threads (0) | 2025.11.26 |