Critical Section (임계 영역)

어떤 동일한 자원을 동시에 접근하는 작업을 실행하는 코드 영역을 Critical Section 이라고 한다. 공유하는 변수를 사용한다든가, 동일한 파일을 읽고 쓰는 등의 작업에 해당한다. 멀티 쓰레딩 환경에선 기본적으로 공유 자원의 동기화가 이루어지지 않기 때문에 이를 대처하지 않으면 분명 문제가 될 수 있다.

따라서, 많은 프로세스들이 Critical Section 을 함께 사용할 수 있는 어떠한 규칙을 설계해야 한다.
임계영역 문제를 해결하기 위해 갖춰야 할 기본 조건은 아래와 같다.

  • Mutual Exclusion (상호 배제)
    만약 프로세스 P1 이 임계영역에서 실행중이다? 그렇다면 다른 프로세스들은 임계영역에 진입하지 못한다.

  • Progress (진행)
    임계영역에서 실행중인 프로세스가 없고, 별도의 동작이 없는 프로세스들만 임계영역 진입 후보 자격이 있다.

  • Bounded Waiting (한정된 대기)
    프로세스 P1 이 임계영역에 들어가고 싶다고 신청하고 받아들여질 때까지 다른 프로세스들이 임계영역에 진입하게 되는 횟수는 한정적이어야 한다.

그럼, 프로세스간의 임계영역 동기화를 위한 해결책 몇 가지를 알아보도록 하자.


Locking

동시에 공유 자원에 접근하는 것을 막기 위해 임계영역에 진입하는 프로세스는 Lock 을 획득하고, 임계영역을 빠져나왔을 때 Lock 을 릴리즈함으로써 두 개 이상의 프로세스가 동시에 임계영역에 진입할 수 없도록 하는 방법이다.

보통 상가 건물에 있는 식당에서 상가의 화장실을 이용하려는 경우 열쇠를 필요로 하는 경우가 있다. 그런데 만일 어떤 손님이 이미 열쇠를 챙겨 화장실에 간 경우, 다른 사람은 그 손님이 돌아올 때까지 화장실을 이용하지 못한다. 화장실을 임계영역으로 놓고 봤을 때, 이 상황은 Locking 매커니즘과 유사하다고 볼 수 있다.


Semaphores

세마포, 세마포어라고 읽는다. 영단어 뜻은 '수기 신호' 라는 뜻이다. 임계영역 문제를 제어하고 해결하기 위한 수기 신호, 즉 프로세스 동기화 도구 중 하나이다.

세마포어의 경우에는 Counting, Binary 이렇게 두 가지가 존재한다.

Counting Semaphores

제한된 개수를 가진 자원에 대한 접근 제어용으로 사용되며, 세마포는 사용 가능한 자원의 개수로 초기화된다. 예를 들어 자원이 6개면 세마포어도 6인 것이다. 자원을 사용하면 세마포어가 감소, 방출하면 세마포어가 증가하게 된다.

Locking 매커니즘을 설명하면서 화장실 열쇠를 예로 들었는데, 어떤 건물에 여러 식당이 있고 화장실은 단 하나라고 가정해보자. 그렇다면 식당별로 해당 화장실을 열기 위한 열쇠를 갖고있을 것이다. 만약 식당이 4개라면 열쇠는 4개일 것이고, 최대 4명이 수용가능한 화장실이 되는 것이다. 이것은 4 짜리 세마포어를 활용한 것이다.

Binary Semaphores (MUTEX)

뮤텍스라고 불리는 녀석이 바로 Binarty Semaphores 를 의미하는 것이다. 이름 그대로 이진값 (0, 1) 만 가질 수 있고, 다중 프로세스들 사이의 임계영역 문제를 해결하기 위해 사용된다. 위에서 소개했던 Lock 매커니즘의 일종이기도 하다. (어떤 자료에서는 MUTEX 를 세마포의 일종으로 보지 않고 별개의 개념으로 소개하기도 한다)

Busy Waiting 이슈

세마포어는 Busy Waiting 이슈가 있다. Spin Lock 이라는 불리는 세마포어 초기 버전에서 임계영역에 진입해야하는 프로세스는 진입 코드를 무한 루프 형태로 구현하기 때문에 CPU 시간을 낭비하곤 했다. 이를 'Busy Waiting' 이라고 부르며 상당히 비효율적이라고 할 수 있다.

물론, 일반적으로는 세마포어에서 임계영역에 진입을 실패한 프로세스에 대해 Block 시킨 뒤, 임계영역에 자리가 날 때 다시 깨우는 방식을 사용한다. 이렇게 하면 Busy Waiting 이슈가 해결된다.

Deadlock 이슈

세마포어가 Ready Queue 를 가지고 있고, 두 개 이상의 프로세스가 임계영역 진입을 무한정 기다리고 있을 때 임계영역에서 실행되는 프로세스는 진입 대기 중인 프로세스가 실행되어야만 빠져나올 수 있는 상황을 지칭한다.

profile
어려울수록 기본에 미치고 열광하라

0개의 댓글