2013-10-29 3 views
3

on msdn http://msdn.microsoft.com/en-us/library/windows/desktop/ms684208(v=vs.85).aspx, MemoryBarrier는 xchg 호출로 구현됩니다.MemoryBarrier를 xchg 호출로 구현할 수있는 이유는 무엇입니까?

// x86 

FORCEINLINE 
VOID 
MemoryBarrier (
    VOID 
    ) 
{ 
    LONG Barrier; 
    __asm { 
     xchg Barrier, eax 
    } 
} 

"소프트웨어 개발자 안내서"에서 자료를 찾을 수 없습니다. 이유를 말씀해주십시오.

+1

메모리 피연산자가있는'xchg'에는 암시적인'lock'이 있습니다. 잠긴 지침은 울타리입니다. – harold

답변

3

IA-32 아키텍처 소프트웨어 개발자 설명서, 볼륨 3 : "시스템 프로그래밍 가이드"

8.2.5

"메모리 - 주문 모델을 강화 또는 약화" 다중 프로세서 시스템의 동기화 메커니즘은 강력한 메모리 정렬 모델에 따라 에 의존 할 수 있습니다. 여기서 프로그램은 XCHG 명령 또는 LOCK 접두사와 같은 잠금 명령을 사용하여 이 메모리에서 읽기 - 수정 - 쓰기 작업이 원자 적으로 수행됩니다 ( ). 잠금 작업은 일반적으로 모든 이전 지침이 완료되기를 기다리는 에서 I/O 작업 처럼 작동하고 모든 버퍼링 된 쓰기는 메모리으로 유출됩니다 (8.1.2 절, "버스 잠금"참조).

및 8.1.2에서

:

잠긴 작업은 다른 작업 메모리 모든 외부에서 볼 수있는 이벤트에 대한 원자이다. 명령어 인출 만 페이지 테이블 액세스가 잠긴 명령어를 전달할 수 있습니다. 잠긴 명령을 사용하여 하나의 프로세서 에서 쓰고 다른 프로세서에서 읽은 데이터를 동기화 할 수 있습니다. P6 계열 프로세서에 대한

, 고정 작업 (즉 전체에 대기입니다) 모든 뛰어난로드 및 저장 작업을 직렬화. 이 규칙은 한 가지 예외를 제외하고 Pentium 4 및 Intel Xeon 프로세서에도 해당됩니다. 약 정렬 된 메모리 유형 (예 : WC 메모리 유형)을 참조하는로드 조작은 이 직렬화되지 않을 수 있습니다.

3

두 가지가 여기 일이 :

  1. 컴파일러는 출력 명령어 스트림에 삽입하는 불투명 한 블록을 제공한다. 어떤 데이터가 블록 내부에서 액세스되는지 알지 못하기 때문에 블록 주위의 다른 명령문을 재정렬 할 수 없습니다.

  2. xchg 명령어는 원자 읽기 - 수정 - 쓰기 작업을 수행하며 메모리 버스에서 순서가 필요하므로 CPU가 메모리 장벽을 적용합니다.

    인텔 64에서