반응형

 

여러 개의 프로세스가 동시에 실행할 수 있는 멀티 코어 시스템은 시스템의 성능 향상을 가져왔지만 동시에 "프로세스 간의 공유 자원 접근 관리"라는 문제를 가져왔습니다. 즉, 공유된 자원에 여러 프로세스 혹은 스레드가 동시에 접근하면서 문제가 발생하는데 이렇게 다수의 컴포넌트가 공유 중인 자원을 동시에 읽거나 수정할 때 생기는 문제를 "동기화 문제"라고 하며 이러한 문제는 스핀락, 뮤텍스, 세마포어를 통해서 해결할 수 있습니다. 이번 시간에는 동기화 문제들을 해결할 수 있는 방법들의 특징과 차이점에 대해 포스팅해보겠습니다.  

 

먼저 임계 구역(Critical Section)의 정의와 임계 구역 문제를 해결하기 위한 3가지 조건에 대해 말씀드리겠습니다.

 

임계 구역(Critical Section)

임계 영역은 프로세스 간의 공유 자원을 접근하는 데 있어서 문제가 발생하지 않도록 한 번에 하나의 프로세스만 이용하며 다른 프로세스들의 접근을 제한하는 영역입니다.

  1. 상호 배제(Mutual Exclution) : 하나의 프로세스가 임계 구역에 들어가 있다면 다른 프로세스는 들어갈 수 없어야 합니다.
  2. 진행(Progress) : 들어가려는 프로세스가 여러 개라면 어느 것이 들어갈 것인지 결정해주어야 합니다.
  3. 한정된 대기(Bounded Waiting) : 다른 프로세스의 기아(Starvation)를 막기 위해 한번 임계 구역에 들어간 프로세스는 다음번 임계 구역 접근에 제한이 생겨야 합니다.

 

 

스핀락(Spinlock)

특정한 자원을 획득(Lock) 또는 해제(Unlock)를 통해 공유 자원에 대한 접근 권한을 관리하는 방법입니다. 권한을 획득하기 전까지는 CPU는 무의미한 코드를 수행하는 Busy Waiting 상태로 대기하고 있다가 접근 권한을 얻게 되면 내부 코드를 수행하고 종류 후 권한을 해제합니다. 상태가 획득, 권한 밖에 없기 때문에 공유 영역에서는 하나의 컴포넌트만 접근이 가능합니다. 그리고 획득(Lock) 또는 해제(Unlock)의 주체는 동일해야 합니다.

하나의 작업이 빠르게 수행될 수 있는 장점이 있지만 선점 기간 동안에는 다른 프로세스의 작업이 지연될 수 있는 오버 헤드도 존재하게 됩니다. 그렇기 때문에 짧게 수행할 수 있는 작업에 주로 사용됩니다.

 

 

뮤텍스(Mutex)

MUTual EXclusion으로 상호 배제라고도 합니다. 획득(Lock) 또는 해제(Unlock) 상태가 있으며 스핀락과 같이 접근 권한을 획득할 때까지 Busy Waiting 상태에 머무르지 않고 Sleep 상태로 들어가며 Wakeup 되면 권한을 획득을 시도합니다. 뮤텍스의 경우엔 Locking 메커니즘으로 오직 하나의 스레드만이 동일 시점에 뮤텍스를 얻어 임계 구역(Critical Section)에 접근할 수 있습니다. 그리고 획득(Lock) 또는 해제(Unlock)의 주체는 동일해야 합니다.

 

 

세마포어(Semaphore)

스핀락과 뮤텍스와는 다르게 하나 이상의 스레드가 공유자원에 접근하도록 할 수 있습니다. 표현형은 정수로 표현하며 획득(Lock) 또는 해제(Unlock)가 아닌 값을 올리고 내리는 방식으로 사용합니다. 컴포넌트가 특정 자원에 접근할 때 semWait이 먼저 호출되어 임계 구역에 들어갈 수 있는지 확인을 합니다. 조건에 만족한다면 semWait을 빠져나와 임계 구역에 들어가게 되고 이후 semSignal이 호출되어 임계 구역을 빠져나오게 됩니다.

semWait 연산 : 세마포어의 값을 감소시킵니다. 만약 값이 음수가 되면 semWait을 호출한 스레드는 블록 되지만 음수가 아니라면 스레드는 작업을 수행합니다.

semSignal 연산 : 세마포어의 값을 증가시킵니다. 만약 값이 양수가 아니라면 semWait 연산에 의해 블록 된 스레드들을 wake 시킵니다.

데드락 문제

각 프로세스의 첫째줄이 동시에 실행될 경우 서로 wait상태로 다른 쪽에서 signal을 해주기 전까지 기다리게 되는데 이를 데드락(Dead Lock, 교착상태)라고 합니다.

 

 

뮤텍스와 세마포어의 차이점

세마포어의 경우 여러 개의 스레드가 접근할 수 있는 반면 뮤텍스의 경우 오직 1개의 스레드만 접근이 가능합니다.

쉽게 말해 화장실이 여러 개 있는 백화점 화장실의 경우엔 세마포어, 가정집의 하나밖에 없는 화장실의 경우엔 뮤텍스라고 생각하시면 될 것 같습니다.  

그리고 세마포어는 현재 수행 중인 스레드가 아닌 다른 스레드가 세마포어 해제를 할 수 있지만 뮤텍스의 경우 획득하고 해제하는 주체가 동일해야 합니다.

 

 

 

 

참고 URL

 

반응형

+ Recent posts