CS/운영체제

[운영체제] 뮤텍스락과 세마포어 조금 더 깊게 이해해보기

동구름이 2024. 8. 21. 15:39

 프로세스 동기화 도구에는 크게 뮤텍스 락과 세마포어가 있다.

 

 둘 차이를 간단하게만 말해보면, 뮤텍스 락은 공유 자원에 하나의 스레드가 접근가능하고 세마포어는 공유자원에 여러 스레드가 접근 가능하다는 것이다. 

 

 

 지금까지 너무 얕게만 이해하고 있었다는 생각을 했다. 세마포어는 여러 스레드도 접근 가능하고, 뮤텍스 락을 대체할 수도 있기 때문에, 세마포어가 좋은 거 아닌가 라는 생각을 막연하게 해왔었다.

 

 하지만 내부 동작 방식을 살펴보면 이야기는 달라진다. 문맥 교환이라는 오버헤드를 배제한 설명이기 때문이다. 이게 무슨 말인지 한번 살펴보자.

 

 

 

1. 뮤텍스락

 뮤텍스락은 공유 자원에 접근하기 위해 뮤텍스를 획득해야하고, 자원 사용이 끝나면 뮤텍스를 해제하는 방식이다. 그리고 하나의 스레드만 뮤텍스를 획득 가능하고 다른 스레드는 뮤텍스가 해제될 때까지 대기해야한다.

 

이해한 것을 그림으로 그려보았다.

만약 공유 자원을 Thread1이 사용 중이라면, Thread2는 접근할 수 없다. 대신 계속해서 자원에 접근해본다.

 

Thread1이 공유 자원을 다 쓰고 뮤텍스를 반납하게 되면, 계속해서 찔러보면 Thread2가 공유자원에 접근할 수 있게 된다.

 

 

 이렇게 계속해서 자원을 확인하는 방식을 Busy waiting이라고 한다. 이 방식의 단점은 당연하게도 무한 루프를 계속해서 돌아야한다는 것인데, 무한 루프를 돌면서 CPU 자원이 낭비된다는 단점이 있다.

 

 

 

 

2. 세마포어

 세마포어는 특정 자원에 동시에 접근할 수 있는 스레드나 프로세스의 최대 개수를 제어한다. 여기서 중요한 것은 만약 세마포어의 값이 0이라면 해당 스레드가 대기열에 들어간다는 것이다.

 

그림으로 간단하게 그려보았다. Thread 1이 사용 중이면 Thread 2는 대기열로 이동한다.

 

 

그러다가 Thread1의 작업이 끝나면, 대기열로 신호를 보낸다. 그러면 대기열에 있던 Thread2가 공유 자원에 접근할 수 있게 된다.

 

 

 

여기까지 살펴본 내용으로는 세마포어가 뮤텍스락에 비해 좋아보인다.

 

 무한 루프를 도는 오버헤드도 없고, 그렇기에 CPU 자원을 아낄 수 있기 때문이다. 게다가 바이너리 세마포어는 뮤텍스와 유사하게 동작하기 때문에 굳이 뮤텍스락을 사용할 이유도 없어보인다.

 

 

하지만, 문맥 교환을 고려해야한다.

 

 

 

 

3. 문맥 교환을 고려해 비교하기

 문맥 교환은 간단히 말해, 프로세스의 흐름을 유지하는 것이다. CPU가 다른 작업을 진행하다가도 다시 프로세스의 흐름을 이어나갈 수 있게 하는 것이다.

 

 

[운영체제] 3. 프로세스 : PCB, 문맥 교환, 프로세스를 스케줄링하기 위한 큐, Ready Queue와 다양한 Dev

1. PCB (Process Control Block)운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보를 말합니다. PCB를 구성하는 것은 사진과 같이 4가지 정도로 나눌 수 있습니다. (1) OS가 관리상 사용

dcloud.tistory.com

 

 

 뮤텍스 락에서의 스레드는 CPU가 자원을 얻을 때까지 계속해서 스레드를 가지고 있다. 그래서 다른 작업으로 전환되지 않기 때문에, 스레드의 상태는 실행 상태로 유지된다. 

 

 즉 스레드가 CPU에 고정되어있는 상태이기 때문에, 문맥 교환이 필요하지 않다. 그래서 오버헤드가 낮기 때문에 성능이 더 좋아질 수 있다.

 

뮤텍스는 문맥 교환이 자주 일어나는 것을 피하기 위해 설계된 방식이라는 것을 알 수 있다.

 

 

하지만 세마포어에서의 스레드는 대기열에 들어간다. 이 경우에 스레드는 Sleep 상태로 전환되어서, CPU는 다른 작업을 수행하게 된다. 대기 상태에 있는 스레드가 다시 실행 상태가 되면서 문맥 교환이 발생해 오버헤드가 증가하게 된다.

 

 

 

 

 따라서, 단순히 세마포어가 좋은 방식이라고 말할 수 없다. 실제 운영체제에서도 뮤텍스 락과 세마포어를 함께 사용하는 이유는 문맥 교환에서 오는 오버헤드가 Busy Waiting과 비교해 클 수 있기 때문이다.