0. 동기화란?
동기화(Synchronization)란 두 개 이상의 실행 흐름(예: 스레드, 인터럽트, 프로세스 등)이 공유 자원에 접근할 때,
서로 충돌하지 않도록 그 접근 순서나 타이밍을 제어하는 과정을 말한다.
운영체제나 커널 환경에서는 다음과 같은 상황에서 동기화가 필수적이다:
- 여러 스레드가 같은 변수에 동시에 값을 쓰는 경우
- 하나의 프로세스가 값을 읽는 도중, 다른 프로세스가 그 값을 변경하는 경우
- 인터럽트 핸들러가 처리 중인 버퍼를 메인 루틴이 동시에 접근하는 경우
이러한 상황에서 동기화 없이 접근하게 되면 race condition, 데이터 손상, 비정상 동작이 발생할 수 있다.
따라서 동기화는 시스템 안정성과 신뢰성 보장을 위한 핵심 메커니즘이다.
1. 크리티컬 섹션(Critical Section)이란?
크리티컬 섹션은 여러 실행 주체(스레드, 인터럽트, 커널 스레드 등)가 동시에 접근하면 문제가 발생할 수 있는 공유 자원을 다루는 코드 영역을 의미한다.
예를 들어, 전역 변수나 하드웨어 레지스터 접근, 버퍼 조작 등이 이에 해당한다.
멀티코어 환경에서는 하나의 자원을 두 개 이상의 코어 또는 실행 흐름이 동시에 접근할 수 있기 때문에,
race condition이 발생할 가능성이 높아진다.
이를 방지하기 위해 동기화 도구가 필요하다.
2. 커널 동기화가 필요한 이유
2.1 SMP 환경
SMP 시스템에서는 여러 CPU 코어가 동시에 커널 코드를 실행할 수 있다.
따라서 락 없는 접근은 동기화되지 않은 접근으로 이어지고, 예상치 못한 결과를 낳는다.
2.2 인터럽트와 softirq
인터럽트 핸들러 또는 softirq는 프로세스 컨텍스트와 병렬로 실행될 수 있다.
이러한 환경에서 공유 자원을 제대로 보호하지 않으면 race condition이 발생한다.
2.3 선점형 커널
리눅스는 선점(preemption)을 지원한다.
즉, 한 커널 태스크가 락을 잡고 있는 동안 다른 태스크로 전환될 수 있으며, 이 역시 동기화 문제가 될 수 있다.
3. 커널 동기화 도구의 종류와 용도
3.1 spinlock
- 커널 내부에서 가장 기본적인 락
- 짧고 빠르게 끝나는 크리티컬 섹션에 적합
- atomic context에서도 사용 가능
- 락이 이미 잡혀 있으면 CPU를 쉬지 않고 반복 검사 (busy waiting)
3.2 mutex
- 슬립 가능한 process context에서만 사용 가능
- 블로킹 기반 락으로, 락이 이미 잡혀 있으면 슬립 대기
- atomic context에서는 사용 불가
3.3 atomic_t / atomic64_t
- 단순한 정수 변수의 증감, 교환 등에 사용
- 내부적으로 원자적 CPU 명령어 또는 lock-free 연산 사용
- 락 오버헤드 없이 빠르게 동기화
3.4 rwlock (Read-Write Lock)
- 다수의 읽기(read)는 허용하고, 쓰기(write)는 배타적으로 수행
- 읽기 병렬성 유지에 유리
3.5 seqlock
- 읽기 위주 환경에서 효율적인 락
- 쓰기 시에는 락을 잡고, 읽기는 락 없이 수행 (단, 중간에 쓰기가 있으면 재시도 필요)
3.6 RCU (Read-Copy-Update)
- 복잡한 동시성 환경에서도 읽기 작업을 지연 없이 처리할 수 있게 해주는 고급 동기화 메커니즘
- 쓰기 시에는 구조체 복사 후 교체, 읽기는 기존 포인터 그대로 사용
4. 컨텍스트에 따라 선택해야 하는 도구
interrupt context | spinlock, atomic_t |
process context | mutex, semaphore, spinlock, rwlock, RCU |
softirq/tasklet | spinlock, atomic_t (슬립 불가) |
SMP 환경 | 대부분 락 필요 (spinlock, mutex, 등) |
5. 요약
- 리눅스 커널은 멀티코어, 인터럽트, softirq 등 다양한 실행 흐름을 가진 환경에서 동작한다.
- 이러한 환경에서는 race condition을 피하기 위해 크리티컬 섹션을 명확히 구분하고, 적절한 동기화 기법으로 보호해야 한다.
- 컨텍스트와 상황에 따라 spinlock, mutex, atomic, rwlock, RCU 등의 도구를 선택해 사용하는 것이 중요하다.
'Linux > Kernel' 카테고리의 다른 글
Kernel) QEMU와 Buildroot로 ftrace 실습 환경 만들기 (1) | 2025.05.24 |
---|---|
Kernel) 디버깅을 연습을 위한 환경 셋팅(x86 환경) (0) | 2025.05.19 |
Kernel) Interrupt, Interrupt handler, Interrupt context (0) | 2025.05.15 |
Kernel) 프로세스 VS 스레드 (0) | 2025.05.14 |
Kernel) Context와 Context Switch란 무엇인가 (0) | 2025.05.14 |