[OS] 뮤텍스와 세마포어로 데드락을 방지할 수 있을까?

류지수·2023년 7월 31일
0

Study

목록 보기
7/9

뮤텍스 (Mutex)

뮤텍스 : 여러 프로세스나 쓰레드가 동시에 공유 자원에 접근하는 것을 제어하기 위한 방법

여기서LockUnLock 라는 것을 통해서 동시에 공유 자원에 접근하는 것을 제어하게 된다.

예를 들어
A 쓰레드가 Lock을 걸고 공유자원을 쓰고 있으면,
B 쓰레드는 공유자원을 쓰고 싶어도 A thread가 UnLock할 때까지 wait 상태가 된다.


즉, 여러 쓰레드가 공유 자원을 동시에 사용할 수 없도록,

코드를 짤 때는 Lock 과 UnLock을 추가하여 접근을 제어해줘야한다.

세마포어 (Semaphore)

세마포어 : 지정된 개수만큼의 스레드가 동시에 접근하도록 동기화할 수 있게 하는 방식

공유 자원을 하나의 스레드만 접근 할 수 있게 하는 방식었던 뮤텍스와 달리 세마포어는 하나 이상의 컴포넌트가 공유자원에 접근하도록 허용할 수 있다.

Locrk을 취득한 프로세스만이 Unlock할 수 있는 뮤텍스와 달리 세마포어는 Unlock의 주체가 Lock과 같지 않아도 된다. 세마포어는 Lock의 동시 접근만을 제어할 뿐 Unlock을 시도하는 프로세스가 Lock을 취득했던 프로세스인지 확인하지 않는다.
이로 인해, Lock을 취득했던 프로세스가 Lock을 해제하지 않은채 비정상 종류가 되었다로 하더라도, 세마포어에서는 다른 프로세스가 대신 Unlock을 하여 무한히 대기하는 상황을 회피할 수 있다.

*세마포어는 뮤텍스가 될 수도 있다.
1개의 프로세스 또는 스레드만 공유 자원을 사용할 수 있게 하면 뮤텍스처럼 이용이 가능하다.
이러한 특성 때문에 뮤텍스를 이진 세마포어라 하기도 한다.

데드락 (Deadlock)

데드락 : 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태

예를 들어
A 프로세스가 Lock을 건 상태로 (UnLock을 하지 못하고) 죽어버린다면, B 프로세스는 A 프로세스가 UnLock을 하지 않았기 때문에 공유 자원을 쓰지 못하고 무한정 기다리게 된다.

  • 동일 요청이 두 번 오게 되는 시점에서도 데드락 걸릴 확률이 높다.


Q. 뮤텍스와 세마포어가 데드락을 예방할 수 있는지?

  • 뮤텍스만으로 교착 상태를 예방할 수 없다. 뮤텍스는 한 번에 하나의 스레드만 공유 리소스에 액세스할 수 있도록 보장하는 상호 배제를 제공하는 동기화 메커니즘이다. 뮤텍스는 데이터 레이스(Data Race)를 방지하고 데이터 무결성을 유지하는데 도움이 되지만 본질적으로 교착 상태 문제를 해결하지 않는다. 즉, 뮤텍스는 공유 자원에 대한 엑세스를 관리하는 역할을 하지만 뮤텍스만으로 교착상태를 방지할 수 없다. Timeout이나 데드락 탐지 및 복구와 같은 설계가 필요하다.
* 데이터 레이스(Data Race)
여러 프로세스/스레드가 공유된 데이터를 읽고 쓰는 작업을 할 때 실행 순서에 따라서 잘못된 값을 읽거나 쓰게 되는 상황. 
병렬 처리를 하는 경우에 아주 흔하게 발생하므로 뮤텍스, 세마포어 등으로 처리해준다.
  • 세마포어 역시 뮤텍스와 같이 자체가 교착 상태를 직접적으로 막지는 않는다. 세마포어는 공유 자원에 대한 액세스를 관리하는 데 도움이 될 수 있는 동기화 매커니즘이지만 교착 상태를 방지하기 위해 독립적으로 사용할 수 없다.

Reference

profile
AI Engineer가 될테야

0개의 댓글