2013-08-06 4 views
1

변수에 대한 액세스를 동기화하려는 Windows 7 드라이버가 있습니다. InterlockedExchange를 사용할 수 있습니까?두 개의 CPU 코어에서 InterlockedExchange

InterlockedExchange에 대한 현재의 이해는 InterlockedExchange가 컴파일러 내장 함수를 통해 수행된다는 것입니다. 즉, 읽기 (InterlockedExchange는 이전 값을 반환 함)를 의미하며 쓰기는 1 클럭 주기로 완료됩니다. 인터 로킹 된 함수는 변수가 항상 인터 로크 된 함수를 통해 액세스되는 경우에만 원자입니다.

그러나이 경우에는 어떻게되는지 :

CPU1: InterlockedExchange(&Adapter->StatusVariable, 5); 
CPU2: InterlockedExchange(&Adapter->StatusVariable, 3); 

StatusVariable 두 개의 CPU 코어에서 동일한 클럭 사이클에 기록됩니다. 이 함수는 변수가 액세스되었음을 통지하고 다른 클록주기로 쓰기를 지연합니까? 또는 쓰기 후에 변수에 어떤 값이 있는지 정의되지 않았습니까? 변수에 쓰레기가 포함되어있을 수도 있습니까?

편집 : x86 또는 x64를 사용 중입니다.

답변

1

나는 변수에 대한 액세스를 동기화하려는 Windows 7 드라이버가 있습니다. InterlockedExchange를 사용할 수 있습니까?

아마도. 아마. 그것은 당신이 무엇을하려고하는지, 변수가 나타내는 것과 당신이 "액세스 동기화"라고 말할 때 여러분의 기대에 달려 있습니다.

이렇게 말하면 나는 당신이 무엇을 동기화로하고 있는지를 볼 수 없으므로 대답은 '아니오'라고 생각합니다.

즉, read (InterlockedExchange는 이전 값을 반환 함)이며 은 1 클럭 주기로 기록됩니다.

정확하게는 아닙니다. 연동 기능은 작업이 원자 적으로 수행되도록합니다. 얼마나 많은 클럭 사이클이 소요되는지는 또 다른 문제입니다. 클럭주기는 잊어 버려.

연동 함수는 변수가 항상 연동 함수를 통해 액세스 된 인 경우에만 원자입니다.

그 의미는 무엇입니까?

변수가 액세스되었음을 알리고 쓰기를 다른 클록 주기로 지연합니까?

고지 사항이 더 정확하다고 말하면됩니다. 다른 클록 사이클에 한 번 쓰기를 지연하는 것이 든 상관 없습니까? 어쩌면 그렇지 않을 수도 있습니다. 프로세스가하는 일은 귀하의 비즈니스가 아닙니다.

모든 컴파일러와 프로세서는 귀하의 예제에서 보장하고 당신이 알아야 할 모든이 있다는 것입니다 :

  1. InterlockedExchange(&Adapter->StatusVariable, 3);Adapter->StatusVariable의 값이 3 또는 5의 어느 쪽; 그것은 두 값과 다른 값 중 하나를 가질 것이다 3 또는 5

  • 명령문 InterlockedExchange(&Adapter->StatusVariable, 5);Adapter->StatusVariable의 값이 될 것이다. 단지 에 어떤 가치가 있는지 알 수 없으며 그 이유를 알아야합니다.

    아니면 변수가 쓰기 후에 어떤 값이 정의되어 있지 않습니까?

    "정의되지 않은"정의에 따라 달라집니다. 두 값 중 어느 값을 갖고 있는지는 분명하지 않지만 그 이후에 다른 스레드가 값을 변경하지 않는다고 가정하면 3 또는 5입니다.

    변수에 가비지가 포함되어있을 수 있습니까? '쓰레기'에 의해 당신이 3 또는 5 중 하나가 아닌 다른 무언가를 의미하는 경우

    는, 값으로 놨 다른 코드의 부재에, 대답은 명료 없습니다. 변수에는 값 3 또는 값 5이 포함됩니다.

  • +0

    여기서 언급하지 않은 중요한 점은 해당 호출의 반환 값입니다.연동 호출을 사용하여 반환 값을 검사해야합니다. 내가 틀린 말을하지 않는다면 : StatusVariable의 초기 값이 2라고하면 (정확히 말하면 내가 잘못했다면) 그 호출 중 하나가 2를 반환하고, 다른 하나는 3이나 5를 반환 할 것이고, 값은 각각 5 또는 3이됩니다. 어떤 밟기가 어떤 가치를 얻었는지 알 수 없으며 오히려 이전 값이 무엇인지에 따라 행동해야합니다 - 예상대로였습니까 아니면 중단해야합니까/다시 시도해야합니까? (P.S. 나는 틀릴 수있다.) – AnorZaken

    0

    두 개의 CPU가 별도의 스레드에서 이러한 명령을 실행할 것이기 때문에 InterlockedExchange은 기존 스레드가 완료 될 때까지 하나의 스레드를 차단합니다.

    클럭주기에 대해 걱정할 필요가 없으므로 스레드에 더 집중하십시오. 가벼운 답변을 드려 죄송합니다. 저는이 문제에 대해 전문가가 아니지만 설명서를 읽었을 때 스레드 측면이 나에게 돋보였습니다.

    2

    InterlockedExchange는 암시 적 메모리 장벽이있는 xchg 명령을 생성합니다.

    Intel Instruction set reference은 친구입니다. 잠금 작동 방식에 대한 자세한 내용은 8 장을 참조하십시오. XCHG 명령어에서

    :

    지시하고, 어떤 경우에는, 예 LOCK 신호를 표명하거나 EFLAGS에 플래그 레지스터 수정에 따라 추가 동작을 수행하는 하나 이상의 피연산자의 내용을 바꿔 환율.

    XCHG (교환) 명령어는 두 피연산자의 내용을 서로 바꿉니다. 이 명령어는 3 개의 MOV 명령어를 대신하며 기타가로드되는 동안 하나의 피연산자 위치의 내용을 저장하기 위해 임시 위치를 요구하지 않습니다. 메모리 피연산자가 XCHG 명령과 함께 사용되면 프로세서의 LOCK 신호는 이 자동으로 어설 션됩니다. 따라서,이 명령은 프로세스 동기화를 위해 semaphore 또는 유사한 데이터 구조를 구현하는 데 유용합니다. 버스 잠금에 대한 자세한 내용은 인텔 ® 64 및 IA-32 아키텍처 소프트웨어 개발자 설명서, 볼륨 3A의 8 장, "다중 프로세서 관리"의 "버스 잠금"을 참조하십시오.

    참고 자료에 대해 궁금한 점이 있으면 질문하십시오.