2011-09-10 6 views
3

뮤텍스가 작동하는 방식에 관심이 있습니다. 나는 내가 찾은 모든 웹 사이트 그들의 목적은 그들이 무엇을 설명 이해하지만이 경우에는 어떻게되는지 이해할 수 없었다 :두 명의 theads가 뮤텍스를 동시에 잠그면 어떻게됩니까?

가 동시에 실행되는 두 개의 스레드가 있고 그들은에서 뮤텍스를 잠금을 시도 같은 시간.

이 상황은 결코 발생할 수 없으므로 단일 코어에서는 문제가되지 않지만 멀티 코어 시스템에서는이 문제가 발생합니다. 이와 같은 동시성 문제를 방지 할 수있는 방법은 없지만 분명히 존재합니다. 이 개 스레드는 시스템 전체 뮤텍스를 고정하는 것은 불가능 도움

+0

필자는 멀티 코어 시스템에 OS/하이퍼 바이저 레벨 또는 CPU/버스 관리에서 어떤 종류의 메커니즘이 있으므로 이것이 발생하지 않을 것이라고 확신합니다. –

+0

그들은 한번만 획득 할 수있는 뮤텍스 포인트가 될 수 없다. –

+0

두 개의 스레드 (또는 10 개의 스레드)가 동시에 mutex를 잠글 수 있지만 _ 하나만 성공할 수있다. 또한 단일 코어에서 OS가 스레드에서 스레드로 항상 전환되며 뮤텍스를 잠그려고 할 때 한 스레드에서 다른 스레드로 전환 할 수 있으며 즉시 잠금을 시도하는 다른 스레드로 전환 할 수 있습니다 동일한 뮤텍스가 필요하며 올바르게 작동해야합니다. – gnasher729

답변

5

뮤텍스가 제대로 구현되면 동시에 잠글 수 없습니다. 이를 위해 유용한 속성을 가진 원자 연산 (한 순간에 객체에 대해 일어나는 유일한 작업 임)이 필요합니다.

이러한 작업 중 하나는 x86 아키텍처에서 xchg (exchange)입니다. 예를 들어 xchg eax, [ebp]은 주소 ebp의 값을 읽고, ebp의 주소에 의 값을 쓰고 그 값에 동시 읽기 및 쓰기로 인터리브되지 않도록 보장하면서 eax을 읽기 값으로 설정합니다.

이제 뮤텍스를 구현할 수 있습니다. 잠 그려면 1eax에로드하고 eax을 뮤텍스의 값으로 교환하고 eax을 확인하십시오. 1 인 경우 이미 잠겼으므로 잠자기하고 나중에 다시 시도하십시오.0 인 경우 뮤텍스를 잠갔습니다. 잠금을 해제하려면 0 값을 뮤텍스에 씁니다.

중요한 세부 정보는 여기에서 볼 수 있습니다. 예를 들어 x86의 xchg은 단일 프로세서에서 선점 형 멀티 태스킹을 수행 할 수있을만큼 충분히 기본입니다. 멀티 코어 시스템 등 여러 프로세서간에 메모리를 공유하는 경우 접두어 (예 : , xchg eax, [ebp]이 아닌) (ensures that only one processor can access that memory while the instruction is executed)를 사용하지 않으면 충분하지 않습니다.

+1

멀티 코어 x86 용으로 'LOCK'접두어가 붙은 명령어가 있습니다. 'LOCK XCHG eax, [ebp]'. –

+0

@ MarkKCowan 좋은 지적! 나는 조금 더 나은 SMP 상황을 반영하기 위해 대답을 업데이트 할 것이다. –

7

에 대한

덕분에, 하나는 다른이 차단됩니다 잠글 것입니다.

뮤텍스/잠금의 의미! 한 번에 하나의 스레드 만 잠금 호출을 초과하여 을 실행할 수 있는지 확인하십시오. 에 도달하는 첫 번째 스레드는 호출이 뮤텍스에 대한 잠금을 획득합니다. 나중의 모든 스레드는 mutex/lock 호출시 을 차단합니다! 잠금을 소유 한 스레드 이 뮤텍스/잠금 해제와 함께 잠금을 해제 할 때까지!

어떻게 구현할 수 있는지에 대해서는 test-and-set을 참조하십시오.

컴퓨터 과학에서, 검사와 지정 명령은 메모리 위치에 기록하고 단일 원자 (즉, 인터럽트 불가능) 조작으로 그 이전의 값을 리턴하는 데 사용되는 명령 이다. 여러 개의 프로세스가 동일한 메모리에 액세스 할 수 있고 프로세스가 현재 테스트 및 설정을 수행하는 경우 다른 프로세스는 첫 번째 프로세스가 완료 될 때까지 다른 테스트를 시작할 수 있습니다. CPU는 다른 전자 부품이 제공하는 테스트 및 설정 명령어 (예 : )를 이중 포트 RAM으로 사용할 수 있습니다. CPU는 또한 자체 테스트 및 설정 명령을 제공 할 수 있습니다.

이전 값이 0이면 호출 프로세스가 잠금을 가져옵니다.이 때까지 변수에 1을 기록합니다.

관련 문제