대부분 시스템 소프트웨어 개발자는 C 언어로 프로그래밍합니다. C 언어로 작성된 코드는 컴파일러에 의해 기계어로 변환되는데, 과정에서 컴파일러는 성능을 최적화하기 위해 코드를 나름대로 재해석합니다. 컴파일러에 의해 최적화된 코드를 보면 " 컴파일러는 똑똑하구나, 어떻게 코드를 알아서 생성했을까!" 생각이 듭니다.

 

C 코드를 컴파일할 컴파일러 최적화 옵션을 적용하는데, 최적화 레벨이 높을수록 컴파일러는 높은 수준의 최적화를 수행합니다. 하지만 컴파일러는 프로그래머가 작성한 코드를 최적화하는 과정에서 종종 사고를 치기도 합니다. 코드를 최적화하다 보니 선을 넘어 프로그래머가 의도하지 않은 코드를 생성하기 때문입니다. 예를 들어, 함수를 인라인으로 처리하면서 심벌이 제거되기도 합니다.

 

컴파일러가 코드를 생성하는 과정에서 최적화를 수행해 문제를 일으키면 차라리 낫습니다. C 코드와 컴파일러가 생성한 어셈블리 명령어를 비교하면 컴파일러가 명령어를 어떻게 생성했는지 확인할 있기 때문입니다. 하지만 Arm 프로세서 내부에서 명령어의 순서를 바꿔서 실행하면 소프트웨어 개발자가 이를 눈으로 확인할 없습니다. Arm 프로세서는 명령어 의존성이 없다면 성능을 최적화하기 위해 '메모리 액세스' 순서를 변경할 있기 때문입니다.

 

이러한 노멀 메모리의 특징을 Weakly-Ordered 모델이라고 명시합니다. 'weakly Ordered 모델 가장 특징은 메모리 액세스 순서가 프로그램 순서와 같을 필요가 없다라는 점인데, 여기서 말하는 프로그래밍 순서의 기준은 로드와 스토어입니다.

+ Recent posts