Memory Barrier

배리어는 크게 두 종류로 분류할 수 있다. 컴파일러 최적화 기능으로 인한 코드 재배치 문제를 해결하기 위한 “컴파일러 배리어compiler barrier”와 프로세서 최적화 전략으로 인한 보장되지 않은 실제 실행 순서 문제를 해결하기 위한 “프로세서 배리어processor barrier”가 있다.

컴파일러에 의한 코드 재배치 문제는 이미 다루어 본 적이 있는 문제라 여기에서는 프로세서 배리어에 대해 알아본다. ARM 아키텍처 기준으로 세가지 명령어가 제공된다: DMB, DSB, ISB

dmb 이전에 명시된 메모리 접근이 모두 완료된 후에 dmb 이후에 명시된 메모리 접근을 시작 하도록 보장한다.

‘명시된 메모리 접근’은 메모리 접근을 수반하는 명령어가 실행되었으나 메모리 접근이 실제로 실행되거나 완료되지 않은 상태를 뜻한다.

dmb 명령이 메모리 접근순서만을 보장하는 반면 dsb 명령은 메모리 접근뿐만 아니라 명령어 실행 역시 동기화시킨다. 즉, dsb 명령이 이슈되면 모든 메모리 읽기가 완료되고 write buffer가 비워질 때(쓰기가 완료될 때) 까지 다른 명령어의 실행이 중지stall 된다.

앞서 메모리 배리어인 두 명령어와 달리 이 명령은 명령어 실행 순서를 보장하는 명령어 배리어다. isb 명령이 실행되면 파이프라인을 비우고 캐시나 메모리로부터 명령어를 다시 페치한다. isb 이전에 수행된 ASID 변경이나 TLB, 분기예측, CP15 레지스터 변경이 isb 이후 페치된 명령어들에 적용되는 것을 보장한다.

(추가) 다음 링크에 관련 문제가 잘 정리되어 있다: