[OS] Mutex와 Semaphore

김현수·2024년 5월 15일
0
post-thumbnail

여러개의 프로세스가 공유메모리릍 통해 공유된 자원에 접근하면 Critical Section 문제가 발생하게 된다.

Critical Section이란?

멀티 프로그래밍에서 둘 이상의 스레드(멀티스레드)가 동시에 접근해서는 안되는 공유 자원(파일, 입출력, 공유 데이터 등)을 접근하는 명령문 또는 코드의 일부 영역을 말합니다.

따라서 이러한 Critical Section 문제를 해결하기 위해서는 Critical Section 문제가 발생하기 전에 예방하거나 회피하는 방법이 있는데 그 중 예방하는 방식인 Mutex와 Semaphore에 대해서 알아보자.

Mutex:

Mutex는 공유된 자원의 데이터나 Critical Serction에 하나의 프로세스나 쓰레드가 접근하는 것을 막아주는 기술이다. Critical Section에 들어간 쓰레드의 실행시간이 서로 겹치지 않고 각각 단독으로 실행되게 한다. 어떠한 방식으로 막아주는지 화장실로 예를 적절히 든 포스팅이 있어서 이를 활용하여 설명하고자 한다.

뮤텍스(Mutex)와 세마포어(Semaphore)의 차이


식당에는 화장실이 하나밖에 없다. 화장실을 가기 위해서는 카운터에서 열쇠를 받아야 한다. 만약 화장실을 가려고 할 때 카운터에 키가 있으면 화장실에 사람이 있다는 뜻이고 그 키를 이용해서 화장실에 들어갈 수 있다.

누군가 화장실에 들어가서 일을 보고 있을때 다른 손님이 화장실에 가고 싶어졌다. 이 손님은 아무리 급해도 키가 없기 때문에 화장실에 들어갈 수 없다. 결국 손님은 먼저 들어간 손님이 일을 마칠때까지 카운터에서 기다려야 한다.

다른 손님도 화장실에 가고 싶어졌고 이 손님 또한 카운터에서 대기를 해야한다.

이제 화장실에서 일을 보던 손님이 나와 카운터에 키를 돌려놓았다. 제일 오래 기다린 손님은 키를 받을 수 있고 화장실에 갈 수 있다.

이것이 뮤텍스가 동작하는 방식이다. 화장실을 이용하는 손님은 프로세스 or 쓰레드이고 화장실은 Critical Section, 화장실 키는 Critical Section에 접근하기 위해 필요한 키이다.

정리하면 뮤텍스가 동작하는 방식은 다음과 같다. 한 프로세스에 의해 소유될 수 있는 Key를 기반으로 한 상호배제 기법이고 Key에 해당하는 어떤 객체(Object)가 있으며, 이 객체를 소유한 스레드/프로세스만이 Critical Sectoin에 접근할 수 있다. 다중 프로세스들의 공유 리소스에 대한 접근을 조율하기 위해 동기화(Synchronization) 또는 락(Lock)을 사용함으로써 뮤텍스 객체를 두 스레드가 동시에 사용할 수 없다.

Semaphore:

Semaphore도 Mutex와 마찬가지로 공유된 자원의 데이터나 Critical Serction에 하나의 프로세스나 쓰레드가 접근하는 것을 막아주는 기술이다. 똑같이 화장실 예를 들어보자.

세마포어는 뮤텍스와 다르게 화장실을 더 쉽게 이용할 수 있다. 화장실에는 여러개의 칸이 있고 화장실 입구에는 현재 화장실의 빈 칸 개수를 보여주는 전광판이 있다.

만약 화장실게 가고싶다면 빈 칸의 개수를 확인하고 빈 칸이 1개 이상 있다면 빈 칸의 개수를 하나 빼주고 화장실에 들어가야 한다. 그 후 나올 때는 다시 빈 칸의 개수를 하나 더해준다.

모든 칸에 사람이 들어갔을 경우 빈 칸의 개수는 0이 되며 이때 화장실에 들어가고 싶은 손님이 있다면 빈 칸의 개수가 1일 될 때까지 기다려야 한다.

빈 칸이 생긴 경우 기다리던 손님은 1이 된 빈 칸의 개수에서 다시 1을 뺀 후 화장실을 이용한다.

이것이 세마포어가 작동하는 방식이다. 뮤텍스와 마찬가지로 화장실을 이용하는 손님은 프로세스 or 쓰레드이고 화장실은 Critical Section, 화장실 키는 Critical Section에 접근하기 위해 필요한 키이다.

정리하자면 세마포어는 다음과 같은 방식으로 작동한다. Critical Section에 접근할 수 있는 프로세스의 최대 허용치 만큼 동시에 사용자가 접근할 수 있으며 각 프로세스는 세마포어의 값을 확인하고 변경할 수 있다. 자원을 사용하지 않는 상태가 될 때 대기하던 프로세스가 즉시 자원을 사용하고 만약 다른 프로세스에 의해 사용중이면 대기해야 한다. 세마포어는 이진수를 사용하거나 추가적인 값을 가질 수 있다.

[OS] 뮤텍스(Mutex)와 세마포어(Semaphore)란?
Critical Section이란 무엇일까?

1개의 댓글

comment-user-thumbnail
2024년 5월 16일

와우 비유가 완전히 알기쉽네여

답글 달기