[OS] 세마포어(Semaphore) vs 뮤텍스(Mutex)

HenryHong·2022년 7월 1일
0
post-thumbnail

본격적으로 세마포어와 뮤텍스에 대하여 알아보기 전에 임계 구역(Critical Section)에 대하여 이해해 봅시다.

임계 구역(Critical Section)이란?

임계 구역(Critical Section)은 여러 프로세스 혹은 스레드가 작업을 수행하면서 공유된 자원을 건드리게 될 수 있는데, 이때 동기화 처리를 제대로 해주지 않으면 문제가 발생할 수 있다고 저번 프로세스와 스레드 차이 포스팅에서 배웠습니다.
이렇듯 공유되는 부분이 굉장히 중요한데, 프로그램 코드 상에서 공유 자원에 접근하는 부분을 임계 구역(Critical Section)이라고 합니다.

이렇게 임계 구역에 여러 프로세스 및 스레드가 함부로 접근할 수 없도록 관리를 잘 해줘야 하는데, 이를 위해 사용하는 방식에 대표적으로 세마포어(Semaphore)와 뮤텍스(Mutex)가 있습니다.

세마포어(Semaphore)란?

세마포어(Semaphore)는 공유 자원에 여러 프로세스가 접근하는 것을 막는 것을 말합니다. 세마포어는 이를 위해서 현재 공유 자원의 상태를 나타내는 카운터 변수를 사용하게 됩니다. 이러한 변수는 실제로 운영체제 혹은 커널에 값으로 저장되며, 각 프로세스는 이를 확인할 수 있고 값을 변경할 수도 있게 됩니다.
각각의 프로세스들은 이런 상태값을 확인하여 자원을 즉시 사용할 수 있는 상태라면 즉시 사용할 수 있고 만약에 누군가가 자원을 사용중이라는 것을 인지하게되면, 반드시 일정 시간을 기다렸다가 사용하게 됩니다. 이런 방식을 통해 여러 프로세스가 공유 자원에 한꺼번에 접근하는 것을 막을 수 있습니다.
큰 특징으로는, 세마포어는 뒤에 나올 뮤텍스와 다르게 0혹은 1과같은 이진수 외에 더 큰 숫자를 가지게 할 수도 있어서 꼭 1개의 프로세스만이 자원을 점유하지는 않습니다. 카운터 변수의 값이 해당 공유 자원에 접근할 수 있는 임계치가 되며 이를 조정하여 접근할 수 있는 프로세스의 개수를 통제할 수 있습니다.

뮤텍스(Mutex)란?

뮤텍스(Mutex)는 상호 배제(Mutual Exclusion)를 뜻하는 말로, Critical Section을 가지는 쓰레드들의 Running time이 서로 겹치지 않도록 해주는 기법입니다.
세마 포어와 가장 큰 차이점으로는 공유 자원에 접근할 수 있는 대상의 개수 차이입니다. 뮤텍스는 1개의 스레드만이 공유 자원에 접근할 수 있도록 합니다.
뮤텍스에서는 Lock과 Unlock개념을 사용합니다. 즉, 이진 세마포어(Binary Semaphore)와 같은 개념입니다. 자원을 점유하고 있는 대상이 Lock을 할 수 있는 권한을 가지고 있어서 자원을 점유하기 시작할 때 들어가서 Lock을 걸어버립니다. 이렇게 되면 다른 대상들은 Unlock 상태가 될 때까지 기다렸다가 나중에 해당 공유 자원에 접근할 수 있게 됩니다.

결론

뮤텍스(Mutex)는 이진 세마포어(Binary Semaphore)로 세마포어의 일종입니다. 가장 큰 차이점으로는 뮤텍스는 오직 1개의 프로세스 혹은 스레드만이 공유 자원에 접근할 수 있고, 세마포어는 지정된 변수의 값만큼 접근할 수 있습니다. 또한 세마포어는 운영체제 혹은 커널 단위에서 해당 리소스 변수가 관리되어 현재 공유 자원을 사용 중인 대상 뿐만아니라 다른 프로세스 및 스레드도 잠금 상태를 해제할 수 있지만 뮤텍스는 프로세스 단에서 관리되고 해당 변수(Lock)을 가지고 있기 때문에 Lock을 가지고 있는 변수만이 Unlock을 할 수 있습니다.

References
https://jwprogramming.tistory.com/13
https://junghyun100.github.io/Semaphore&Mutex/

profile
주니어 백엔드 개발자

0개의 댓글