뮤텍스 대 Semaphore – 그들 사이의 차이점
뮤텍스와 뮤텍스의 주요 차이점 Semaphore
- Mutex는 잠금 메커니즘이지만 Semaphore 신호 전달 장치이다
- Mutex는 단지 객체일 뿐이지만 Semaphore 정수
- 뮤텍스에는 하위 유형이 없지만 세마포에는 계산 세마포와 이진 세마포의 두 가지 유형이 있습니다.
- Semaphore 대기 및 신호 작업 수정을 지원하는 반면, Mutex는 리소스를 요청하거나 해제하는 프로세스에 의해서만 수정됩니다.
- Semaphore 값은 wait() 및 signal() 연산을 사용하여 수정되는 반면, Mutex 연산은 잠기거나 잠금 해제됩니다.
여기에서는 Mutex와 차이점을 분석했습니다. Semaphore 장단점을 종합적으로 평가할 것입니다.
Mutex에 대한 일반적인 사실과 Semaphore
내 실습을 바탕으로 Mutex와 관련된 몇 가지 일반적인 사실을 소개합니다. Semaphore:
- 하나의 작업만 뮤텍스를 획득할 수 있습니다. 따라서 뮤텍스에는 소유권이 있으며 소유자만이 이를 해제할 수 있습니다.
- 뮤텍스와 세마포어를 사용하는 이유는 구현의 유사성으로 인해 다를 수 있습니다. 뮤텍스를 이진 세마포어라고 합니다.
- 잘 알려진 오해 중 하나는 Mutex와 Semaphores는 거의 동일하며 유일한 차이점은 Mutex가 1까지 셀 수 있다는 점입니다. Semaphore0부터 N까지 셀 수 있어요.
- 바이너리 세마포어와 뮤텍스 사이에는 항상 불확실성이 있습니다. 뮤텍스가 이진 세마포어라는 말을 들을 수도 있는데 이는 올바르지 않습니다.
무엇이 Semaphore?
세마포어 는 단순히 음수가 아닌 변수이며 스레드 간에 공유됩니다. 세마포어는 신호 메커니즘이며 세마포어를 기다리는 스레드는 다른 스레드에서 신호를 받을 수 있습니다. 1) 대기 및 2) 신호라는 두 가지 원자적 연산을 사용합니다. 프로세스 동기화.
A 신호기 설정 방법에 따라 리소스에 대한 액세스를 허용하거나 허용하지 않습니다.
사용 Semaphore
단일 버퍼의 경우 4KB 버퍼를 1개의 XNUMXKB 버퍼로 분리할 수 있습니다. Semaphore 이 네 개의 버퍼와 연관될 수 있습니다. 이를 통해 사용자와 제작자는 동시에 다른 버퍼에서 작업할 수 있습니다.
의 장점 Semaphore
실제로 세마포어 사용의 주요 이점은 다음과 같습니다.
- 둘 이상의 스레드가 임계 섹션에 액세스할 수 있도록 허용합니다.
- Semaphores는 기계 독립적입니다.
- Semaphores는 마이크로커널의 기계 독립적인 코드로 구현됩니다.
- 여러 프로세스가 임계 섹션에 들어가는 것을 허용하지 않습니다.
- 세마포어에는 바쁜 대기 스케줄이 있기 때문에 처리 시간과 자원의 낭비가 없습니다.
- 이는 기계 독립적이며 마이크로커널의 기계 독립적 코드에서 실행되어야 합니다.
- 이를 통해 리소스를 유연하게 관리할 수 있습니다.
단점 Semaphores
내가 만난 세마포어의 단점은 다음과 같습니다.
- 세마포어의 가장 큰 한계 중 하나는 우선순위 반전입니다.
- 운영 체제는 세마포어에 대한 대기 및 신호 호출을 모두 추적해야 합니다.
- 해당 사용은 강제되지 않으며 관례에 따른 것입니다.
- 세마포어에서 교착 상태를 피하기 위해 Wait 및 Signal 작업은 올바른 순서로 실행되어야 합니다.
- Semaphore 프로그래밍은 복잡한 방법이기 때문에 상호 배타성을 달성하지 못할 가능성이 있습니다.
- 또한 모듈성을 상실하게 되므로 대규모 사용에는 실용적인 방법이 아닙니다.
- Semaphore 프로그래머 오류가 발생하기 쉽습니다.
- 그것은 일으킬 수 있습니다 이중 자물쇠 또는 프로그래머 오류로 인한 상호 배제 위반.
뮤텍스란 무엇입니까?
Mutex의 전체 형태는 Mutual Exclusion Object입니다. 공유 리소스에 대한 액세스를 제어하는 데 사용되는 특별한 유형의 바이너리 세마포어입니다. 확장된 우선순위 반전 문제를 방지하기 위한 우선순위 상속 메커니즘이 포함되어 있습니다. 이를 통해 현재 우선 순위가 높은 작업을 가능한 한 짧은 시간 동안 차단 상태로 유지할 수 있습니다. 그러나 우선순위 상속은 우선순위 역전을 수정하지 않고 그 효과를 최소화할 뿐입니다.
뮤텍스 사용
뮤텍스는 상호 배제를 제공하는데, 키(뮤텍스)를 가지고 작업을 진행할 수 있는 생산자 또는 소비자가 될 수 있습니다. 생산자가 버퍼를 채우는 한 사용자는 기다려야 하며, 그 반대의 경우도 마찬가지입니다. 뮤텍스 잠금에서는 항상 단일 스레드만 전체 버퍼로 작업할 수 있습니다.
뮤텍스의 장점
제가 관찰한 바에 따르면 Mutex의 주요 이점은 다음과 같습니다.
- 뮤텍스는 중요한 섹션에 진입한 다음 해제하기 전에 획득한 단순한 잠금입니다.
- 주어진 시간에 하나의 스레드만 임계 섹션에 있기 때문에 경쟁 조건이 없으며 데이터는 항상 일관성을 유지합니다.
뮤텍스의 단점
실제로 저는 Mutex의 몇 가지 단점을 확인했습니다.
- 스레드가 잠금을 획득하고 절전 모드로 전환되거나 선점되면 다른 스레드가 앞으로 나아갈 수 없습니다. 이는 기아로 이어질 수 있습니다.
- 이를 획득한 컨텍스트와 다른 컨텍스트에서는 잠그거나 잠금 해제할 수 없습니다.
- 임계 섹션에는 한 번에 하나의 스레드만 허용되어야 합니다.
- 정상적인 구현에서는 바쁜 대기 상태가 되어 CPU 시간이 낭비될 수 있습니다.
차이점 Semaphore 및 뮤텍스
내가 그들과 함께 일하면서 배운 것을 바탕으로 Mutexes와 Semaphore다르다:
파라미터 | Semaphore | 뮤텍스 |
---|---|---|
기구 | 일종의 신호 메커니즘이다. | 잠금 메커니즘입니다. |
데이터 형식 | Semaphore 정수 변수입니다. | 뮤텍스는 단지 객체일 뿐입니다. |
가감 | 대기 및 신호 작업은 세마포어를 수정할 수 있습니다. | 리소스를 요청하거나 해제할 수 있는 프로세스에 의해서만 수정됩니다. |
자원 관리 | 리소스가 비어 있지 않으면 프로세스는 대기 작업을 실행해야 하는 리소스가 필요합니다. 세마포어의 카운트가 0보다 클 때까지 기다려야 합니다. | 잠겨 있으면 프로세스가 기다려야 합니다. 프로세스는 대기열에 보관되어야 합니다. 뮤텍스가 잠금 해제된 경우에만 액세스해야 합니다. |
Thread | 여러 프로그램 스레드를 가질 수 있습니다. | 뮤텍스에는 여러 프로그램 스레드가 있을 수 있지만 동시에 있을 수는 없습니다. |
소유권 | 값은 리소스를 해제하거나 획득하는 모든 프로세스에 의해 변경될 수 있습니다. | 객체 잠금은 해당 객체에 대한 잠금을 획득한 프로세스에 의해서만 해제됩니다. |
유형 | 유형 Semaphore 세마포어는 카운팅 세마포어와 이진 세마포어입니다. | Mutex에는 하위 유형이 없습니다. |
Opera기 | Semaphore 값은 wait() 및 signal() 연산을 사용하여 수정됩니다. | 뮤텍스 개체가 잠겨 있거나 잠금 해제되었습니다. |
자원 점유 | 모든 리소스가 사용 중이고 리소스를 요청하는 프로세스가 wait() 작업을 수행하고 세마포어 수가 >1이 될 때까지 자신을 차단하는 경우 점유됩니다. | 객체가 이미 잠겨 있는 경우 리소스를 요청하는 프로세스는 대기하고 잠금이 해제되기 전에 시스템에 의해 대기열에 추가됩니다. |
결론
제 경험에 따르면, 뮤텍스와 세마포어를 선택하는 데 가장 중요한 것은 각각의 동작상의 미묘한 차이점을 인식하는 것입니다. Semaphores는 복잡한 동기화에 적합한 반면, 뮤텍스는 간단한 상호 배제에 적합하여 더 간단한 컨텍스트에서 리소스 안전성을 보장합니다.