>일반적인 문제 >세마포어와 뮤텍스의 차이점은 무엇입니까

세마포어와 뮤텍스의 차이점은 무엇입니까

青灯夜游
青灯夜游원래의
2021-11-08 14:24:3918613검색

차이점: 1. 뮤텍스는 스레드의 상호 배제에 사용되고 세마포어는 스레드 동기화에 사용됩니다. 2. 뮤텍스 값은 0 또는 1만 가능하고 세마포어 값은 음수가 아닌 정수일 수 있습니다. 3. 뮤텍스 잠금; 수량 잠금 해제는 동일한 스레드에서 상응하게 사용해야 합니다. 세마포어는 한 스레드에서 해제되고 다른 스레드에서 얻을 수 있습니다.

세마포어와 뮤텍스의 차이점은 무엇입니까

이 튜토리얼의 운영 환경: Windows 7 시스템, Dell G3 컴퓨터.

뮤텍스와 세마포어의 차이점

1. 뮤텍스는 스레드의 상호 배제를 위해 사용되고, 세마포어는 스레드의 동기화를 위해 사용됩니다.

이것이 뮤텍스와 세마포어의 근본적인 차이점, 즉 상호 배제와 동기화의 차이입니다.

상호 배제: 특정 리소스가 동시에 한 명의 방문자만 액세스할 수 있도록 허용하는 고유하고 배타적인 것을 의미합니다. 그러나 상호 배제는 방문자가 리소스에 액세스하는 순서를 제한할 수 없습니다. 즉, 액세스에는 순서가 없습니다.

동기화: (대부분의 경우) 상호 배제를 기반으로 다른 메커니즘을 통해 방문자가 리소스에 질서 있게 액세스하는 것을 의미합니다. 대부분의 경우 동기화는 이미 상호 배제를 구현하며, 특히 리소스에 대한 모든 쓰기가 상호 배타적이어야 하는 경우에는 더욱 그렇습니다. 몇몇 경우에는 여러 방문자가 동시에 리소스에 액세스할 수 있습니다

2. 뮤텍스 값은 0/1만 가능하고 세마포어 값은 음수가 아닌 정수일 수 있습니다.

즉, 뮤텍스는 하나의 리소스에 대한 상호 배타적 액세스에만 사용할 수 있으며 여러 리소스에 대한 다중 스레드 상호 배타성을 구현할 수 없습니다. 세마포어는 다중 스레드 상호 배제 및 여러 유사한 리소스의 동기화를 실현할 수 있습니다. 세마포가 단일 값 세마포인 경우 리소스에 대한 상호 배타적 액세스도 완료될 수 있습니다.

3. 뮤텍스 잠금 및 잠금 해제는 각각 동일한 스레드에서 사용해야 합니다. 세마포어는 한 스레드에서 해제하고 다른 스레드에서 얻을 수 있습니다.

Mutex(Mutex)

Mutex는 상호 배제 현상을 나타내는 데이터 구조로 바이너리 세마포어로도 사용됩니다. 뮤텍스는 기본적으로 여러 작업의 동작을 동기화하는 데 사용할 수 있는 멀티태스킹에 민감한 바이너리 신호로, 코드의 중요한 부분을 인터럽트로부터 보호하고 동기화에 사용되는 리소스를 공유하는 데 자주 사용됩니다.

세마포어와 뮤텍스의 차이점은 무엇입니까

Mutex는 본질적으로 리소스에 대한 독점 액세스를 제공하는 잠금이므로 Mutex의 주요 기능은 상호 배제입니다. Mutex 객체의 값은 0과 1의 두 가지 값만 갖습니다. 이 두 값은 각각 Mutex의 두 가지 상태를 나타냅니다. 값은 0이며 이는 현재 개체가 잠겨 있음을 나타냅니다. 사용자 프로세스/스레드가 중요한 리소스를 잠그려고 하면 값은 1이며 이는 현재 유휴 상태를 나타냅니다. 개체는 유휴 상태이며 사용자 프로세스/스레드는 중요한 리소스를 잠글 수 있습니다. 이후 Mutex 값은 1씩 감소하여 0이 됩니다.

Mutex는 네 가지 작업으로 추상화될 수 있습니다.

