뮤텍스와 세마포어에 대해 설명해 주세요.
뮤텍스(Mutex)와 세마포어(Semaphore)는 동시성 프로그래밍에서 공유자원을 안전하게 관리하기 위해서 상호배제를 달성하는 기법이다.
뮤텍스
뮤텍스는 임계 구역(Critical Section)을 가진 쓰레드들의 실행 시간(Running Time)이 서로 겹치지 않고 각각 단독으로 실행되도록 하는 기술이다.
뮤텍스는 화장실이 하나 밖에 없는 식당과 비슷하다.
화장실을 가기 위해서는 카운터에서 열쇠를 받아 가야 한다.
만약 카운터에 키가 있으면 화장실에 사람이 없다는 뜻이고, 우리는 이 열쇠를 이용해 화장실에 들어갈 수 있다.
카운터에 키가 없으면 화장실에 이미 사람이 있다는 뜻이고, 화장실을 이용할 수 없다. 사람이 나올 때까지 기다려야 한다.
다른 사람도 화장실에 가기 위해 카운터에 대기하고 있다.
앞사람이 화장실에서 나와 카운터에 키를 돌려 놓고, 이제 기다리던 사람들 중 맨 앞에 있던 사람이 키를 사용해 화장실에 갈 수 있다.
이것이 뮤텍스가 동작하는 방식이다.
화장실을 이용하는 사람은 프로세스 혹은 쓰레드이며, 화장실은 공유 자원, 화장실 키는 공유 자원에 접근하기 위해 필요한 어떤 오브젝트이다.
즉, 뮤텍스는
Key에 해당하는 어떤 오브젝트가 있으며 이 오브젝트를 소유한 쓰레드 또는 프로세스 만이 공유 자원에 접근할 수 있다.
세마포어
세마포어는 공유된 자원의 데이터 혹은 임계 구역(Critical Section) 등에 여러 프로세스 혹은 쓰레드가 접근하는 것을 막아주는 기술이다.
세마포어는 화장실이 여러 개 있는 식당과 비슷하다.
세마포어를 이용하는 식당의 화장실에는 여러 개의 칸이 있고 화장실 입구에는 현재 화장실의 빈 칸 개수를 보여주는 전광판이 있다.
화장실에 가고 싶다면 입구에서 빈 칸의 개수를 확인하고 빈 칸이 1개 이상이라면 빈칸의 개수를 하나 뺀 다음 화장실로 입장해야 하며, 나올 때는 빈 칸의 개수를 하나 더해준다.
모든 칸에 사람이 들어갔을 경우 빈 칸의 개수는 0이 된다.
이때 화장실에 들어가려면 빈 칸의 개수가 1 이상이 될 때까지 기다려야 한다.
이것이 세마포어가 동작하는 방식이다.
세마포어는 공통으로 관리하는 하나의 값을 이용해 상호배제를 달성한다.
화장실이 공유 자원이며, 사람들이 쓰레드, 프로세스이다.
화장실 빈 칸의 개수는 현재 공유 자원에 접근할 수 있는 쓰레드, 프로세스의 개수를 나타낸다.
뮤텍스와 가장 큰 차이점은 동기화 대상의 개수, 즉 예시에서 화장실의 개수다.
참고
Last updated