본문 바로가기

안드로이드/알아두기

[안드로이드] 동기화에 대하여 알아보자(1) - 세마포어와 뮤텍스

이번엔 동기화에 대하여 시리즈로 작성할 것이다.

당근회사와의 인터뷰 중 동기화와 관련한 많은 질문들을 받았고, 이와 관련하여 만족스러운 답변을 하지 못했다. 그래서 차후에 다른 인터뷰에서 이러한 질문이 나왔을 때 유연한 답변을 위해 질문 받은 것들, 그리고 그 외 사항들에 대해서 전반적으로 정리할 것이다.

 

임계구역과 발생하는 문제

임계구역은 각 프로세스가 포함하고 있는 코드로서, 해당 구역 안에서 적어도 하나 이상의 다른 프로세스와 공유하는 데이터에 접근하고 데이터를 갱신할 수 있는 구역을 일컫는다. 이때 동시에 두 프로세스가 임계구역에 진입하여 동일한 공유 자원에 접근하여 조작하고, 그 실행 결과가 접근이 발생한 특정 순서에 의존하는 경쟁 상황(race condition)이 발생하게 된다.

 

해결방법

이러한 임계구역 문제에 대한 해결방안은 아래 3가지가 있다.

  1. 상호 배제(mutual exclusion) - 특정 프로세스가 임계구역에서 실행되고 있다면, 다른 프로세스들이 그들의 임계구역에서 실행되지 않게 한다.
  2. 진행(progress) - 자신의 임계구역에서 실행되는 프로세스가 없고 그들 자신의 임계구역으로 진입하려고 하는 프로세스들이 있다면, 나머지 구역에서 실행 중이지 않은 프로세스들만 다음에 누가 그 임계구역으로 진입할 수 있는지를 결정하는 데 참여할 수 있으며, 이 선택은 무한정 연기될 수 없다.
  3. 한정된 대기(bounded waiting) - 프로세스가 자기의 임계구역에 진입하려는 요청을 한 후부터 그 요청이 허용될 때까지 다른 프로세스들이 그들 자신의 임계구역에 진입하도록 허용되는 횟수에 한계가 있어야 한다

Mutex(뮤텍스) - Mutual Exclusion의 축약어

임계구역 문제를 하드웨어 기반 해결책 대신 소프트웨어 기반 해결책이다. 그 중 가장 간단한 해결 방법으로서 특정 Key Object 가진 프로세스만 공유 자원에 접근이 가능하게 하여, 1개의 프로세스만이 공유 자원에 접근하게 하는 기법이다. 이때 공유 자원에 접근하지 못한 다른 프로세스들은 Queue Stacking 되어서 차례대로 공유 자원에 접근하게 된다.

 

Semaphore

세마포어는 '이진 세마포어' '카운팅 세마포어' 이렇게 2개로 구분지어진다. 이진 세마포어의 경우에는 0과 1사이의 값만 가능하다. 따라서 이진 세마포어는 뮤텍스와 유사하게 동작한다. 여담으로 몇몇 시스템에서는 뮤텍스락을 제공하지 않고, 이진 세마포어가 대신 사용되기도 한다.

 

카운팅 세마포어는 유한한 개수를 가진 자원에 대한 접근을 제어하는 데 사용될 수 있다. 초기에 가용 자원의 개수로 세마포어를 초기화한다. 그리고 각 자원을 사용 및 사용 후에는 세마포어의 값을 증감시킨다. 단 세마포어의 값이 0이 되면 모든 자원이 사용 중이라서 프로세스들이 자원을 사용하기 위해서는 대기를 해야한다.

 

이러한 세마포어는 동기화 문제를 해결하기 위해서 사용될 수 있다. 예를들어 병렬로 수행되는 두 프로세스에서, 선행되는 작업을 수행되어야 진행될 수 있는 작업은 세마포 synch를 공유하여 각 작업 수행 유무에 따라 signal을 주고 받아 동기화 문제를 해결하기도 한다.