Q. 뮤텍스와 세마포어의 차이점은 무엇인가요?
공유된 자원에 여러개의 프로세스가 동시에 접근하게 되면 임계영역 문제가 발생할 수 있습니다. 이를 해결하기 위해 데이터를 한번에 하나의 프로세스만 접근할 수 있도록 제한을 두는 동기화 방식을 취해야합니다.
동기화 도구에 뮤텍스와 세마포어가 있습니다.
*임계영역이란?
동시접근, 공유되는 자원에서 문제가 발생하지 않도록 독점을 보장해줘야하는 영역
뮤텍스
- 다중 프로세스들의 공유 리소스에 대한 접근을 조율하기 위해 동기화 or 락을 사용
- 뮤테스 객체를 두 스레드가 동시에 사용 불가능
뮤텍스는 Key에 해당하는 어떤 오브젝트가 있으며 이 오브젝트를 소유한 스레드, 프로세스 만이 공유자원에 접근 가능하다.
세마포어
- 공유자원에 접근할 수 있는 프로세스의 최대 허용치만큼 사용자가 동시에 접근 가능
- 자원을 사용하지 않는 상태가 되면, 대기하던 프로세스가 즉시 자원을 사용
- 각 프로세스는 세마포어의 값을 확인하고 변경 가능
현재 공유자원에 접근할 수 있는 스레드, 프로세스의 수를 나타내는 값을 두어 상호배제를 달성하는 기법
- [비유]
- 한 사람이 들어가면 문을 잠궈 다른 사람이 들어오지 못하게 하고, 문을 열어 잠금을 해제합니다.주차장에 10대까지 주차가 가능하다면, 차가 들어갈 때마다 카운터가 줄고, 나올 때마다 카운터가 늘어납니다. 주차장이 가득 차면 더 이상 들어갈 수 없습니다.
- 세마포어는 주차장 입구의 카운터입니다.
- 뮤텍스는 화장실 문 잠금장치입니다.
| 특징 | 뮤텍스(Mutex) | 세마포어(Semaphore) |
| 접근 가능 스레드 | 한 번에 1개의 스레드만 접근 가능 | N개(1개이상)의 스레드가 동시에 접근 가능 |
| 초기값 | 항상 1로 고정 | 초기값을 자유롭게 설정 가능 |
| 소유권 | 잠금한 스레드만 해제 가능 | 소유권이 없으므로 다른 스레드가 해제 가능 |
| 용도 | 공유 자원에 단일 접근을 보장 | 제한된 자원에 다중 접근을 제어 |
| 구현 난이도 | 간단 | 복잡 |
| 적합한 상황 | 단순한 동기화 | 다중 지원 동기화 |
뮤텍스는 단일 스레드 접근을 보장하고, 세마포어는 제한된 자원에 대한 다중 접근을 제어합니다.
꼬리질문
1. 이진 세마포어와 뮤텍스의 차이에 대해 설명해 주세요.
- 이진 세마포어와 뮤텍스는 둘다 단일 자원에 대해 작동하며, 이진 세마포어는 값이 0 또는 1이고, 뮤텍스는 Locked(잠금) 또는 Unlocked(잠금 해제) 상태를 가집니다
이진 세마포어와 뮤텍스는 모두 단일 자원의 접근을 제어하기 위한 도구지만, 소유권과 목적에서 차이가 있습니다. 이진 세마포어는 소유권이 없기 때문에 자원을 획득한 스레드가 아닌 다른 스레드도 자원을 해제할 수 있습니다. 반면, 뮤텍스는 소유권을 가진 스레드만 자원을 해제할 수 있어 데이터 무결성을 보장합니다.
이진 세마포어의 주된 목적은 단순 자원 보호와 스레드 간 신호 전달입니다. 예를 들어, 스레드 A가 이벤트 발생 시 signal을 호출하면, 이를 대기(wait) 중이던 스레드 B가 실행됩니다. 뮤텍스는 신호 전달 목적으로는 사용되지 않으며, 단일 자원의 안전한 보호와 소유권 관리에 특화되어 있습니다.
결론적으로, 이진 세마포어는 신호 전달과 간단한 자원 보호가 필요할 때 적합하고, 뮤텍스는 소유권 관리가 중요하고 데이터 무결성을 보장해야 하는 경우에 적합합니다.
- 세마포어와 이진 세마포어의 차이점
특징 세마포어 이진 세마포어 값의 범위 0 - 양의정수까지 0 또는 1 사용 목적 다중 자원 관리 단일 자원 보호, 신호 전달 동시 접근 허용 스레드 여러 개 한 개 사용 사례 커넥션 풀 임계영역 보호, 스레드 동기화
2. Lock을 얻기 위해 대기하는 프로세스들은 Spin Lock 기법을 사용할 수 있습니다. 이 방법의 장단점은 무엇인가요? 단점을 해결할 방법은 없을까요?
Race Condition(경쟁 상태) 상황에서 Lock이 반환될 때까지, 즉 Critical section(임계영역)에 진입할 때까지 프로세스가 재시도 하며 대기하는 상태
*Critical Section : 여러 스레드 또는 프로세스가 공유 자원에 접근할 수 있는 코드 영역
*Race Condition : 프로세스가 수행되는 순서에 따라 결과 값이 달라질 수 있는 상황
스핀락
Spinlock은 특정 자료구조에 대한 Lock을 얻거나 해제하는 방식으로 공유 데이터에 대한 접근 권한을 관리하는 동기화 기법입니다. 이 방식은 Lock을 얻을 때까지 바쁜 대기(busy waiting) 상태로 계속해서 Lock을 얻을 수 있는지 확인하며, 획득하면 내부 코드를 수행하고 종료 후 Lock을 해제합니다. Spinlock은 획득/해제만 존재하며, 공유 자원에 대한 접근은 한 번에 하나의 컴퍼넌트만 할 수 있습니다. 또한, Lock을 획득한 스레드만이 해제할 수 있습니다.
이 기법은 **운영체제의 스케줄링 지원을 받지 않기 때문에 문맥 교환(Context Switching)**이 일어나지 않으며, 대기 중인 스레드는 CPU 자원을 계속 차지하게 됩니다. 따라서, Lock을 자주 얻고 해제하는 과정이 짧고 빠를 때 유리합니다.
- 장점
- Spinlock은 구현이 간단하고 직관적이어서 코드 관리가 용이합니다.
- 운영체제의 스케줄링을 받지 않기 때문에 문맥 교환이 없고, 이로 인해 문맥 전환에서 발생하는 비용을 절감할 수 있습니다.
- Lock을 짧은 시간 동안만 유지하고 빠르게 해제할 수 있어, 대기 시간이 짧을 경우 성능이 향상됩니다.
- 단점
- Starvation(기아상태) 발생 : 어떤 스레드가 Lock을 오랫동안 유지하면 다른 스레드는 계속 Spinlock을 돌게 되어 기아 현상이 발생할 수 있습니다.
- Busy waiting : 대기 중에도 CPU 자원을 계속 사용하게 되어, Lock을 얻을 때까지 무의미한 작업을 반복하며 자원을 낭비합니다.
단점을 해결할 방법으로는 대표적으로 하이브리드 락킹, 백오프 전략이 있습니다.
백오프 전략은 Spinlock을 사용하는 동안, 대기 중인 스레드가 계속해서 Spinlock을 확인하는 대신, 일정 시간마다 대기 간격을 점진적으로 늘려가는 방식입니다. 처음에는 짧은 시간 동안 대기하고, 그 후에는 점점 더 긴 시간 동안 대기하게 되죠. 이 방법은 CPU 자원을 낭비하지 않도록 도와주고, 여러 스레드가 동시에 경합하는 상황에서 과도한 자원 소모를 방지할 수 있습니다. 예를 들어, 첫 번째 시도에서 Spinlock을 얻지 못하면, 그 다음에는 조금 더 긴 시간 동안 대기하고 다시 시도하는 방식입니다. 하지만 백오프 전략을 적용하려면 대기 시간을 얼마나 늘릴지 잘 설정해야 하고, 설정이 잘못되면 오히려 성능이 떨어질 수 있습니다.
하이브리드 락킹은 Spinlock을 사용하다가, 일정 시간이 지나도 여전히 Lock을 얻지 못하면 다른 동기화 기법(예, Mutex나 세마포어)으로 전환하는 방식입니다. 초기에는 Spinlock을 통해 빠르게 자원을 얻으려고 시도하고, 대기 시간이 길어지면 더 안정적인 동기화 기법으로 전환하는 거죠. 이 방법은 상황에 맞게 최적화된 동기화 방식을 사용하여 성능을 최적화할 수 있습니다. 하지만 대기 시간이 길어지는 경우, 하이브리드 락킹은 성능을 크게 향상시킬 수 있는 유용한 방법입니다.
3. 뮤텍스와 세마포어 모두 커널이 관리하기 때문에, Lock을 얻고 방출하는 과정에서 시스템 콜을 호출해야 합니다. 이 방법의 장단점이 있을까요? 단점을 해결할 수 있는 방법은 없을까요?
- 장점
- 동기화의 일관성과 안전성 보장
- 멀티스레딩 지원
- 기능적 유연성 : 세마포어와 뮤텍스는 다양한 동기화를 지원하며, 특히 세마포어는 여러 스레드가 동시에 접근할 수 있는 자원의 수를 관리할 수 있는 등 다양한 용도로 활용가능
- 단점
- 시스템 콜로 인한 오버헤드
- 사용자 모드 → 커널모드로 전환 되는 과정에서 문맥교환이 일어나며, 이로 인해 특히 빈번한 동기화가 필요한 시스템에서 성능이 크게 저하될 수 있습니다.
- 스레드 블로킹 및 기아현상 발생
- 대기중인 스레드가 블로킹 될 수 있어, 블로킹 상태에 있는 스레드는 대기중에 CPU 지원을 소모하지 않지만, 다른 스레드가 Lock을 획득할 때까지 대기해야 하므로 기아(Starvation) 문제나 스레드 지연이 발생할 수 있음.
- 문맥교환
- 시스템 콜로 인한 오버헤드
단점 해결 방안
→하이브리드 락킹, 스핀락 사용
'CS 준비' 카테고리의 다른 글
| www.github.com을 브라우저에 입력하고 엔터를 쳤을 때 (1) | 2025.02.04 |
|---|---|
| Q. TCP와 UDP의 차이에 대해 설명해 주세요. (0) | 2025.02.04 |
| 세그멘테이션과 페이징의 차이점 (0) | 2025.01.18 |
| Q. 가상 메모리란 무엇인가요? (0) | 2025.01.18 |
| 프로세스 스케줄링 알고리즘 (0) | 2025.01.13 |