본문 바로가기

Linux/Kernel

Kernel) 커널 동기화

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 등의 도구를 선택해 사용하는 것이 중요하다.