programing

뮤텍스는 어떻게 구현됩니까?

procenter 2021. 1. 15. 19:46
반응형

뮤텍스는 어떻게 구현됩니까?


특정 애플리케이션에 대해 일부 구현이 다른 구현보다 낫습니까? 직접 출시하여 얻을 수있는 것이 있습니까?


Wikipedia에서 기계 수준에서 원자 적 연산을 수행하는 방법을 암시 하는 테스트 및 설정 기계 명령어에 대한 설명을 확인하세요 . 대부분의 언어 수준 뮤텍스 구현이 테스트 및 설정과 같은 컴퓨터 수준 지원에 의존한다고 상상할 수 있습니다.


Adamski의 test-and-set제안을 바탕으로 "빠른 사용자 공간 뮤텍스"또는 퓨 텍스의 개념도 살펴 봐야 합니다.

퓨 텍스는 비 경합 뮤텍스 를 잠 그거나 잠금 해제하는 일반적인 경우에 커널 시스템 호출이 필요하지 않다는 바람직한 속성을 가지고 있습니다. 이러한 경우 사용자 모드 코드는 CAS ( 원자 비교 및 스왑) 작업을 성공적으로 사용 하여 뮤텍스를 잠 그거나 잠금 해제합니다.

CAS가 실패하면 뮤텍스가 경합되고 sys_futexLinux 에서 커널 시스템 호출을 사용하여 뮤텍스를 기다리거나 (잠금 경우) 다른 스레드를 깨우기 (잠금 해제의 경우)해야합니다.

직접 구현하는 것에 대해 진지하게 생각한다면 Ulrich Drepper의 논문을 읽어보십시오 .


뮤텍스 가능한 짧게 주위 코드의 양을 유지하면서 다른 프로세스 작업을 전환하는 동안 차단되지 않도록 할 수 있으므로 바람직하게는, 운영체제의 커널에서 실행. 따라서 정확한 구현은 약간의 비밀입니다. 그래도 복잡하지 않습니다. 기본적으로 가져오고 설정하는 부울 필드가있는 개체입니다.

  • 카운터를 사용하면 세마포어가 될 수 있습니다.
  • 뮤텍스는 중요한 섹션의 시작점으로 내부적으로 뮤텍스를 사용하여 코드 섹션에 들어갈 수 있는지 확인합니다. 뮤텍스가 비어 있으면 뮤텍스를 설정하고 코드를 실행하며 완료되면 뮤텍스를 해제합니다. 중요 섹션에서 뮤텍스가 잠겨 있음을 발견하면 뮤텍스가 해제 될 때까지 기다릴 수 있습니다.

기본 뮤텍스 로직 주변에는 그것을 객체로 감싸는 래퍼가 있습니다. 그 다음에는 커널 외부에서 사용할 수 있도록 더 많은 래퍼 객체가 있습니다. 그런 다음 .NET에서 사용할 수 있도록하는 또 다른 래퍼입니다. 그런 다음 여러 프로그래머가 자신의 논리적 요구에 맞게이 모든 것을 둘러싼 자체 래퍼 코드를 작성합니다. 래퍼 주변의 래퍼는 정말 어두운 영역을 만듭니다.

이제 뮤텍스의 내부에 대한 기본적인 지식을 가지고 커널과 하드웨어에 의존하는 하나의 구현을 사용하기를 바랍니다. 이것들이 가장 신뢰할 수 있습니다. (하드웨어가 이러한 기능을 지원하는 경우) 사용중인 뮤텍스가이 커널 / 하드웨어 수준에서 작동하지 않는 경우에도 여전히 신뢰할 수 있지만 대안이없는 한 사용하지 않는 것이 좋습니다.

내가 아는 한 Windows, Linux 및 .NET은 모두 커널 / 하드웨어 수준에서 뮤텍스를 사용합니다.

링크 한 Wikipedia 페이지에서 내부 논리 및 가능한 구현에 대해 자세히 설명합니다. 바람직하게, 뮤텍스는 하드웨어에 의해 제어되므로 뮤텍스의 전체 가져 오기 / 설정을 불가분의 단계로 만듭니다. (시스템이 작업을 중간에 전환하지 않는지 확인하기 만하면됩니다.)


Interlocked.CompareExchange스핀 록을 구현하기에 충분합니다. 그래도 제대로하는 것은 꽤 어렵습니다. 관련된 미묘함의 예는 Joe Duffy의 블로그참조하십시오 .


원자 적으로 잠금을 시연하기위한 약간의 어셈블리 :

; BL is the mutex id
; shared_val, a memory address

CMP [shared_val],BL ; Perhaps it is locked to us anyway
JZ .OutLoop2
.Loop1:
CMP [shared_val],0xFF ; Free
JZ .OutLoop1 ; Yes
pause ; equal to rep nop.
JMP .Loop1 ; Else, retry

.OutLoop1:

; Lock is free, grab it
MOV AL,0xFF
LOCK CMPXCHG [shared_val],BL
JNZ .Loop1 ; Write failed

.OutLoop2: ; Lock Acquired

Reflector.NET을 사용 System.Threading.ReaderWriterLockSlim하여 .NET 프레임 워크의 최신 버전에 추가 된 의 소스를 디 컴파일했습니다 .

그것은 주로 사용 Interlocked.CompareExchange, Thread.SpinWaitThread.Sleep동기화를 달성 할 수 있습니다. EventWaitHandle일부 상황에서 사용되는 몇 가지 (커널 객체) 인스턴스가 있습니다.

또한 단일 스레드에서 재진입을 지원하기 위해 몇 가지 복잡성이 추가되었습니다.

이 영역에 관심이 있고 .NET에서 작업하는 경우 (또는 적어도 읽을 수있는 경우)이 클래스를 확인하는 것이 매우 흥미로울 수 있습니다.

참조 URL : https://stackoverflow.com/questions/1485924/how-are-mutexes-implemented

반응형