Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

공부용 이모저모

메모리 단편화 & 메모리 풀 본문

C++

메모리 단편화 & 메모리 풀

불타는버스 2021. 8. 6. 18:07

개요

 

기존 malloc이나 new연산자의 경우, 사이즈가 고정되지 않아

생성과 삭제를 반복할경우 메모리 단편화 현상이 생긴다. 대충 설명하자면 이런 형태이다.

 

컴퓨터의 힙공간이 이런 모양이라고 가정하자.
int -> short -> int 형으로 new 할당을 했을경우, 순서대로 4,2,4 순으로 힙에 쌓일 것이다.
중간에 short를 지웠으면 이런모양이 나오게 된다.

여기서 중요한점은, 시스템에서 딱히 저 빈공간을 당겨주거나 하지 않는다는 것이다.

그대로 int 형을 새로 할당할 경우, 2바이트 만큼의 구멍이 생긴채 메모리가 계속 쌓인다.

힙메모리 공간특성상 당연히 훨씬 큰 용량이 있겠지만, 사진처럼 용량이 12바이트라고 가정하자면,

남아있는 공간이 4바이트이기 때문에 int형을 한번더 만들 수 있다고 생각 할 수 있지만,

실제로는 떨어져있는 2바이트 공간 2개만이 남은것이라 생성이 불가능하다.

 

공간이 크다고 가정해도 저런식으로 크기가 다른 new와 delete를 반복한다고 하면 아래와 같은 모양이 나온다.

 

이런식으로 중간중간 구멍이 나는걸 메모리 단편화라고 한다.

PC에서도 이러한 것을 정리해서 공간을 넓히는 [디스크 조각모음]이라는 메뉴가 있다. 이런식으로 구멍이 난 데이터들을

하나로 모으는 작업이다.물론 실제로 당기고 늘리고 하는것은 아니고,메모리를 삭제 복사하는것이기 때문에, 오래걸린다.

 

이러한 현상을 해결하기 위해 존재하는 것이 메모리 풀이다.

하지만 큰 프로젝트에서 이 방법으로 완전히 막아내는건 불가능에 가깝고

어디까지나 최대한 메모리 단편화를 막아내기 위한 방법이다. 

 

메모리 풀

 

메모리 풀은 고정된 크기의 블록을 할당해 동적할당을 해준다.

이점은 new delete로 인한 단편화 현상으로부터 많이 안전해 질 수 있으며,

new delete를 사용하는 것보다 더 속도가 빠르다.

당연하지만 처음에는 똑같이 new를 하기 때문에 비슷하거나 조금 느리다.

 

메모리 풀의 종류는 고정 메모리풀, 가변 메모리 풀이 존재한다.

고정 메모리풀은 오브젝트(클래스) 단위로 관리한다.

가령 슈팅게임이라고 가정시,총알은 여러개가 존재 할 수 있는데,

게임에 나올 총알을 할당할 때마다 보관해 두었다가,

다시 on 시킮으로써 재활용 하는것이다.

그리고 일정 수치를 넘어가면, 더이상의 new를 하지 못하게 막아낸다.

 

새로운 것을 할당할때, 똑같은 크기를 지닌 false 시킨 객체 하나를

덮어씌우는 식으로 쓰기도 한다. 

 

정해진 만큼만 요청하기 때문에 단편화 현상이 발생할 일은 거의 없다.

또한 정해진 규율에 따르기 때문에 구현이 쉬운 축에 속한다.

 

DirectX에서는 이미지 크기가 다른 이미지들도 강제로 빈공간을 늘려 2의 배수 단위로 관리한다.

이 또한 고정 메모리풀 방식이라고 볼 수 있다. 대신 DX는 이런 구성의 단점으로 이미지크기가 커질수록

낭비하는 공간이 많아진다는 문제가 있기는 하다.(2048 x 2048을 1픽셀이라도 넘어가는순간 4096 x 4096이 된다)

가변 메모리 풀은 최초의 생성 당시에는 오브젝트의 베이스 규모로 생성하되,

이후에 추가되는 내용물에 따라 각 객체당의 할당크기가 늘어나게 한다.(사이즈의 제한은 있어야한다)

다형성을 이용해 관리하는것으로 생각하면 된다.

 

Free List라고도 불리며, 갯수 파악이 쉽다는 장점이 있다.

가변적으로 사용하는 것이기 때문에 on off 또한 없이 new delete로 사용한다.

 

사실상 new를 사용하는것과 차이가 없다시피한데, 이러한 방식은

오브젝트의 관리를 위해 사용하며, 보통 두가지를 같이 만들어 사용한다.

 

정리하면,

1.오브젝트의 사이즈가 확실한 객체의 경우 고정 메모리풀로 배치시킨다.

2.사이즈가 고정되지 않은 가변적인 메모리들을 가변 메모리 풀로 배치 시켜서 관리한다.

 

'C++' 카테고리의 다른 글

DFS/BFS(깊이우선/너비우선 탐색) 공부  (0) 2021.08.04
A* 알고리즘 공부  (0) 2021.08.04