내부 핵에서 구동과 관련된 메모리 조작의 10(메모리 장벽)

1440 단어
실제 구동에서는 자주 사용되지 않지만, 내부 핵이 비교적 깊은 코드를 읽으면 자주 만날 수 있다.왜 메모리 장벽이 존재합니까?먼저 다음 장면을 살펴보겠습니다.
컴파일러와 프로세서는 효율성을 높이기 위해 다음과 같은 읽기 및 쓰기 작업의 순서를 재정리할 수 있습니다.
일부 프로세서에서는 다음 코드가 사용됩니다.
    A = 1;
 
    B = 2;
A에 새 값을 저장하기 전에 B에 새 값을 저장할 수 있습니다.
그러나 우리는 메모리를 조작하거나 하드웨어와 상호작용을 할 때 항상 정해진 순서를 확보해야 한다.순서를 재정리하고 쓸 수 있는 모든 프로세서는 기계 명령을 제공하여 순서를 확보할 수 있으며, 또한 컴파일러가 정점 주위의 명령 서열을 재정리하지 말라고 알릴 수도 있다.이 순서를 확보하는 지령을'장벽'이라고 한다.
메모리 장벽의 존재 의미는 컴파일러와 프로세서가 코드에 대한 순서 접근 문제를 해결하기 위한 것이다.
메모리 장벽에 대한 커널의 API는 다음과 같습니다.
rmb():
   
rmb () 를 뛰어넘는 불러오는 동작이 정렬되지 않도록 '읽기' 메모리 장벽을 제공합니다.rmb () 이전의 불러오는 작업은 rmb () 다음에 다시 배열되지 않는다는 뜻이다.
wmb():

방법은 rmb () 함수와 유사한 메모리 장벽을 제공합니다.차이점은 로딩이 아닌 스토리지에 불과합니다. 장벽을 뛰어넘는 스토리지가 정렬되지 않도록 합니다.
mb():

읽기 장벽도 제공했고 쓰기 장벽도 제공했다.상기 rmb() 함수와wmb() 함수의 기능과.
read_barrier_depends():

rmb()의 변종으로 rmb()의 최적화로 이해할 수 있습니다.이 장벽은 장벽 앞의 읽기 조작이 장벽 뒤의 읽기 조작 전에 서로 의존하는 읽기 조작을 완성하도록 확보한다.
인스턴스:
아래의 이 실례에서 a의 초기값은 1이고 b의 초기값은 2이다.
  1           2

a = 3;         -

Mb();          -

b = 4;       c = b;

  -          rmb();

  -          d = a;

만약 메모리 장벽을 사용하지 않는다면 c는 b의 새로운 값을 받아들였고 d는 a의 원래 값을 받아들였을 것이다.c는 4와 같을 수도 있고 d는 1과 같을 수도 있다.따라서 순서가 요구되는 레지스터 조작에 대해 메모리 장벽은 반드시 고려해야 한다.

좋은 웹페이지 즐겨찾기