[operating-system] 이진 세마포어와 뮤텍스의 차이점

이진 세마포어와 뮤텍스 사이에 차이점이 있습니까? 아니면 본질적으로 동일합니까?



답변

그들은이다 NOT 같은 일. 그들은 다른 목적으로 사용됩니다!
두 유형의 세마포어가 전체 / 빈 상태이며 동일한 API를 사용하지만 사용법은 매우 다릅니다.

상호 배제 세마포어
상호 배제 세마포어는 공유 리소스 (데이터 구조, 파일 등)를 보호하는 데 사용됩니다.

Mutex 세마포어는 그것을 수행하는 작업에 의해 “소유”됩니다. 작업 B가 작업 A가 현재 보유하고있는 뮤텍스를 표시하려고하면 작업 B의 호출이 오류를 반환하고 실패합니다.

뮤텍스는 항상 다음 순서를 사용합니다.

  -SemTake
  -중요 섹션
  -SemGive

다음은 간단한 예입니다.

  스레드 A 스레드 B
   뮤텍스를
     액세스 데이터
     ... Mutex 사용 <== 차단
     ...
   Mutex 액세스 데이터 제공 <== 차단 해제
                                  ...
                                뮤텍스 제공

이진 세마포
이진 세마포는 완전히 다른 질문을 다룹니다.

  • 작업 B는 무언가가 발생하기를 기다리는 중입니다 (예 : 센서가 트립 됨).
  • 센서 트립 및 인터럽트 서비스 루틴이 실행됩니다. 여행을 작업에 알려야합니다.
  • 작업 B가 실행되고 센서 트립에 적절한 조치를 취해야합니다. 그런 다음 대기로 돌아갑니다.

   Task A                      Task B
   ...                         Take BinSemaphore   <== wait for something
   Do Something Noteworthy
   Give BinSemaphore           do something    <== unblocks

이진 세마포어를 사용하면 B가 세마포어를 사용하고 A를 지정하는 것이 좋습니다.
이진 세마포어는 리소스 액세스를 보호하지 않습니다. 세마포어를주고받는 행위는 근본적으로 분리되어 있습니다.
일반적으로 동일한 작업에 대해 동일한 이진 세마포어를주고받는 것이 거의 의미가 없습니다.


답변

  • 뮤텍스는 만 해제 할 수 를 획득 한 스레드 .
  • 바이너리 세마포어가 신호를받을 수 있는 스레드 (또는 프로세스).

따라서 세마포어는 생산자 소비자와 같은 일부 동기화 문제에 더 적합합니다.

Windows에서 이진 세마포어는 뮤텍스보다 이벤트 객체와 유사합니다.


답변

화장실 예제 는 즐거운 유추입니다.

뮤텍스 :

화장실의 열쇠입니다. 한 번에 한 사람이 화장실을 차지하는 열쇠를 가질 수 있습니다. 완료되면, 사람은 대기열에있는 다음 사람에게 키를 제공합니다.

공식적으로 : “뮤텍스는 일반적으로 하나 이상의 스레드가 동시에 실행할 수없는 재진입 코드 섹션에 대한 액세스를 직렬화하는 데 사용됩니다. 뮤텍스 객체는 하나의 스레드를 제어 된 섹션으로 만 허용하여 다른 스레드가 액세스하려고 시도합니다. 첫 번째 스레드가 해당 섹션에서 나올 때까지 해당 섹션을 기다리십시오. ” 참고 : Symbian 개발자 라이브러리

(뮤텍스는 실제로 값이 1 인 세마포입니다.)

신호기:

