메모리 펜스 란 무엇입니까?


답변:


115

성능 향상을 위해 최신 CPU는 사용 가능한 실리콘 (메모리 읽기 / 쓰기 포함)을 최대한 활용하기 위해 종종 명령을 순서대로 실행하지 않습니다. 하드웨어는 명령 무결성을 강제하기 때문에 단일 실행 스레드에서이를 알 수 없습니다. 그러나 휘발성 메모리 (예 : 메모리 매핑 I / O)가있는 여러 스레드 또는 환경의 경우 이로 인해 예상치 못한 동작이 발생할 수 있습니다.

메모리 펜스 / 장벽은 메모리 읽기 / 쓰기가 예상 한 순서대로 발생 함을 의미하는 명령어 클래스입니다. 예를 들어 '풀 펜스'는 펜스 이전의 모든 읽기 / 쓰기가 펜스 이후의 것보다 먼저 커밋됨을 의미합니다.

메모리 펜스는 하드웨어 개념입니다. 고수준 언어에서 우리는 뮤텍스와 세마포어를 다루는 데 익숙합니다. 저수준에서 메모리 펜스를 사용하여 구현 될 수 있으며 메모리 장벽을 명시 적으로 사용할 필요가 없습니다. 메모리 장벽을 사용하려면 하드웨어 아키텍처를주의 깊게 연구해야하며 응용 프로그램 코드보다 장치 드라이버에서 더 많이 발견됩니다.

CPU 재정렬은 컴파일러 최적화와는 다르지만 아티팩트는 비슷할 수 있습니다. 바람직하지 않은 동작 (예 : C에서 volatile 키워드 사용)이 발생할 수있는 경우 컴파일러가 명령어 순서를 변경하는 것을 중지하기 위해 별도의 조치를 취해야합니다.


26
나는 휘발성이 컴파일러 재정렬을 멈추기에 충분하다고 생각하지 않는다. AFAIK는 컴파일러가 변수 값을 캐시 할 수 없는지 확인합니다. Linux 커널은 gcc 확장 ( asm __volatile __ ( "": : : "memory"))을 사용하여 완전한 컴파일러 최적화 장벽을 만듭니다.
CesarB

5
사실, volatile은 스레드를 인식하지 않지만 특정 최적화를 적용하는 컴파일러를 중지하는 데 사용할 수 있습니다. 이것은 펜스와 관련이 없습니다.)
Gwaredd

3
(.NET CLR) 휘발성 읽기는 획득 차단이고 쓰기는 해제 차단입니다. Interlocked ops는 MemoryBarrier 메서드처럼 가득 차 있습니다.
Luke Puplett

3
그물은 여기에서 찾을 수 있습니다에서 휘발성 키워드에 대한 재미있는 읽기 albahari.com/threading/part4.aspx#_NonBlockingSynch 이 사이트는 C #에서 스레딩에 유용한 정보를 많이 포함
바스 미트에게

developerWorks에는 PowerPC 메모리 스토리지 모델에 대한 좋은 [기사] [1]가 있습니다. [1] : ibm.com/developerworks/systems/articles/powerpc.html
Iouri Goussev 2011 년

17

내 대답 을 다른 질문에 복사 합니다. 프로세서가 코드를 최적화하기 위해 수행하는 트릭은 무엇입니까? :

가장 중요한 것은 메모리 액세스 재정렬입니다.

메모리 펜스 또는 직렬화 명령이없는 경우 프로세서는 메모리 액세스 순서를 자유롭게 조정할 수 있습니다. 일부 프로세서 아키텍처는 재주문 할 수있는 양에 제한이 있습니다. 알파는 가장 약한 것으로 알려져 있습니다 (즉, 가장 많이 재정렬 할 수있는 것).

이 주제에 대한 아주 좋은 처리는 Linux 커널 소스 문서, Documentation / memory-barriers.txt 에서 찾을 수 있습니다 .

대부분의 경우 컴파일러 또는 표준 라이브러리에서 잠금 기본 형식을 사용하는 것이 가장 좋습니다. 이것들은 잘 테스트되고, 필요한 모든 메모리 장벽이 제자리에 있어야하며, 아마도 상당히 최적화되어있을 것입니다 (잠금 프리미티브를 최적화하는 것은 까다 롭습니다. 심지어 전문가조차도 때때로 잘못 이해할 수 있습니다).


재정렬 흐름에 어떤 영향을 미칩니 까? 라고 말했을 때 Alpha is known for being the weakest, 왜 weakest? 그게 더 낫지 않습니까, 더 많이 재정렬하여 결과적으로 훨씬 더 빠른 실행이 될 것입니까? (나는 알파 사용자가 아니지만 very reorderingvs 의 효과에 대해 묻습니다 restricted reordering.) 따라서 로트 재정렬의 단점은 무엇입니까 (정의되지 않은 동작의 위험을 제외하고, 대부분의 최신 CPU는 좋은 재정렬을 해결하고 정의 된 재정렬 만 구현 했어야합니다. 그렇지 않으면 결정을 이해하지 못할 것입니다).
Herdsman

8

내 경험상 여러 스레드간에 메모리 액세스를 동기화하는 명령 (명시 적 또는 암시 적) 인 메모리 장벽을 나타냅니다 .

이 문제는 최신 공격적 컴파일러 (명령을 재정렬 할 수있는 놀라운 자유가 있지만 일반적으로 스레드에 대해 전혀 알지 못함)와 최신 멀티 코어 CPU의 조합에서 발생합니다.

문제에 대한 좋은 소개는 " '이중 검사 잠금이 깨 졌습니다 '선언 "입니다. 많은 사람들에게 용이 있다는 것은 모닝콜이었습니다.

암시 적 전체 메모리 장벽은 일반적으로 핵심을 포함하는 플랫폼 스레드 동기화 루틴에 포함됩니다. 그러나 잠금없는 프로그래밍 및 맞춤형 경량 동기화 패턴을 구현하려면 종종 장벽 만 필요하거나 단방향 장벽 만 필요합니다.


2

Wikipedia는 모두 알고 있습니다 ...

membar 또는 메모리 펜스라고도하는 메모리 배리어는 CPU (중앙 처리 장치)가 배리어 명령 전후에 실행되는 메모리 작업에 대한 순서 지정 제약을 적용하도록하는 명령 클래스입니다.

CPU는 메모리로드 및 저장 작업을 포함하여 비 순차적 실행을 초래할 수있는 성능 최적화를 사용합니다. 메모리 작업 재정렬은 일반적으로 단일 실행 스레드 내에서 눈에 띄지 않지만 신중하게 제어하지 않는 한 동시 프로그램 및 장치 드라이버에서 예측할 수없는 동작을 유발합니다. 주문 제약의 정확한 특성은 하드웨어에 따라 다르며 아키텍처의 메모리 모델에 의해 정의됩니다. 일부 아키텍처는 서로 다른 순서 제한을 적용하기위한 여러 장벽을 제공합니다.

메모리 장벽은 일반적으로 여러 장치가 공유하는 메모리에서 작동하는 저수준 기계 코드를 구현할 때 사용됩니다. 이러한 코드에는 다중 프로세서 시스템의 동기화 프리미티브 및 잠금없는 데이터 구조 및 컴퓨터 하드웨어와 통신하는 장치 드라이버가 포함됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.