[IT 상식] 뮤택스 vs 세마포어 차이
프로세스 간 메시지를 전송하거나, 공유메모리를 통해 공유된 자원에 여러 개의 프로세스가 접근하면 문제가 발생할 수 있다.
이를 해결하기 위해 데이터를 한 번에 하나의 프로세스만 접근하도록 제한을 두는 동기화를 취해야 한다.
동기화 도구에는 대표적으로 세마포어(Semaphore)와 뮤텍스(Mutex)가 있다.
이들은 모두 공유된 자원의 데이터를 여러 스레드/프로세스가 접근하는 것을 막는 역할을 한다.
뮤텍스(Mutex)
- 공유된 자원의 데이터 혹은 임계영역(Critical Section) 등에 하나의 프로세스 혹은 Thread만 접근하도록 함 (동기화 대상이 하나)
- 임계영역(Critical Section)을 가진 스레드들의 실행시간(Running Time)이 서로 겹치지 않고, 각각 단독으로 실행되도록 하는 기술
- 한 프로세스에 의해 소유될 수 있는 key를 기반으로 한 상호배제 기법으로, key를 소유한 스레드/프로세스만이 공유자원에 접근할 수 있음
- 공유 리소스에 대한 접근을 조율하기 위해 동기화(Synchronization) 또는 락(Lock)을 사용함으로써 뮤텍스 객체를 두 개 이상의 프로세스/스레드가 동시에 사용할 수 없음
뮤텍스에 대한 실생활 예시
뮤텍스는 화장실이 하나밖에 없는 식당과 비슷합니다. 화장실에 가기 위해서는 카운터에서 열쇠를 받아 가야 하며, 누군가가 화장실을 가려고 하는데 카운터에 키가 있으면 화장실에 사람이 없다는 뜻이고, 그 열쇠를 이용해 화장실을 들어갈 수 있습니다.
카운터에 열쇠가 없다면, 화장실에 사람이 있다는 뜻으로, 화장실을 사용할 수 없습니다. 사람이 나올 때까지 기다려야 합니다.
곧이어 다른 사람도 화장실에 가려고 카운터에 대기하고 있습니다. 앞사람이 화장실에서 나와 카운터에 키를 돌려 놓았습니다. 이제 기다리던 사람들 중 맨 앞에 있던 사람이 키를 받아 화장실을 갈 수 있습니다.
이것이 뮤텍스가 동작하는 방식입니다. 화장실을 사용하는 사람은 프로세스 혹은 쓰레드이며 화장실은 공유자원, 화장실 키는 공유자원에 접근하기 위해 필요한 어떤 오브젝트입니다. 즉, 뮤텍스는 Key에 해당하는 어떤 오브젝트가 있으며, 이 오브젝트를 소유한 (쓰레드, 프로세스) 만이 공유자원이 접근할 수 있습니다.
세마포어(Semaphore)
- 공유된 자원의 데이터 혹은 임계영역에 여러 프로세스 혹은 쓰레드가 접근하는 것을 막아줌 ( 동기화 대상이 여러 개 )
- 사용하고 있는 스레드/프로세스의 수를 공통으로 관리하는 하나의 값을 이용하여 상호배제를 달성
- 공유 자원에 접근할 수 있는 최대 허용치만큼 동시에 프로세스/스레드가 접근할 수 있음
- 자원을 사용하지 않는 상태가 될 때, 대기하던 프로세스/스레드가 즉시 자원을 사용하고, 이미 다른 프로세스/스레드에 의해 사용중이라는 사실을 알게 되면, 재시도 전에 일정시간 대기해야 함
- 일반적으로, 비교적 긴 시간을 확보하는 리소스에 대해 사용하게 됨
세마포어에 대한 실생활 예시
세마포어는 손님이 화장실을 좀 더 쉽게 이용할 수 있는 레스토랑입니다. 세마포어를 이용하는 레스토랑의 화장실에는 여러 개의 칸이 있고, 화장실 입구에는 현재 화장실의 빈 칸 개수를 보여주는 전광판이 있다고 가정합니다.
만약 누군가 화장실에 가고 싶다면, 입구에서 빈칸의 개수를 확인하고, 빈 칸이 1 이상이라면 빈칸의 개수를 하나 뺀 다음, 화장실로 입장해야 하며, 나올 때 빈 칸의 개수를 하나 더해줍니다.
모든 칸에 사람이 들어있을 경우 빈 칸의 개수는 0이 되며, 이 때 화장실에 들어가고 싶은 사람이 있다면, 빈 칸의 개수가 1 이상이 될 때까지 기다려야 합니다.
이 처럼 세마포어는 공통으로 관리하는 하나의 값을 이용하여 상호배제를 달성합니다. 세마포어도 뮤텍스처럼 화장실이 공유자원이며, 사람들이 쓰레드 혹은 프로세스입니다. 그리고 화장실의 빈칸의 개수는 현재 공유자원에 접근할 수 잇는 쓰레드/프로세스의 개수입니다.
뮤텍스와 세마포어의 차이
- 동기화 대상의 개수
- 뮤텍스와 세마포어의 목적은 특정 동기화 대상이 이미 특정 스레드에 의해 사용중일 경우 다른 스레드가 해당 동기화 대상에 접근하는 것을 제한하는 것으로 동일하지만, 동기화 대상이 몇 개인가에 따라 차이가 발생
- 뮤텍스는 동기화 대상이 오직 1개, 세마포어는 동기화 대상이 1개 이상일 때 사용
2. 자원 소유
- 뮤텍스는 자원을 소유할 수 있지만, 세마포어는 자원 소유 불가
- 뮤텍스는 상태가 0,1 뿐이므로 Lock을 가질 수 있음
3. 해제 기능
- 소유하고 있는 스레드만이 이 뮤텍스를 해제할 수 있음
- 반면, 세마포어는 세마포어를 소유하지 않는 스레드가 세마포어를 해제할 수 있음
4. 생존 기간
- 세마포어는 시스템 범위에 걸쳐 있고, 파일 시스템 상의 파일로 존재하지만, 뮤텍스는 프로세스의 범위를 가지며, 프로세스가 종료될 때 자동으로 Clean Up 됨
뮤텍스와 세마포어만으로 동기화 문제를 모두 해결할 수 있는 것은 아니다!!
- 뮤텍스와 세마포어 모두 데이터의 무결성을 보장할 수는 없기에 모든 교착상태를 해결하지 못함.
- 따라서, 좀 더 복잡한 매커니즘을 적용해 개선된 성능을 가질 수 있도록 하는 것이 중요함
'IT > IT 상식' 카테고리의 다른 글
[IT 상식] 웹, 앱으로 수익화하는 방법 (feat. 조코딩) (1) | 2022.11.26 |
---|---|
[IT 상식] Edge 새 탭 페이지 변경하는 방법 (0) | 2022.10.31 |
[IT상식] 노트북 PC 윈도우 안전모드 부팅 방법 (0) | 2022.09.01 |
[IT 상식] c드라이브 용량 큰 파일 찾는 방법 (Tree Size 이용) (0) | 2022.08.20 |
[IT 상식] 버즈 프로 컴퓨터에서 헤드셋으로 사용하기(PC버전) (0) | 2022.08.14 |