-Create

-Lock

-Unlock

-Destroy

Mutex는 생성될 때 초기 값을 가질 수 있습니다. 즉, Mutex가 생성된 후에는 잠긴 상태 또는 유휴 상태. 동일한 스레드에서 교착 상태를 방지하기 위해 시스템은 Mutex가 연속으로 두 번 잠기는 것을 허용하지 않습니다(시스템은 일반적으로 두 번째 호출 후 즉시 반환됩니다). 즉, 잠금 및 잠금 해제라는 두 가지 해당 작업이 동일한 스레드에서 완료되어야 합니다.

다양한 운영 체제에서 제공되는 Mutex 기능:

Deadlock은 주로 여러 개의 종속 잠금이 있을 때 발생하며, 한 스레드가 다른 스레드와 반대 순서로 뮤텍스를 잠그려고 할 때 발생합니다. 뮤텍스를 사용할 때 교착 상태를 피하는 방법은 특히 주의해야 합니다.

일반적으로 다음과 같은 몇 가지 기록되지 않은 기본 원칙이 있습니다.

공유 리소스를 사용하기 전에 잠금을 획득해야 합니다.

 작업 완료 후 반드시 잠금장치를 해제해주세요.

 가능한 짧은 시간 동안 자물쇠를 점유하세요.

 잠금이 여러 개인 경우 획득 순서가 ABC라면 해제 순서도 ABC여야 합니다.

  스레드가 오류와 함께 반환되면 획득한 잠금을 해제해야 합니다.

혹시 일부 독자들은 "대기 일시 중지" 및 "대기 스레드 깨우기" 작업을 어떻게 구현하는지 궁금할 것입니다. 각 Mutex에는 대기 대기열이 있습니다. 스레드가 Mutex를 기다리려면 먼저 자신을 대기 대기열에 추가한 다음 스레드 상태를 절전 모드로 설정한 다음 스케줄러 함수를 호출하여 다른 스레드로 전환해야 합니다. 스레드가 대기 대기열에 있는 다른 스레드를 깨우려면 대기 대기열에서 항목을 꺼내고 상태를 절전에서 준비로 변경한 다음 준비 대기열에 합류하기만 하면 됩니다. 그런 다음 다음 번에 깨어나는 상태로 전환할 수 있습니다. 스케줄러 기능이 실행되는 시간입니다.

일반적인 상황에서 동일한 스레드가 두 번째 호출 중에 잠금을 두 번 호출하면 잠금이 이미 점유되어 있으므로 스레드가 중단되고 다른 스레드가 잠금을 해제할 때까지 기다립니다. 그러나 잠금은 자체적으로 점유됩니다. , 스레드는 잠금을 해제할 기회 없이 다시 일시 중단되므로 항상 일시 중단 대기 상태에 있습니다. 이를 교착 상태라고 합니다. 또 다른 일반적인 교착 상태 상황은 다음과 같습니다. 스레드 A는 잠금 1을 획득하고 스레드 B는 잠금 2를 획득합니다. 이때 스레드 A는 잠금 2를 획득하려고 잠금을 호출합니다. 결과적으로 스레드 B가 해제될 때까지 기다려야 합니다. 이때 스레드 B도 잠금 1을 획득하려고 잠금을 호출합니다. 결과적으로 스레드 A가 잠금 1을 해제할 때까지 기다려야 하므로 스레드 A와 B는 모두 영원히 일시 중지 상태에 있습니다. 더 많은 스레드와 더 많은 잠금이 관련되면 교착 상태 문제가 복잡해지고 판단하기 어려워진다는 것을 상상하는 것은 어렵지 않습니다.

Semaphore

세마포어라고도 불리는 세마포어는 멀티 스레드 환경에서 사용되는 기능으로, 다양한 스레드를 조정하여 공용 리소스를 올바르고 합리적으로 사용할 수 있도록 하는 역할을 합니다.

