메모리 물리적 구조
메모리의 물리적 구조를 살펴 보겠습니다. 메모리의 일반적인 이미지는 다음과 같습니다.
그림 1 메모리 개요
메모리는 여러 개의 검은 색 메모리 입자로 구성됩니다. 각 메모리 입자를 칩이라고합니다. 각 칩은 8 개의 뱅크로 구성됩니다. 그 구조는 다음과 같습니다.
그림 2 칩의 내부 구조
이전 기사에서 언급했듯이 각 뱅크는 2 차원 평면의 행렬입니다. 행렬의 각 요소는 8 비트 인 1 바이트를 저장합니다.
그림 3 은행 내부 구조
메모리 주소 지정 방법
따라서 0x0000-0x0007과 같이 응용 프로그램의 메모리에 연속 주소가있는 8 바이트의 경우 뱅크에 있습니까? 직관적으로 첫 번째 은행에 있어야합니까? 프로그래머의 관점에서 보면 연속 된 주소 0x0000-0x0007은 실제로 8 개의 뱅크에 있으며 각 뱅크는 1 바이트 만 저장합니다. 물리적으로 연속적이지 않습니다. 아래 그림은 실제 상황을 잘 보여줍니다.
그림 4 메모리에서 연속 8 바이트의 실제 분포
왜 이것이 회로가 효율적으로 작동하기 때문인지 궁금 할 것입니다. 메모리의 8 개 뱅크는 병렬로 작동 할 수 있습니다. 주소 0x0000-0x0007을 읽으려면 각 뱅크가 한 번 작동하고 데이터가 함께 원하는 데이터가되고 IO 효율성이 높아집니다. 그러나 은행에 저장하고 싶다면 은행은 자체 작업 만 수행 할 수 있습니다. 직렬로만 읽을 수 있고 8 번 읽어야하므로 속도가 훨씬 느려집니다.
결론적으로
따라서 메모리 정렬의 가장 중요한 이유는 메모리 IO가 8 바이트 및 64 비트 단위로 수행되기 때문입니다. 64 비트 데이터 폭을 가진 메모리의 경우 CPU도 64 비트 CPU (기본적으로 요즘 컴퓨터의 경우)이면 메모리 IO가 데이터를 얻을 때마다 8 개 뱅크 각각에서 1 바이트를 읽습니다. 같은 열의 같은 열. of. 메모리의 주소 0부터 시작하여 0-7 바이트의 데이터를 IO로 한 번에 읽을 수 있으며 8-15 바이트의 데이터도 한 번에 읽을 수 있습니다.
또 다른 예를 들어, 0x0001-0x0008 (또한 8 바이트이지만 0으로 시작하지 않는 0x0001-0x0008)을 얻으려는 경우 메모리가 어떻게 작동합니까? 좋은 방법은 없습니다. 메모리가 한 번 작동하여 0x0000-0x0007을 꺼내고 0x0008-0x0015를 꺼내 두 번의 결과를 모두 반환해야합니다. CPU 및 메모리 IO의 하드웨어 제한으로 인해 한 번에 두 데이터 폭의 중간에서 IO를 수행 할 수 없습니다. 이런 식으로 응용 프로그램이 느려지고 메모리 정렬을 이해하지 못하기 때문에 컴퓨터에 작은 불이익으로 간주 될 수 있습니다.
확장 1 : 사실, 컴파일러와 링커는 개발자를 위해 자동으로 메모리를 정렬하고 변수가 열 주소 지정을 교차하지 않도록 도와줍니다. 그러나 그는 완벽 할 수 없습니다.
확장 2 : 사실, 메모리 하드웨어 계층에는 운영 체제 계층도 있습니다. 운영 체제는 또한 CPU의 1 차, 2 차 및 3 차 캐시를 관리합니다. 노출이 있는지 모르겠습니다. 이전 기사에서는 캐시의 캐시 라인이 메모리 IO 단위의 8 배인 64 바이트로 메모리 IO를 낭비하지 않는다고했습니다.