동일한 무료 화장실 키의 수입니다. 예를 들어, 자물쇠와 열쇠가 같은 화장실이 4 개 있다고 가정합니다. 세마포어 수 (키 수)는 처음에 4로 설정되고 (4 개의 화장실은 모두 무료) 사람들이 들어 오면 카운트 값이 감소합니다. 모든 화장실이 가득 찬 경우, 즉 남아있는 빈 키가 없으면 세마포어 카운트는 0입니다. 이제 eq. 한 사람이 화장실을 떠나면 세마포어가 1 (무료 키)로 증가하고 대기열의 다음 사람에게 제공됩니다.

공식적으로 : “세마포어는 공유 리소스의 동시 사용자 수를 최대 수로 제한합니다. 스레드는 리소스에 대한 액세스를 요청 (세마포 감소)하고 리소스 사용이 완료되었음을 알리는 신호를 줄 수 있습니다 (세마포 증가). ” 참고 : Symbian 개발자 라이브러리


답변

주제에 대한 좋은 기사 :

2 부에서 :

뮤텍스는 하나의 중요한 차이점 인 소유권 원칙이라는 점에서 이진 세마포어의 원리와 유사합니다. 소유권은 작업이 뮤텍스를 잠 그거나 (취득 할 때) 잠금 해제 (릴리스) 할 수있는 간단한 개념입니다. 작업이 뮤텍스의 잠금을 해제하려고 시도하면 잠기지 않았으므로 (따라서 소유하지 않음) 오류 조건이 발생하며 가장 중요한 것은 뮤텍스가 잠금 해제되지 않은 것입니다. 상호 배제 객체에 소유권이없는 경우 객체와 상관없이 뮤텍스가 아닙니다.


답변

위의 답변 중 어느 것도 혼란을 해결하지 못하므로 여기 내 혼란을 해결 한 것이 있습니다.

엄밀히 말하면, 뮤텍스는 리소스에 대한 액세스를 동기화 하는 데 사용되는 잠금 메커니즘 입니다. 하나의 작업 (OS 추상화에 기반한 스레드 또는 프로세스 일 수 있음) 만 뮤텍스를 획득 할 수 있습니다. 이는 mutex와 관련된 소유권이 있으며 소유자 만 잠금 (mutex)을 해제 할 수 있음을 의미합니다.

세마포어는 신호 전달 메커니즘입니다 (“완료되었습니다. 계속 진행할 수 있습니다”). 예를 들어, 모바일에서 노래를 듣고 (한 작업으로 가정) 친구가 전화를 걸면 인터럽트 서비스 루틴 (ISR)이 호출 처리 작업을 깨우도록 신호를주는 인터럽트가 트리거됩니다. .

출처 : http://www.geeksforgeeks.org/mutex-vs-semaphore/


답변

그들의 동기화 의미는 매우 다릅니다 :

  • 뮤텍스는 주어진 리소스에 대한 액세스의 직렬화를 허용합니다. 즉, 여러 스레드가 한 번에 하나씩 잠금을 대기하며 앞에서 말했듯이 스레드 잠금이 완료 될 때까지 잠금을 소유 합니다. 이 특정 스레드 잠금을 해제 할 수 있습니다.
  • 이진 세마포어 값이 0과 1로 카운터입니다 : 때까지 작업이 그것에 차단 어떤 작업이 sem_post 않습니다. 세마포어는 리소스가 사용 가능함을 알리고, 사용 가능하다고 신호 될 때까지 대기하는 메커니즘을 제공합니다.

따라서 뮤텍스를 작업에서 작업으로 전달 된 토큰으로, 세마포어를 트래픽 빨간색 표시등으로 볼 수 있습니다 (누군가 진행할 수 있음을 알리는 신호 ).


답변

이론적으로는 의미 적으로 다르지 않습니다. 세마포어를 사용하거나 그 반대로 뮤텍스를 구현할 수 있습니다 ( 예는 여기 참조 ). 실제로는 구현 방식이 다르며 약간 다른 서비스를 제공합니다.

실질적인 차이 (그들을 둘러싼 시스템 서비스의 관점에서)는 뮤텍스의 구현이보다 가벼운 동기화 메커니즘이라는 것을 목표로합니다. oracle-speak에서 뮤텍스는 래치로 , 세마포어는 대기 로 알려져 있습니다 .