세마포어는 여러 범주로 나눌 수 있습니다:

  • 바이너리 세마포어(binary semaphore): 세마포어만 0 또는 1의 값을 가질 수 있으며 동시에 하나의 스레드에서만 얻을 수 있습니다.

  • 정수 세마포어: 세마포어 값은 정수이며 세마포어 값이 0이 될 때까지 동시에 여러 스레드에서 얻을 수 있습니다.

  • 세마포 기록: 정수 값(개수) 외에도 각 세마포 s에는 세마포에서 차단된 각 스레드의 ID인 대기 대기열 목록도 있습니다. 세마포어가 해제되고 값이 1씩 증가하면 시스템은 대기 큐에서 대기 중인 스레드를 자동으로 깨워 세마포어를 얻을 수 있게 하고 동시에 세마포어는 1씩 감소합니다.

세마포어는 카운터를 통해 공유 리소스에 대한 액세스를 제어합니다. 세마포어의 값은 음수가 아닌 정수이며 이를 전달하는 모든 스레드는 정수를 1씩 감소시킵니다. 카운터가 0보다 크면 액세스가 허용되고 카운터는 1씩 감소합니다. 0이면 액세스가 금지되고 이를 통과하려는 모든 스레드가 대기 상태가 됩니다.

카운터 계산 결과는 공유 리소스에 대한 액세스를 허용하는 패스입니다. 따라서 공유 리소스에 액세스하려면 스레드가 세마포어에서 패스를 받아야 합니다. 세마포어의 개수가 0보다 크면 이 스레드는 패스를 가져오고, 그렇지 않으면 이 스레드는 감소합니다. 패스를 받을 때까지 차단됩니다. 이 스레드가 더 이상 공유 리소스에 액세스할 필요가 없으면 패스를 해제하여 세마포어 카운트가 증가하고, 다른 스레드가 패스를 기다리고 있으면 해당 스레드가 해당 시점에 패스를 가져옵니다.

세마포어는 다섯 가지 작업으로 추상화될 수 있습니다.

  • - Create Create

  • - Wait for Wait:

    스레드는 값이 0보다 크면 세마포를 얻고 값을 얻습니다. 1만큼 감소하고, 0과 같으면 스레드는 세마포어 값이 0보다 크거나 시간 초과될 때까지 절전 상태에 들어갑니다.

  • -Release Post

    는 세마포어 해제를 실행하며, 이때 대기 중인 스레드가 있으면 해당 스레드가 깨어납니다.

  • - TryWait을 기다리는 중

    TryWait이 호출되면 스레드는 실제로 세마포어를 얻지 못하지만 세마포어 값이 0보다 크면 TryWait가 성공을 반환합니다. 실패를 반환합니다.

  • -파괴

세마포어는 두 개 이상의 키 코드 세그먼트를 보호하는 데 사용할 수 있습니다. 이러한 키 코드 세그먼트는 동시에 호출할 수 없습니다. 코드의 중요한 섹션에 들어가기 전에 스레드는 세마포어를 얻어야 합니다. 코드의 중요 섹션에 스레드가 없으면 스레드는 즉시 블록 다이어그램의 해당 부분으로 들어갑니다. 코드의 중요한 부분이 완료되면 스레드는 세마포어를 해제해야 합니다. 이 중요한 코드 섹션에 들어가려는 다른 스레드는 첫 번째 스레드가 세마포어를 해제할 때까지 기다려야 합니다. 이 프로세스를 완료하려면 세마포어를 생성한 다음 각 키 코드 세그먼트의 시작과 끝 부분에 세마포어 획득 VI와 세마포 해제 VI를 배치해야 합니다. 이 세마포어 VI가 원래 생성된 세마포어를 참조하는지 확인하십시오.

Action/System

Win32

Linyx

Solaris

Create

CreateMutex

pthread_mutex_init

mutex_init

lock

WaitForSingleObject

pthread_mutex_lock

mutex_ lock

unlock

ReleaseMutex

pthread_mutex_unlock

Umutex_unlock

파괴

Closehandle

pthread_mutex_destroy

mutex_destroy

ㅋㅋㅋ sem _trywaitsem_destroy

액션/시스템

Win32

POSIX

Create

CreateSemaphore

sem_init

Wait

WaitForSingleObject

WaitForSingleObject

destroy

CloseHandle

더 많은 관련 지식은

FAQ

칼럼을 방문해 주세요!

위 내용은 세마포어와 뮤텍스의 차이점은 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.