Post

Mutex, Semaphore

들어가며

비동기(Asynchronous) 프로그래밍 :
  • 코드의 실행 결과처리를 별도의 공간에 맡겨둔 채 결과를 기다리지 않고, 코드의 실행을 계속하는 프로그래밍
동시성(Concurrency) 프로그래밍 :
  • 동시에 실행되는 것처럼 보이는 것
  • 싱글코어에서도 구현 가능
  • 하나의 커피머신에서 N명이 번갈아가며 커피를 받아간다
병렬성(Parallelism) 프로그래밍 :
  • 물리적으로 정확히 동시에 실행되는 것
  • 멀티 코어에서 멀티 스레드 동작
  • N대의 커피머신에서 N명이 커피 받는다

백엔드 개발자는 항상 동시성을 고려하여 프로그래밍을 해야 한다.
동시성 프로그래밍의 가장 큰 숙제는 공유자원의 관리이다.
공유자원을 안전하게 관리하기 위해선 상호배제 (Mutual exclusion)를 달성하는 기법이 필요하다.
Mutex와 Semaphore는 이를 위해 고안된 기법이다.

Mutex란 ?

Mutex에 대해 좋은 예시를 들어준 분이 있어 해당 얘기를 하고자 한다.

1
2
3
4
5
뮤텍스는 화장실이 하나 밖에 없는 식당과 비슷하다. 
화장실을 가려면 카운터에서 열쇠를 받아가야 한다.
카운터에 키가 있으면 화장실을 갈 수 있다는 뜻이고, 키가 없으면 화장실에 있는 사람이 나오길 기다려야 한다.

화장실 키가 카운터에 돌아오면, 맨 앞에 줄선 사람이 화장실에 먼저 들어가게 된다. 

이 것이 뮤텍스의 개념이다. 화장실을 가는 사람은 프로세스 or 스레드이고, 공유자원은 화장실이다.
화장실 키는 공유자원에 접근할 수 있는 오브젝트이다.

Semaphore란 ?

Semaphore도 마찬가지의 예시가 있다.

1
2
3
4
5
세마포어는 레스토랑이다. 
이 레스토랑은 3개의 화장실이 있고, 화장실 입구에 현재 빈 화장실의 개수를 보여준다.
화장실에 가려는 사람은 빈 화장실의 개수를 보고 1개 이상이라면 -1을 해준 후 들어간다. 
화장실을 나올땐 +1을 하고 나온다.
빈 화장실이 없으면 +1이 될 때까지 기다려야 한다.

정리

Mutex는 한 스레드, 프로세스에 의해 소유될 수 있는 Key를 통해 상호배제를 한다.
Semaphore는 현재 공유자원에 접근할 수 있는 스레드, 프로세스의 수를 나타내어 상호배제를 한다.

이 기법들을 사용한다해서 데드락이 안생기거나 데이터 무결성이 보장되는 것은 아니다.
두 기법 모두 완벽한 기법은 아니기 때문이다.
하지만 상호배제의 가장 기본적인 기법이므로 알아두어야 한다.

This post is licensed under CC BY 4.0 by the author.