뮤텍스(Mutex)와 세마포어(Semaphore)는 모두 병행성(Concurrency)과 동기화(Synchronization)를 위해 사용되는 도구들이지만, 몇 가지 중요한 차이가 있습니다.
- 사용 목적:
- 뮤텍스: 주로 임계 영역(critical section)에 대한 접근을 조절하기 위해 사용됩니다. 임계 영역은 한 번에 하나의 스레드만 접근할 수 있는 부분을 말합니다.
- 세마포어: 뮤텍스와 비슷하게 임계 영역의 접근을 제어할 수 있지만, 더 일반적인 목적으로 사용됩니다. 세마포어는 특정 자원의 개수를 나타내며, 이를 이용해 여러 스레드 간의 작업을 조절할 수 있습니다.
- 소유 가능 여부:
- 뮤텍스: 특정 스레드가 뮤텍스를 소유하고 있을 때, 그 스레드만이 해당 뮤텍스를 해제할 수 있습니다. 이는 뮤텍스의 소유권이 있음을 의미합니다.
- 세마포어: 일반적으로는 소유 개념이 없어 여러 스레드가 세마포어를 조작할 수 있습니다.
- 동작 방식의 유연성:
- 뮤텍스: 간단하고 직관적인 동작 방식으로 주로 단일 리소스에 대한 동기화에 사용됩니다.
- 세마포어: 더 유연하게 여러 리소스를 다루고, 여러 스레드 간의 복잡한 동기화 상황을 다룰 수 있습니다.
선택은 문제의 본질과 필요한 동기화 수준에 따라 다릅니다. **일반적으로 뮤텍스는 단순한 상호배제(Mutual Exclusion)를 위해, 세마포어는 자원의 개수나 더 복잡한 상황에서 사용(작업 간의 실행 순서)**됩니다.
-
이진 세마포어와 세마포어의 차이점
연산:
- 이진 세마포어: 주로 P(Produce)와 V(Consume) 연산을 사용합니다. P 연산은 값이 1보다 크면 1을 감소시키고, 값이 0이면 대기 상태로 전환합니다. V 연산은 값이 0보다 크면 1을 증가시키고, 대기 중인 스레드를 깨웁니다.
- 세마포어: P와 V 연산 외에도 일반적으로 wait(W)와 signal(S) 또는 down과 up 연산이라고도 부릅니다. 여러 리소스를 관리하기 위해 값이 음수로 내려갈 수 있고, 이를 통해 리소스의 수를 나타낼 수 있습니다.
이진 세마포어와 세마포어는 각각의 특징에 따라 다른 상황에서 사용됩니다. 이진 세마포어는 주로 상호배제를 위해, 세마포어는 여러 리소스를 관리하거나 여러 프로세스 간의 동기화를 위해 사용됩니다.
-
이진 세마포어와 뮤텍스의 차이점
뮤텍스는 priority inheritance 속성을 가진다. 세마포는 그 속성이 없다.
→ Lock을 획득한 프로세스 이후에 우선순위가 높은 프로세스가 존재한다면 Lock을 획득한 프로세스의 우선순위를 높여 더 빠르게 작업을 끝낸다.
Spin Lock은 프로세스가 Lock을 얻을 때까지 대기하는 동안 계속해서 반복문을 실행하면서 기다리는 방식입니다. 대부분의 경우, Spin Lock은 바쁜 대기(busy-wait)로서, Lock을 얻을 때까지 반복문을 돌면서 검사하는 방법을 채택합니다.
장점:
- 단순성: 구현이 간단하며, 특히 커널 내부와 같이 컨텍스트 전환 비용이 높은 환경에서 효과적일 수 있습니다.
단점:
- Busy-Wait: 대기하면서 계속 반복문을 실행하므로, 다른 스레드나 프로세스에 CPU를 양보하지 않고 계속해서 자원을 소비합니다.
- 효율성 문제: 특히 Lock을 소유하고 있는 스레드가 빨리 해제되지 않을 경우, 다른 스레드들은 계속해서 반복문을 돌며 자원을 낭비하게 됩니다.
→ 멀티 코어 환경이고, critical section에서의 작업이 컨텍스트 스위칭보다 더 빨리 끝난다면 스핀락이 뮤텍스보다 더 이점이 있다.
단점 해결 방안 : Lock을 획득할 수 없다면 스레드를 대기 큐에 넣어준다. → 뮤텍스, 세마포
https://www.youtube.com/watch?v=gTkvX2Awj6g
https://hogwart-scholars.tistory.com/entry/OS-Spin-Lock-스핀락에-대해-알아보자
뮤텍스와 세마포어 모두 커널이 관리하기 때문에, Lock을 얻고 방출하는 과정에서 시스템 콜을 호출해야 합니다. 이 방법의 장단점이 있을까요? 단점을 해결할 수 있는 방법은 없을까요?
장점:
- 안전성: 커널이 뮤텍스와 세마포어를 관리하므로, 이를 이용한 동기화는 안전하게 이루어집니다. 커널은 운영 체제 수준에서 스레드 및 프로세스 간의 동기화를 보장할 수 있습니다.
- 효율성: 커널이 리소스를 관리하므로 여러 프로세스 간의 동기화에 대한 처리를 효율적으로 수행할 수 있습니다.
- 크로스-프로세스 동기화: 뮤텍스와 세마포어는 여러 프로세스 간에도 동기화를 제공할 수 있습니다.
단점:
- 시스템 콜 오버헤드: 뮤텍스와 세마포어를 이용한 동기화는 시스템 콜을 필요로 합니다. 시스템 콜은 커널 모드로 전환되어야 하므로 오버헤드가 발생할 수 있습니다.
- 성능 저하: 빈번한 Lock과 Unlock 작업이 발생할 경우, 시스템 콜 오버헤드로 인해 성능이 저하될 수 있습니다.
- 데드락 가능성: 잘못된 사용으로 인해 데드락이 발생할 수 있습니다. 이는 여러 뮤텍스나 세마포어를 사용할 때 상호 교착상태에 빠질 가능성이 있습니다.
해결 방법:
- 유저 모드 동기화 기법: 커널이 아닌 사용자 모드에서 동기화를 수행하는 방법을 고려할 수 있습니다. 이는 시스템 콜을 피할 수 있어 오버헤드를 줄일 수 있습니다. 그러나 이 경우에는 일부 안전성 및 기능 제약이 존재할 수 있습니다.