하드웨어가 제공하는 원자적 연산을 사용해 여러 프로세스나 스레드가 동시에 동일한 메모리 위치에 접근할 때 발생할 수 있는 충돌을 방지한다.
CPU는 명령어 최적화나 파이프라인처리를 위해 명령어를 재정렬할 수 있다. 메모리 장벽은 하드웨어적으로 명령어 실행 순서를 강제하여, 동기화된 실행 순서가 보장되도록 한다.
Test and Set이나 Compare and Swap 명령어는 세마포어나 뮤텍스와 같은 동기화 기법을 하드웨어적으로 지원하는 방식이다. 이를 통해 프로세스나 코어는 특정 자원에 대해 단독으로 접근할 수 있도록 잠금을 설정한다.
volatile 키워드는 변수에 사용하여 컴파일러가 최적화를 하지 않도록 한다. 보통 컴파일러는 성능을 최적화하기 위해 코드에서 사용하지 않는 변수들을 제거하거나, 같은 값을 여러 번 읽지 않도록 최적화할 수 있다. 그러나 volatile을 사용하면, 변수의 값을 항상 메모리에서 직접 읽고 쓰게 하여 최적화를 방지한다.
멀티코어 시스템에서는 여러 코어가 동시에 자원을 공유하기 때문에 동기화가 더욱 중요하다. 멀티코어 환경에서 동기화가 이루어지는 방식은 하드웨어와 소프트웨어의 협력으로 이루어진다.
각 코어는 자신의 로컬 캐시를 사용하기 때문에, 여러 코어가 동일한 메모리 위치를 수정할 때 캐시 일관성 문제가 발생할 수 있다. 이를 해결하기 위해 캐시 일관성 프로토콜을 사용한다.
MESI 프로토콜이 대표적인 캐시 일관성 프로토콜이다. 이 프로토콜은 각 캐시가 어떤 상태 (수정됨, 독점적, 공유됨, 무효)인지를 추적하여 데이터를 일관성 있게 유지한다.
멀티코어 시스템에서는 CPU가 명령어 실행 순서를 최적화를 할 수 있기 때문에, 메모리 일관성을 보장하기 위핸 매커니즘이 필요하다. 이를 위해 CPU는메모리 모델을 제공해서, 어떤 연산이 다른 연산보다 먼저 실행되도록 보장한다.
멀티코어 환경에서는 하드웨어적인 원자적 연산을 통해 락을 구현할 수 있다. 다른 코어가 동일 자원에 접근하는 것을 막는 것이다. 원자적 연산은 캐시 일관성을 고려한 방식으로 동작하여, 여러 코어가 자원을 동시에 수정할 때 충돌을 방지하고자 한다.
멀티코어 시스템에서 메모리 장벽을 사용하여 CPU가 명령어를 최적화하거나 재정렬하는 것을 방지하고, 동기화된 실행 순서를 보장한다. 예를 들어 한 코어에서 락을 해제한 후 다른 코어가 그 락을 획득하기 전까지 메모리 장벽을사용하여 명령어 순서를 보장한다.