[OS] Mutex & Semaphore

동기식/비동기식 프로그램

  • 동기식 프로그램
    • 어떤 작업을 요청했을 때 그 작업이 종료될 때까지 기다린 후 다음 작업을 수행하도록 구현된 프로그램입니다.
    • 데이터를 주고받는 '순서'가 중요할 때 사용됩니다.
    • 한 작업에 대한 시간이 길어질 경우, 전체 응답이 지연될 수 있습니다.
    • 작업이 끝날 때 따로 이벤트를 감지하고 처리하는 과정에 소요되는 시간이 없습니다.
  • 비동기식 프로그램
    • 어떤 작업을 요청했을 때 그 작업이 종료될 때까지 기다리지 않고(작업을 위임하고), 다음 작업을 수행하도록 구현된 프로그램입니다.
    • 요청했던 작업이 끝나면 결과를 받고, 그에 따른 추가 작업이 있다면 수행합니다.
    • 요청 순서에 상관없이, 동시에 다수의 작업을 처리할 수 있습니다.
    • 작업이 끝날 때 따로 이벤트를 감지하고 결과를 받아 그에 따른 추가 작업을 해줘야하기 때문에, 비교적 느릴 수 있습니다.
    • I/O 작업이 잦고, 빠른 응답속도를 요구하는 프로그램에 적합합니다.

Mutex & Semaphore

뮤텍스와 세마포어는 모두 여러 스레드에서 공유된 자원에 접근하는 것에 제한을 두어 상호배제(Mutual Exclusion)을 달성하기 위해 사용되는 방법입니다. 하지만 두 방법에는 차이점이 있습니다.

뮤텍스 (Mutex)

  • 뮤텍스는 프로그램이 시작될 때 고유한 이름으로 생성되고 이를 통해 Locking 메커니즘으로 동작합니다.
  • Critical Section 을 가진 여러 스레드의 접근이 서로 겹치지 않도록 조율하는 기술로, 상호배제라고도 합니다.
  • 특정 시점에 하나의 스레드만이 뮤텍스를 얻어 Critical Section 에 접근할 수 있으며, 이 때 Wait 를 통해 Lock을 겁니다.
  • 해당 스레드만이 Critical Section 으로부터 접근이 끝날 때 뮤텍스를 해제 (Signal 을 통한 Lock 해제) 할 수 있습니다.
Wait(mutex);
/* Critical Section */
Signal(mutex);

여러개의 스레드에서 Signal 을 보낼 경우, Queue를 이용해 FIFO로 자원에 접근하도록 할 수 있습니다.

세마포어 (Semaphore)

  • 공유자원에 접근할 수 있는 스레드의 숫자로 제한하는 방법입니다.
  • 리소스 상태를 나타내는 카운터처럼 생각할 수 있습니다.
  • 세마포어에서 접근 가능한 숫자가 1이면 뮤텍스처럼 사용되는 것입니다.
  • 세마포어는 기본적으로 뮤텍스와 비슷하지만, Lock을 걸지 않은 스레드도 Signal을 보내 Lock을 해제할 수 있다는 점에서 뮤텍스와 다릅니다.
struct Semaphore{
  int cnt;    // 접근 가능한 숫자
  Queue q;
};

void Wait (semaphore s) {
  while(s.cnt<=0){
        // 락이 걸려 공유 자원에 접근할 수 없는 상황 
  }
  s.cnt--;    // 접근
} 

void Signal (semaphore s) {
  s.cnt++;    // 접근해제
}

마지막에 Lock을 건 스레드가 아니더라도 먼저 작업이 끝난 스레드가 Lock을 해제할 수 있습니다.

  • 운영체제 또는 커널의 한 지정된 저장장치 내의 값입니다.
  • 일반적으로 비교적 긴 시간을 확보하는 리소스에 대해 이용합니다.
  • 유닉스 시스템 프로그래밍에서 세마포어는 운영체제의 리소스를 경쟁적으로 사용하는 다중 프로세스에서 행동을 조정하거나 또는 동기화 시키는 기술입니다.

여러 스레드에서 접근이 가능한 만큼 제한도 필요합니다.

  • 이미 다른 프로세스에 의해 사용 중이라는 사실을 알게 되면 재시도하기전에 일정 시간을 기다려야 합니다.
  • 세마포어를 사용하는 프로세스는 그 값을 확인하고, 자원을 사용하는 동안에는 그 값을 변경함으로써 다른 세마포어 사용자들이 기다리도록 해야합니다.

임계 구역 (Critical Section)

위키 를 바탕으로 작성하였습니다.

임계 구역(critical section) 또는 공유변수 영역은 병렬컴퓨팅에서 둘 이상의 스레드가 동시에 접근해서는 안되는 공유 자원(자료 구조 또는 장치)을 접근하는 코드의 일부를 말합니다.

어떤 스레드(태스크 또는 프로세스)가 임계 구역에 들어가고자 한다면 지정된 시간만큼 대기해야 합니다. 스레드가 공유자원의 배타적인 사용을 보장받기 위해서 임계 구역에 들어가거나 나올때는 세마포어 같은 동기화 매커니즘이 사용됩니다.

'SW > Computer Science' 카테고리의 다른 글

[WEB] 웹서비스  (0) 2021.06.15
[WEB] 쿠키와 세션  (0) 2021.06.01
[WEB] HTTP의 GET과 POST  (0) 2021.05.30
[OS] Process & Thread  (0) 2021.05.27