Mutex vs Semaphore

고장난 고양이·2022년 10월 7일
0

운영체제

목록 보기
20/21
post-thumbnail

프로세스간 공유메모리를 통해 공유된 자원에 여러개의 프로세스가 동시에 접근하면 Critical Section이 발생할 수 있다.
이러한 동시성 프로그래밍의 문제점중 '공유자원 관리'를 위해서 상호배제(Mutual Exclusion)을 만족시키기위해 Mutex와 Semaphore가 고안되었다.

임계영역

  • 여러 프로세스가 데이터를 공유하며 수행될 때, 각 프로세스에서 공유데이터를 접근하는 프로그램 코드 블록

  • 즉, 여러 프로세스가 동일 자원을 동시에 참조하여 값(공유하는 변수명, 파일 등)이 오염될 위험 가능성이 있는 영역

  • 프로그래밍 시, 성능 향상을 위해 임계영역을 최소화하는 설계를 해야 한다.

Mutex

  • 한 프로세스 당 key를 부여하여 이를 기반으로 한 상호배제 기법

  • key에 해당하는 어떤 객체가 있으며, 이객체를 소유한 스레드/프로세스만이 공유자원 접근이 가능하다.

  • 다중 프로세스들의 공유 리소스에대한 접근을 조율하기 위해 동기화(Synchronization) or 락(lock)을 사용

  • 즉, 뮤텍스 객체를 두스레드가 동시에 사용이 불가능하다.


쉬운 설명

뮤텍스는 화장실이 하나 뿐이 없는 식당과 비슷하다. 화장실을 가기 위해서는 카운터에서 열쇠를 받아 가야 한다.

당신이 화장실을 가려고 하는데 카운터에 키가 있으면 화장실에 사람이 없다는 뜻이고 당신은 그 열쇠를 이용해 화장실에 들어갈 수 있다.

당신이 화장실에서 행복한 시간을 보내고 있는데 다른 테이블에 있는 어떤 남자가 화장실에 가고 싶어졌다. 이 남자는 아무리 용무가 급하더라도 열쇠가 없기 때문에 화장실에 들어갈 수 없다. 결국 남자는 당신이 용무를 마친 후 나올 때까지 카운터에서 기다려야 한다.

곧이어 옆 테이블에 있는 남자도 화장실에 가고 싶어졌고 이 남자 또한 화장실에 들어가기 위해서는 카운터에서 대기해야한다.


이제 당신이 화장실에서 나와 카운터에 키를 돌려놓았다. 이제 기다리던 사람들 중 맨 앞에있던 사람은 키를 받을 수 있고 이를 이용해 화장실에 갈 수 있다.

이것이 뮤텍스가 동작하는 방식이다. 화장실을 이용하는 사람은 프로세스 혹은 쓰레드이며 화장실은 공유자원, 화장실 키는 공유자원에 접근하기 위해 필요한 어떤 오브젝트이다.

즉 뮤텍스는 Key 에 해당하는 어떤 오브젝트가 있으며 이 오브젝트를 소유한 (쓰레드,프로세스) 만이 공유자원에 접근할 수 있다.

Semaphore

  • 공유자원의 상태를 나타낼 수 있는 카운터라고 생각하면 편할 듯

  • 최대 허용치만큼 프로세스를 공유자원에 접근가능하게 한다.

  • 각 프로세스는 세마포어 값을 확인하고 변경가능하다.

  • 자원을 그만 사용하게되면 대기하던 프로세스가 비어있는 리소스를 사용한다.

  • 일반적으로 비교적 긴 시간을 확보하는 리소스에 대해 이용한다.

  • 유닉스 프로그래밍에서 세마포어는 운영체제의 리소스를 경쟁적으로 사용하는 다중 프로세스에서 행동을 조정하거나 또는 동기화하는 기술


쉬운 설명

세마포어는 손님이 화장실을 좀 더 쉽게 이용할 수 있는 레스토랑이다. 세마포어를 이용하는 레스토랑의 화장실에는 여러 개의 칸이 있다. 그리고 화장실 입구에는 현재 화장실의 빈 칸 개수를 보여주는 전광판이 있다.

만약 당신이 화장실에 가고 싶다면 입구에서 빈 칸의 개수를 확인하고 빈 칸이 1개 이상이라면 빈칸의 개수를 하나 뺀 다음에 화장실로 입장해야 한다. 그리고 나올 때 빈 칸의 개수를 하나 더해준다.

모든 칸에 사람이 들어갔을 경우 빈 칸의 개수는 0이 되며 이때 화장실에 들어가고자 하는 사람이 있다면 빈 칸의 개수가 1로 바뀔 때까지 기다려야 한다.

사람들은 나오면서 빈 칸의 개수를 1씩 더한다. 그리고 기다리던 사람은 이 숫자에서 다시 1을 뺀 다음 화장실로 돌진한다.

이처럼 세마포어는 공통으로 관리하는 하나의 값을 이용해 상호배제를 달성한다.

세마포어도 아까와 똑같이 화장실이 공유자원이며 사람들이 쓰레드, 프로세스이다. 그리고 화장실 빈칸의 개수는 현재 공유자원에 접근할 수 있는 쓰레드,프로세스의 개수를 나타낸다.

Mutex vs Semaphore

정리

  • 뮤텍스: 한 쓰레드, 프로세스에 의해 소유될 수 있는 Key🔑를 기반으로 한 상호배제기법

  • 세마포어: Signaling mechanism. 현재 공유자원에 접근할 수 있는 쓰레드, 프로세스의 수를 나타내는 값을 두어 상호배제를 달성하는 기법

  1. 뮤텍스 동기화 대상이 1개일때 사용, 세마포어는 여러개일때 사용

  2. 세마포어는 뮤텍스가 될 수 있다. but, 뮤텍스는 세마포어가 될 수 없다.

  3. 뮤텍스는 상태가 0,1만 가지기에 lock을 가질 수 있음

  4. Mutex는 소유하고 있는 스레드만이 이 Mutex를 해제할 수 있다. 반면, Semaphore는 Semaphore를 소유하지 않는 스레드가 Semaphore를 해제할 수 있다.

  5. Semaphore는 시스템 범위에 걸쳐 있고, 파일 시스템 상의 파일로 존재한다. 반면, Mutex는 프로세스의 범위를 가지며 프로세스 종료될 때 자동으로 Clean up 된다.

참고

profile
개발새발X발일지

0개의 댓글