Notice
Recent Posts
Recent Comments
Link
«   2024/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
관리 메뉴

승쨩개발공부

[DP] Object Pool 본문

Design Pattern

[DP] Object Pool

Unknowns 2022. 5. 13. 20:39

오브젝트 풀

객체를 매번 할당, 해제하지 않고 고정 크기 풀에 들어있는 객체를 재사용함으로써

메모리 성능을 개선한다.

 

해제하지 않는데 어떻게 메모리 사용 성능이 개선된다는걸까?

 

게임에는 총을쏘거나 마법을쓰거나 검을 휘두를떄 빛이 생성이된다.

이 빛은 파티클 시스템이 필요하다. 

검을 몇번 휘두르는것만 해도 수많은 파티클이 생성이되야한다.

그렇기에 이 파티클을 굉장히 빠르게 만들 수 있어야 한다.

 

더욱 중요한것은 파티클을 생성, 제거하는 과정에 메모리 단편화가 생겨서는 안 된다는 점 이다.

 

단편화를 막으면서도 메모리 할당 속도 떄문에 메모리를 언제 어떻게 관리할 지를 엄청 신경써야 한다.

 

이러한 문제는 게임이 실행될 떄 메모리를 미리 크게 잡아놓고 끝날 떄까지 들고 있는 것으로 해결할 수 있다.

 

하지만 이러한 방법도 게임 실행 중에 객체를 생성, 제거해야 하는 시스템 입장에서는 골치가 아프다.

 

이럴떄 쓰는 것이 객체 풀이다.

 

메모리 관리자 입장에서는 처음에 한번 메모리를 크게 잡아놓고 게임이 실행되는 동안 계속 들고 있는 것이다.

객체 풀, 그 안에서 객체를 할당, 해제를 자유롭게 할 수 있다.

 

다시 정확하게 정의하자면 재사용 가능한 객체들을 모아놓은 객체 풀, pool 클래스를 정의한다.

여기에 들어가는 객체는

자신이 "사용중"인지 여부를 알 수 있는 방법을 제공해야 한다.

 

사용 중이 아니라면 객체 풀에 다시 집어 넣어야 하기 떄문

 

해당 풀에 객체를 미리 "사용 안함" 상태로 선언해놓고

필요할 떄 객체 풀에 새로운 객체를 달라고 요구하는 것이다.

그렇게 되면 풀에서 객체를 선택하여 "사용 중" 상태로 바꾼 뒤 객체를 반환해준다.

 

즉, 이런 식으로 메모리나 다른 자원 할당을 신경쓰지 않고 마음껏 객체를 생성, 삭제할 수 있다.

 

이 오브젝트 풀 언제 써야하는가?

 

1. 객체의 빈번한 생성 및 삭제가 있을떄.

2. 객체들의 크기가 비슷할떄.

3. 객체를 힙에 생성하는데 오래걸리거나 메모리 단편화가 걱정될떄.

 

 

 

 

 

 

 

 

 

메모리 단편화

 

단편화?

RAM에서 공간이 작은 조각으로 나누어져 사용 가능한 메모리가 충분히 존재하지만 할당이 불가능한 상태

단편화는 내부,외부 단편화가있다.

 

 

내부 단편화

메모리를 할당할 떄 프로세스의 메모리가 필요한 양보다 더 많이 할당되어서 프로세스에서

사용하는 메모리 공간이 낭비되는 현상이다.

ex) 구조체 메모리 정책

운영체제가 프로세스에 30MB를 할당 해줬을떄, 사실당 20MB만 사용하고 있을 경우 내부 단편화가

10MB만큼 발생한다.

30MB의 빈공간에 20MB크기의 프로세스4가 할당되면

10MB의 내부 단편화가 일어나게 된다.

 

 

외부 단편화

프로세스들의 메모리를 할당하고 난 다음 아주 작은 크기로 남은 조각들이 생겨 사용할수 없는

작은 메모리 공간들이 생길 수 있는데, 이 공간들을 합쳐서 새로운 프로세스가 요구하는

메모리의 크기를 할당할 수 있음에도 불구하고 연속적인 공간이 아니라서 할당을 하지 못하는 경우다.

\ex) 디스크 조각모음

10MB + 10MB = 20MB의 크기가 남아있지만.

20MB의 메모리가 필요한 프로세스4는 할당 될 수 없다.

 

 

메모리 풀

미리 메모리를 할당해놀고 이 안에서 필요한 만큼 사용하고 반납하는 형태로

메모리를 재활용하는 기법이다.

 

메모리 풀 없이 동적할당과 해제를 반복하면 메모리의 랜덤한(실제로는 알고리즘에 의한)

위치에 할당과 해제가 반복되면서 단편화를 일으킬 수 있겟지만 미리 공간을 할당해놓고 가져다 쓰고

반납하기 떄문에 할당과 해제로 인한 외부 단편화가 발생하지 않는다.

 

또한 필요한 크기만큼 할당을 해놓기 때문에 내부 단편화 또한 생기지 않는다.

하지만 메모리 단편화로 인한 메모리 낭비량보다 메모리 풀을 만들었지만 쓰지 않았을 떄 메모리 양이

커질 경우 사용하지 않아야 한다.

 

메모리의 할당, 해제가 잦은 경우에 메모리 풀을 쓰면 효과적이다.

 

미리 할당해놓고 사용하지 않는 순간에도 계속 할당해놓으므로 메모리 누수가 있는 방식이다.

 

 

 

 

 

 

 

 

 

'Design Pattern' 카테고리의 다른 글

[DP] Singleton Pattern  (0) 2021.12.14