-
반응형
커널 동기화란 다음과 같이 동작하도록 코드를 설계하거나 유지 보수하는 기법을 의미한다.
1. 어떤 함수나 특정 코드 구간을 실행할 때 1개의 프로세스만 접근
2. 정해진 순서로 코드를 실행
커널 동기화를 제대로 이해하려면, '임계영억', '레이스 컨디션'에 대한 개념을 알 필요가 있다. 임계 영역과 레이스 컨디션이 무엇인지 알아본 후 레이스 컨디션이 발생하는 이유를 살펴보고 레이스 컨디션과 관련된 리눅스 커널 패치를 분석하자.
1. 임계 영역과 레이스 컨디션
임계영역(Critical Section)이란 2개 이상의 프로세스가 동시에 실행하면 동시 접근 문제를 일으킬 수 있는 코드 블록을 말한다. 즉, 1개의 프로세스만이 실행해야 하는 특정 코드 블록의 시작과 끝부분을 뜻한다. 만약 A 프로세스가 어떤 코드 구간을 실행하는 도중에 B 프로세스가 같은 코드 블록을 실행한다고 가정한다면 이를 A 프로세스와 B 프로세스가 임계 영역에 동시에 접근 중인 상황이라고 볼 수 있다. 이처럼 임계 영역에 2개 이상의 프로세스가 동시에 어떤 코드 연산을 수행하는 상황을 레이스 혹은 레이스 컨디션이라고 말한다. 이를 경쟁 조건이라고 부르기도 한다. 기존 운영체제 책에서는 임계 영역이나 레이스 컨디션의 이해를 돕기 위해 화장실을 예로 많이 든다. 한 사람만 들어갈 수 있는 공중 화장실에 A와 B라는 사람이 들어가면, 하나밖에 없는 화장실 문에 있는 잠금쇠를 잠그고 용무를 보는 상황이다. 이 같은 상황을 리눅스 커널의 동기화 과정에 빗대서 생각해 보자.
첫째, 우리는 화장실에 들어가기 전에 화장실 문을 보고 잠금쇠가 잠겨 있나 확인해서 이미 다른 사람이 안에 있는지 살핀다. 화장실 안에 사람이 없으면 화장실에 들어가서 화장실 문을 잠근다.
둘째, 화장실에서 용무는 딱 한 사람만 볼 수 있다. 화장실에 두 사람이 동시에 들어갈 수 없다. 유일하게 한 사람이 용무를 보는 상황을 운영체제에서 임계 영역이라고 한다.
셋째, 화장실에서 다른 사람이 용무를 보고 있으면 밖에서 기다린다. 그런데 화장실에서 기다리는 식은 사람마다 다르다. 용무가 급한 사람은 다른 일을 하지 않고 밖에서 발을 구르며 기다리는 사람이 있는 반면, 어떤 사람은 화장실 밖에서 잡지를 보면서 유유히 기다린다.
화장실에는 한 사람만 들어가서 용무를 봐야 하듯이 한 개의 프로세스가 특정 코드 구간을 실행하는 경우가 있다. 이 같은 특정 코드 구간을 임계 영역이라고 한다.
이번에는 레이스 컨디션(Race Condition)에 대해 알아보자. 만약 A라는 사람이 용무를 보기 전에 화장실 문에 있는 잠금쇠를 제대로 잠그지 않았다. 이후 B라는 사람이 화장실 문이 잠겨 있지 않으니 화장실 안에 사람이 없다고 판단하고 문을 연다, 결국 화장실에 두 사람이 함께 들어가게 된다. 화장실에 2명의 사람이 함께 들어가듯 임계 영역에 두 개의 프로세스가 동시에 접근하는 상황을 레이스 컨디션이라 한다. 정리하면 레이스 컨디션은 "특정 코드 구간에 2개의 프로세스가 실행된다"라고 설명할 수 있으며, 레이스 컨디션이 발생한 이유는 "프로세스가 특정 코드 구간에 락(잠금)을 걸지 않았다"라고 볼수 있다. 한 개의 프로세스만 임계 영역을 실행하도록 임계 영역 구간에 락을 걸어 레이스 컨디션을 방지해야 한다. 임계 영역과 레이스 컨디션에 대해 알았으니 커널 동기화에 대한 정의를 내리면, 레이스 컨디션을 방지하기 위한 함수 호출과 설계 기법을 말한다.
2. 레이스 컨디션은 왜 발생할까?
SMP(symmetric multiprocessing)
레이스 컨디션이 발생하는 첫 번째 이유는 리눅스 시스템에서 SMP(symmetric multiprocessing)를 적용하기 때문이다. 여기서 SMP란 하나의 시스템에 다수의 CPU가 한 개의 메모리를 쓰는 컴퓨터 시스템 아키텍처를 말한다. 이러한 SMP애 대한 정의를 읽어도 레이스 컨디션이 왜 발생하는지 잘 이해되지 않는다. 그런데 소프트웨어 관점에서 SMP 시스템에서는 다수의 CPU내에 있는 프로세스가 다음과 같이 실행된다. "다수의 CPU에서 병렬로 프로세스가 커널 코드를 실행한다." 만약 리눅스 시스템에 4개의 CPU를 탑재한 SMP 시스템에서는 4개의 CPU에서 병렬로 서로 다른 프로세스들이 실행될 수 있는 것이다. 이런 현상을 동시성(Concurrency)이라고도 부른다. 달리 보면 SMP 시스템은 동시성이 발생할 수밖에 없는 조건이다. 그런데 동시성과 레이스 컨디션은 비슷한 의미를 지닌다. 그러면 두 용어의 차이점은 무엇일까? 동시성은 SMP시스템에서 2개의 코어에서 같은 코드를 실행하는 것을 의미한다. 레이스 컨디션은 '동시성'이란 환경에서 2개의 코어에 있는 프로세스가 임계 영역을 실행했을 때 문제가 발생하는 조건이나 상황을 의미한다. 레이스 컨디션은 '동시성'이란 환경에서 2개의 코어에 있는 프로세스가 임계 영역을 실행했을 때 문제가 발생하는 조건이나 상황을 의미한다.
현재 대부분의 리눅스 시스템은 SMP환경에서 구동한다. 스마트폰을 포함하여 대부분 리눅스는 SMP시스템에서 실행된다. 라즈베리 파이도 쿼드코어 CPU(4개의 코어)가 탑재돼 있다.
반응형