본문 바로가기
CS/컴퓨터 과학 얕은 지식

메모리 패딩이 일어나는 이유 (뜻, 목적, Memory Alignment Rule, cache hit, false sharing)

by Unagi_zoso 2022. 4. 20.

 

메모리 패딩이란 다음과 같이 구조체나 클래스를 구성할 경우

우리의 예상과 달리 더 큰 값이 나옴을 확일 할 수 있는데

이는 메모리 패딩이 일어나서이다. 

 

 

windows10 x64, Visual Studio Code 1.61.2, gcc 6.3.0 환경에서 작성되었습니다.

 

메모리 패딩의 뜻

 

즉 메모리 패딩은 메모리에 저장되는 데이터와 그 다음 데이터 사이에 생기는 공백을 이르는 말이다.

 

 

메모리 패딩의 사용 목적

 

이러한 메모리 패딩이 사용되는 목적으로는

프로세서가 데이터를 다루는데 기본이 되는 단위는 Word인데 이 Word에 맞게끔 데이터의 메모리 크기를 추가하여

cache hit ratio를 높이고 CPU의 연산 횟수를 줄이는 등 프로세스 전반의 능률을 향상시키기 위함이다. 

 

  Word 크기
32비트 OS 4bytes
64비트 OS 8bytes

 

 

 

Memory Alignment Rule

이는 메모리 패딩을 구현하기 위한 규칙이다. 

1. 각 데이터는 메모리 주소상 자신의 데이터 크기의 배수인 주소에서부터 시작해야한다 (ex. 4bytes int는 4의 배수)

2. 데이터의 전체 크기자신의 데이터(클래스나 구조체 경우 자신이 포함한 가장 큰 데이터의)  크기의 배수여야한다.

 

 

 

 

memory alignment rule에서 구조체나 클래스의 전체 크기는 왜 가장 큰 타입의 영향을 받는지 궁금할 수 있는데

구조체로 배열을 만든다 생각하면 쉽게 해답을 구할 수 있다.

 

 

 

 

어떻게 작동하길래 프로세서에서 이로운가

 

 

위의 이미지에서 볼 수 있듯 프로세서는 4bytes 짜리 데이터 하나를 가져오기 위해 

2개의 word가 필요하다. 허나 패딩을 넣어주고 4bytes 짜리 데이터를

최대한 하나의 word 규격에 맞춰줌으로 프로세서의 연산을 줄여준다.

패딩이 들어가 더 느려지지 않을까 염려할 수 있지만

패딩이 들어간 부분은 빠르게 지나기에 괜찮다.

 

 

 

 

 

cache hit ratio는 어떻게 높이는가

캐시의 최소기본 단위인 라인은 최신 프로세서 기준 64bytes를 따르고 있는데 위의 예처럼

하나의 word 안에 충분히 들어갈 수 있는 데이터를 word의 경계에 걸쳐

두 개의 word 에서 부분을 저장할 시 이 데이터가 서로 다른 캐시 라인에 들어가

별도의 작업을 해야만하는 것이다.

이를 패딩으로 방지함으로써 cache hit ratio를 높일 수 있는 것이다. 

사실 이 부분은 더 깊은 이유가 있지만 본 글의 주제을 넘어서기에

cache hit과 관련하여 따로 글을 적겠다.

 

 

패딩을 일부러 없애는 경우

네트워크의 프로토콜 통신 같은 경우 패킷 사이즈라던가 규격이 다달라 패딩을 일부러 없애는 경우가 있다.

 

 

그리고 패딩은 운영체제가 아니라 컴파일러에 의해 만들어진다.

 

 

 

 

 

이상 읽어봐주셔서 감사합니다.

댓글