pthreads 뮤텍스 대 세마포
pthread 라이브러리에서 제공하는 세마포어와 뮤텍스의 차이점은 무엇입니까?
세마포어에는 동기화 된 카운터가 있고 뮤텍스는 이진 (true / false)입니다.
세마포어는 사용중인 리소스의 요소 수에 응답하기위한 결정적인 메커니즘으로 자주 사용됩니다. 예를 들어 n 개의 작업자 스레드를 나타내는 객체는 세마포어를 사용하여 사용 가능한 작업자 스레드 수를 계산할 수 있습니다.
사실은 뮤텍스에 의해 동기화 된 INT로 세마포어를 나타낼 수 있습니다.
Mutex와 Binary-Semaphore에 대해 이야기 할 것입니다. 분명히 뮤텍스를 사용하여 한 스레드의 데이터가 동시에 다른 스레드에서 액세스되는 것을 방지합니다.
(방금 lock ()을 호출했고 데이터에 액세스하는 중이라고 가정합니다. 즉, 다른 스레드 (또는 동일한 스레드 코드의 다른 인스턴스)가 잠금 장치에 의해 잠긴 동일한 데이터에 액세스 할 것으로 기대하지 않습니다. 즉, 다른 스레드 인스턴스에서 실행되는 동일한 스레드 코드가 잠금에 도달하면 lock ()이 제어 흐름을 차단해야합니다.)
이것은 동일한 데이터에 액세스하고 동일한 뮤텍스에 의해 잠긴 다른 스레드 코드를 사용하는 스레드에 적용됩니다.
이 경우 여전히 데이터에 액세스하는 중이며 뮤텍스 잠금 해제에 도달하는 데 15 초가 더 걸릴 수 있습니다 (뮤텍스 잠금에서 차단 된 다른 스레드가 차단 해제되고 컨트롤이 데이터에 액세스).
다른 스레드가 동일한 뮤텍스를 잠금 해제하도록 허용 한 다음 뮤텍스 잠금에서 이미 대기 (차단)중인 스레드가 데이터를 차단 해제하고 액세스하도록 허용 한 적이 있습니까? (내 말이 여기에 있기를 바랍니다.)
합의 된 보편적 정의에 따라
- "뮤텍스"로는 이런 일이 일어나지 않습니다. 다른 스레드는 스레드의 잠금을 해제 할 수 없습니다.
- “이진 세마포어”를 사용하면 이런 일이 발생할 수 있습니다. 다른 스레드는 스레드의 잠금을 해제 할 수 있습니다.
따라서 뮤텍스 대신 이진 세마포어를 사용하는 데 매우 특별한 경우 잠금 및 잠금 해제를 "범위 지정"하는 데 매우주의해야합니다. 즉, 모든 잠금에 도달하는 모든 제어 흐름이 잠금 해제 호출에 도달해야합니다. "첫 번째 잠금 해제"가 없어야하며 항상 "첫 번째 잠금"이어야합니다.
뮤텍스는 여러 스레드 간의 경쟁 조건을 방지하는 데 사용됩니다.
세마포어는 여러 프로세스에서 사용되는 동기화 요소로 사용됩니다.
한 프로세스가 세마포어를 기다리는 동안 다른 프로세스가 세마포어를 해제하기 때문에 뮤텍스를 이진 세마포어로 바꿀 수 없습니다. 뮤텍스의 경우 획득과 해제가 모두 동일하게 처리됩니다.
화장실 예
뮤텍스 :
화장실의 열쇠입니다. 한 사람이 열쇠를 가질 수 있습니다-화장실을 차지하십시오-. 완료되면 그 사람은 대기열에있는 다음 사람에게 키를 제공 (해제)합니다.
"뮤텍스는 일반적으로 둘 이상의 스레드에서 동시에 실행할 수없는 재진입 코드 섹션에 대한 액세스를 직렬화하는 데 사용됩니다. 뮤텍스 개체는 제어 된 섹션에 하나의 스레드 만 허용하므로 다른 스레드가 해당 섹션에 액세스하려고 시도합니다. 첫 번째 스레드가 해당 섹션에서 종료 될 때까지 기다립니다. "
(뮤텍스는 실제로 값이 1 인 세마포어입니다.)
신호기:
무료 동일한 변기 키의 수입니다. 예를 들어 자물쇠와 열쇠가 동일한 화장실이 4 개 있다고 가정 해 보겠습니다. 세마포어 개수 (키 개수)는 처음에 4로 설정되고 (4 개의 화장실 모두 무료) 사람이 들어올 때 개수 값이 감소합니다. 모든 화장실이 가득 찬 경우, 즉. 남은 빈 키가 없으며 세마포어 수는 0입니다. 이제 eq. 한 사람이 화장실을 떠나면 세마포어가 1 (무료 키 하나)로 증가하고 대기열에있는 다음 사람에게 주어집니다.
"세마포어는 공유 자원의 동시 사용자 수를 최대 수까지 제한합니다. 스레드는 자원에 대한 액세스를 요청할 수 있으며 (세마포어 감소), 자원 사용이 완료되었음을 알릴 수 있습니다 (세마포어 증가)."
이 두 기사는 뮤텍스 대 세마포어 에 대한 자세한 내용을 설명합니다. 또한 이 스택 오버플로 답변은 유사한 답변을 알려줍니다.
사이의 차이 semaphore
와 mutex
의 차이점은 기구 및 패턴 . 차이점은 목적 ( 의도 )과 작동 방식 ( 행동 )에 있습니다.
는 mutex
, barrier
, pipeline
이다 병렬 프로그래밍 패턴 . Mutex
사용 ( 구성 을 보호하기 위해) critical section
및 확인 mutual exclusion
. Barrier
에이전트 (스레드 / 프로세스)가 서로를 계속 기다리게합니다.
패턴 의 특징 ( 행동 ) 중 하나는 mutex
허용 된 에이전트 (프로세스 또는 스레드) 만 임계 섹션에 들어갈 수 있고 해당 에이전트 만 자발적으로 해당 섹션에서 벗어날 수 있다는 것입니다.
mutex
한 번에 단일 에이전트를 허용 하는 경우가 있습니다. 복수의 에이전트 (복수 리더)를 허용하고 일부 다른 에이전트 (작성자)를 허용하지 않는 경우가 있습니다.
는 semaphore
A는 기구를 사용하는 (수 의도 다른 패턴을 구현하기 위해). ( behavior ) 일반적으로 플래그 (상호 배제에 의해 보호 될 수 있음)입니다. (한 가지 흥미로운 사실은 mutex
패턴 도 세마포어를 구현하는 데 사용할 수 있다는 것입니다 ).
대중 문화에서는 semaphores
커널에서 제공하는 메커니즘이며 mutexes
사용자 공간 라이브러리에서 제공합니다.
semaphores
및 에 대한 오해가 mutexes
있습니다. 그것은 그 말한다 semaphores
에 사용됩니다 synchronization
. 그리고 mutexes
이 있습니다 ownership
. 이것은 인기있는 OS 책 때문입니다. 그러나 진실은 모든 뮤텍스, 세마포어 및 장벽이 동기화에 사용된다는 것 입니다. 뮤텍스의 목적은 아니다 ownership
하지만 mutual exclusion
. 이러한 오해로 인해 mutexes
및 의 차이를 묻는 인기 인터뷰 질문이 발생했습니다 binary-semaphores
.
요약,
의지- 뮤텍스, 상호 배제
- 세마포어, 병렬 디자인 패턴 구현
- 뮤텍스, 허용 된 에이전트 만 임계 섹션에 들어가고 해당 에이전트 만 종료 할 수 있습니다.
- semaphore, enter if the flag says go, otherwise wait until someone changes the flag
In design perspective, mutex
is more like state-pattern
where the algorithm that is selected by the state can change the state. The binary-semaphore
is more like strategy-pattern
where the external algorithm can change the state and eventually the algorithm/strategy selected to run.
Semaphore is more used as flag, for which your really don't need to bring RTOS / OS. Semaphore can be accidentally or deliberately changed by other threads (say due to bad coding). When you thread use mutex, it owns the resources. No other thread can ever access it, before resource get free.
Mutexes can be applied only to threads in a single process and do not work between processes as do semaphores.
참고URL : https://stackoverflow.com/questions/2065747/pthreads-mutex-vs-semaphore
'IT TIP' 카테고리의 다른 글
C #의 예외는 얼마나 비쌉니까? (0) | 2020.11.01 |
---|---|
개체가 실제로 문자열 일 때 개체를 문자열로 캐스팅 대 변환 (0) | 2020.11.01 |
HTML float right 요소 순서 (0) | 2020.11.01 |
Composer없이 Composer PHP 패키지를 설치하려면 어떻게해야합니까? (0) | 2020.11.01 |
Subversion의 이상한 문제-내 저장소에있는 데 사용 된 디렉토리를 다시 만들려고 할 때 "파일이 이미 있습니다." (0) | 2020.11.01 |