QNX RTOS: 4-8. Synchronization (Race Condition)
2025. 11. 26. 21:15ㆍ운영체제/QNX
프로세스 내의 스레드들은 모든 자원(메모리, 파일 핸들, 전역 변수 등)을 공유함. 이는 효율적이지만, Race Condition(경쟁 상태)이라는 치명적인 문제를 야기함.
- Writer vs Writer: 두 스레드가 동시에 같은 변수에 값을 쓰면 데이터가 꼬임(Mess).
- Reader vs Writer: 쓰고 있는 도중에 읽으면, 갱신 전의 값이나 깨진 데이터(Stale/Invalid Data)를 읽게 됨.
이러한 문제를 해결하기 위해 QNX는 다양한 동기화 도구를 제공함.
1. 동기화 도구 모음 (Synchronization Primitives)
이번 섹션의 메인은 Mutex, Condvar, Atomic Operation이지만, QNX가 제공하는 다른 강력한 도구들의 개념도 짚고 넘어감.
1.1. 기본 도구 (Focus of this section)
- Mutex (Mutual Exclusion): 가장 기본적이고 강력한 잠금 장치. "나만 쓸 거야".
- Condvar (Condition Variable): 특정 조건이 만족될 때까지 스레드를 잠재우고 깨우는 신호 장치. Mutex와 짝으로 다님.
- Atomic Operations: 락 없이(Lock-free) 하드웨어 명령어를 통해 원자성을 보장하는 연산. (가장 가볍고 빠름).
1.2. 기타 도구 (Other Tools)
- Semaphores (세마포어):
- 알림(Notification) 메커니즘 + 카운터(Counter).
- 자원의 개수가 여러 개일 때 유용함.
- Reader/Writer Locks (RWLock):
- Read: 여러 스레드가 동시에 읽어도 안전함 (Multiple Readers OK).
- Write: 쓸 때는 단 한 명만 접근 가능. 쓰는 동안엔 읽지도 못함 (Exclusive).
- 활용: 조회는 빈번하지만 수정은 드문 데이터(예: 라우팅 테이블, 설정 값)에 적합함.
- Barriers (배리어):
- Rendezvous Point: N개의 스레드가 모두 도착할 때까지 대기하다가, 다 모이면 동시에 출발시킴.
- 활용: 초기화 단계에서 여러 스레드가 각자 할 일을 마치고, 메인 루프에 동시에 진입해야 할 때 사용.
- Once Control:
- 프로세스 생애 주기 동안 특정 함수(주로 초기화)가 딱 한 번만 실행되도록 보장함. 라이브러리 개발 시 유용.
- Thread Local Storage:
- 이름은 전역 변수 같지만, 실제로는 스레드마다 별도의 저장 공간을 가짐.
- 활용: 라이브러리가 멀티스레드 환경에서 동작할 때, 각 스레드 고유의 상태(예: errno)를 유지해야 할 때 사용.
2. 핵심 규칙: 락 해제 시 누가 깨어나는가?
스레드 A가 잡고 있던 락(Mutex, Semaphore 등)을 풀었음(unlock, post). 이때 대기 중인(Blocked) 스레드가 여러 명이라면 누가 락을 가져가는가?
QNX 커널은 다음 우선순위에 따라 락을 넘겨줌.
- Priority (우선순위): 가장 높은 우선순위를 가진 스레드가 무조건 가져감.
- Wait Time (대기 시간): 만약 최고 우선순위를 가진 스레드가 여러 명이라면? 가장 오래 기다린 놈(Longest Waiting)이 가져감 (FIFO).
즉, Highest Priority, Longest Waiting Thread가 승자임.
💡 정리 및 인사이트 (Vehicle Network & RTOS)
- RWLock의 가치: 네가 다루는 차량 네트워크 스택(TCP/IP, SomeIP)에서 라우팅 테이블이나 ARP 테이블은 수시로 조회되지만(Read), 갱신은 가끔 일어남(Write). 이때 Mutex 대신 RWLock을 쓰면 병렬 읽기가 가능해져 성능이 비약적으로 향상됨.
- Barrier의 활용: 자율주행 시스템 부팅 시, LiDAR Init, Camera Init, Radar Init 스레드가 각자 하드웨어 초기화를 마치고 Barrier에서 대기했다가, Sync가 맞았을 때 동시에 센싱 루프를 시작하는 패턴으로 활용 가능함.
- RTOS 스케줄링: QNX의 "우선순위 기반 락 획득" 규칙은 실시간성을 보장하는 핵심임. 하지만 이로 인해 Priority Inversion(우선순위 역전) 문제가 발생할 수 있으며, 이를 해결하기 위해 QNX Mutex는 Priority Inheritance(우선순위 상속) 기능을 제공함. (이후 섹션에서 다룰 것으로 예상됨)
'운영체제 > QNX' 카테고리의 다른 글
| QNX RTOS: 4-9. Mutexes 실험 (0) | 2025.11.27 |
|---|---|
| QNX RTOS: 4-9. Synchronization - Mutexes (0) | 2025.11.26 |
| QNX RTOS: 4-7. Process Termination and Cleanup (0) | 2025.11.26 |
| QNX RTOS: 4-6. Threads - Operations (0) | 2025.11.26 |
| QNX RTOS: 4-5. Threads - Creation (0) | 2025.11.26 |