sourcecode

"메모리가 8바이트 정렬"이라는 것은 무엇을 의미합니까?

codebag 2023. 7. 7. 19:01
반응형

"메모리가 8바이트 정렬"이라는 것은 무엇을 의미합니까?

한 프로젝트를 진행하면서 메모리 데이터가 "8바이트 정렬"되어 있는 것을 보았습니다.이것이 무엇을 의미하는지 설명해 줄 수 있는 사람이 있습니까?

"8바이트 정렬"된 개체는 8의 배수인 메모리 주소에 저장됩니다.

대부분의 CPU는 정렬된 위치에서 일부 데이터 유형만 로드합니다. 다른 CPU에서는 이러한 액세스 속도가 더 빠릅니다.또한 메모리 정렬을 사용하는 데에는 몇 가지 다른 이유가 있을 수 있습니다. 코드를 보지 않으면 이유를 말하기가 어렵습니다.


메모리에 대한 외부 버스의 폭이 단일 바이트가 아니기 때문에 정렬된 액세스 속도가 더 빠릅니다. 일반적으로 4-8바이트(또는 더 넓음)입니다.이는 CPU가 한 번에 단일 바이트를 가져오지 않는다는 것을 의미합니다. 즉, 요청된 주소에서 시작하여 4바이트 또는 8바이트를 가져옵니다.따라서 메모리 주소의 최하위 2비트 또는 3비트는 CPU에 의해 실제로 전송되지 않습니다. 외부 메모리는 버스 너비의 배수인 주소에서만 읽거나 쓸 수 있습니다.주소 "9"에서 바이트를 요청하면 CPU는 실제로 메모리에 주소 8에서 시작하는 바이트 블록을 요청하고 두 번째 바이트를 레지스터에 로드합니다(다른 것은 폐기).

이는 액세스가 잘못 정렬되면 메모리에서 두 개의 읽기가 필요할 수 있음을 의미합니다.주소 9에서 시작하는 8바이트를 요청하는 경우 CPU는 주소 8에서 시작하는 8바이트와 주소 16에서 시작하는 8바이트를 가져온 다음 원하는 바이트를 마스크해야 합니다.반면에 주소 8에서 시작하는 8바이트를 요청하는 경우 단일 가져오기만 필요합니다.일부 CPU는 이러한 잘못 정렬된 로드를 수행하지도 않습니다. 단순히 예외를 발생시킬 뿐입니다(또는 자동으로 잘못된 데이터를 로드할 수도 있습니다!

메모리 정렬은 다양한 방식으로 성능을 향상시키는 데 중요합니다.하드웨어 관련 이유가 있습니다.80년대 이후로 CPU와 메모리 간의 액세스 시간에 차이가 있습니다.프로세서의 속도가 메모리의 속도보다 빠르게 증가하고 있습니다.이러한 차이는 시간이 지남에 따라 점점 더 커지고 있습니다(예를 들어, Apple II의 CPU는 1.023MHz였고 메모리는 그 주파수의 두 배, CPU는 1주기, 비디오는 1주기였습니다).최신 PC는 CPU에서 약 3GHz에서 작동하며 메모리는 400MHz에 불과합니다.메모리 속도 저하 문제에 대한 한 가지 해결책은 한 번에 1바이트에 액세스하는 대신 CPU가 메모리에서 64비트 와이드 워드를 읽는 더 넓은 버스에서 액세스하는 것입니다.즉, 메모리에서 1바이트를 읽어도 버스가 64비트(8바이트 워드) 전체를 전송합니다.메모리는 주소 0, 8, 16, 24, 32, 40 등에 이러한 8바이트 단위를 가집니다.8의 배수.예를 들어 주소 4에서 8바이트 단어에 액세스하는 경우 하드웨어는 주소 0에서 단어를 읽고, 해당 단어의 높은 4바이트를 마스크한 다음 주소 8에서 단어를 읽고, 해당 단어의 낮은 부분을 마스크하고, 첫 번째 절반과 결합하여 레지스터에 제공해야 합니다.상당히 복잡한(따라서 느린) 작업을 볼 수 있습니다.이것이 정렬된 메모리 액세스를 좋아하는 첫 번째 이유입니다.저는 2시간 후에 다른 이유를 제시하겠습니다.

"X바이트 정렬"은 데이터의 기본 주소가 X의 배수여야 함을 의미합니다.일부 특수 하드웨어에서 DMA와 같은 특수 하드웨어를 사용하거나 CPU에서 더 빠르게 액세스할 수 있습니다.

셀 프로세서의 경우, 보조 프로세서로 복사하거나 보조 프로세서에서 복사하려면 16바이트의 데이터가 정렬되어야 합니다.

메모리 데이터가 8바이트 정렬되어 있으면 다음을 의미합니다.
sizeof(the_data) % 8 == 0.
일반적으로 C 언어에서, 구조가 8바이트 정렬로 제안된다면, 그것의 크기는 8의 곱이어야 하고, 그렇지 않다면, 패딩은 수동으로 또는 컴파일러에 의해 요구됩니다. 몇몇 컴파일러들은 n바이트 정렬로 구조를 만들기 위한 지시를 제공합니다, VC를 위해,#prgama pack(8)그리고 gcc의 경우, 그것은.__attribute__((aligned(8))).

언급URL : https://stackoverflow.com/questions/2846914/what-is-meant-by-memory-is-8-bytes-aligned

반응형