가장 낮은 수준에서는 원자 테스트 및 설정 메커니즘을 사용합니다. 이것은 메모리 위치의 현재 값을 읽고, 일종의 조건부 조건을 계산하고, 중단 될 수없는 단일 명령으로 해당 위치의 값을 씁니다 . 즉, 뮤텍스를 획득하고 다른 사람이 뮤텍스를 가지고 있는지 확인하기 위해 테스트 할 수 있습니다.

일반적인 뮤텍스 구현에는 테스트 및 설정 명령어를 실행하고 다른 어떤 것이 뮤텍스를 설정했는지 평가하는 프로세스 또는 스레드가 있습니다. 여기서 중요한 점은 스케줄러 와 상호 작용이 없기 때문에 누가 잠금을 설정했는지 알 수 없습니다. 그런 다음 시간 조각을 포기하고 작업이 다시 예약 될 때 다시 시도하거나 spin-lock을 실행합니다 . 스핀 잠금은 다음과 같은 알고리즘입니다.

Count down from 5000:
     i. Execute the test-and-set instruction
    ii. If the mutex is clear, we have acquired it in the previous instruction
        so we can exit the loop
   iii. When we get to zero, give up our time slice.

보호 된 코드 ( critical section ) 실행을 마치면 뮤텍스 값을 0 또는 ‘clear’라는 의미로 설정하면됩니다. 여러 작업이 뮤텍스를 획득하려고 시도하는 경우 뮤텍스가 릴리스 된 후 예약 된 다음 작업은 리소스에 액세스 할 수 있습니다. 일반적으로 뮤텍스를 사용하여 독점 액세스가 매우 짧은 시간 동안 만 필요한 경우 일반적으로 공유 데이터 구조를 업데이트하는 동기화 된 리소스를 제어합니다.

세마포어는 뮤텍스 라이브러리보다 약간 더 깊이있는 스케줄러와 상호 작용하는 카운트 및 일부 시스템 호출 래퍼가있는 동기화 된 데이터 구조 (일반적으로 뮤텍스 사용)입니다. 세마포어는 증가하고 감소하여 다른 준비가 될 때까지 작업 을 차단 하는 데 사용됩니다 . 이에 대한 간단한 예는 생산자 / 소비자 문제 를 참조하십시오 . 세마포어는 어떤 값으로 초기화됩니다-이진 세마포어는 세마포어가 1로 초기화되는 특별한 경우입니다. 세마포어에 게시하면 대기 프로세스를 깨우는 효과가 있습니다.

기본 세마포어 알고리즘은 다음과 같습니다.

(somewhere in the program startup)
Initialise the semaphore to its start-up value.

Acquiring a semaphore
   i. (synchronised) Attempt to decrement the semaphore value
  ii. If the value would be less than zero, put the task on the tail of the list of tasks waiting on the semaphore and give up the time slice.

Posting a semaphore
   i. (synchronised) Increment the semaphore value
  ii. If the value is greater or equal to the amount requested in the post at the front of the queue, take that task off the queue and make it runnable.
 iii. Repeat (ii) for all tasks until the posted value is exhausted or there are no more tasks waiting.

이진 세마포어의 경우 두 데이터 간의 주요 실제 차이점은 실제 데이터 구조를 둘러싼 시스템 서비스의 특성입니다.

편집 : 에반이 올바르게 지적했듯이 스핀 락은 단일 프로세서 시스템을 느리게합니다. 단일 프로세서에서는 다른 작업이 실행되는 동안 뮤텍스를 유지하는 프로세스가이를 재설정하지 않기 때문에 다중 프로세서 상자에서만 스핀 락을 사용합니다. 스핀 록은 다중 프로세서 아키텍처에서만 유용합니다.