1. 프로젝트 명 : 3D Navigation System 개발  ( 2009년 3월)

2. 개발 환경 
   1) 개발Tool : Embeded Visual C++ 4.0 
   2) Target Device : WinCE 5.0 

3. 문제점  
   1) 현상 : Application이 실행 도중 일정치 않은 위치에서 다운되는 현상이 지속적으로 발생됨. 
   2) 원인 : WinCE 5.0에서는 구조적으로 한 Process당 사용할 수 있는 메모리의 양이 32MB로 제한되어 있음.
   3) Test 프로그램 화면
      ㄱ) Total Virtual mem Size가 32Mb 임을 확인할 수 있음. 
      ㄴ) Test App.에서는 현재 26Mb까지 할당했고, 1Mb 추가로 재할당할 때 메모리 오류 발생하였음.


4. 해결방법
  1) Memory Map 적용 : 32Mb 한계 이상을 사용하기 위해서는 임시 메모리맵 방식을 사용하여 마치 추가,
    메모리 영역처럼 사용할 수 있음.
 2) Memory Pool 적용 : . 잦은 메모리의 할당 및 해제는 속도저하는 물론 메모리 단편화를 야기할 수
    있으므로
큰 용량을 한번에 생성한 후, 이를 사용시 필요한 만큼의 크기를 변환해서 사용하는 방식
 3) 참고 Site : http://msdn.microsoft.com/en-us/library/aa454885.aspx#Mtps_DropDownFilterText 


5. 구현

Class

주요기능

CMemoryPool

광역으로 선언되어 전체 App. 상에서 메모리 할당 및 생성 인터페이스를 제공하고, 전체 메모리 현황을 관리

CMemoryBlock

확보된 Memory Pool을 일정 Size로 나누어 효율적인 메모리 관리를 하고자 함( Block을 나누지 않을 경우, 메모리할당이 많아 질수록, 특정 주소를 찾거나, 메모리 해제시의 영역 Merge등에서 나쁜 성능을 나타낼 수 있음)

CMemAllocInfo

실제 메모리 할당하는 내용 ( 할당 메모리 위치(포인터), 할당메모리 크기, 할당메모리 영역 상태 등)

4-byte align을 위한 Reserved 버퍼를 둠


6. 성능 Test
  1) Test 방법

. 일정 Size의 메모리를 반복적으로 할당하고 해제하여 그 소요시간을 확인.

. 할당 메모리 Size는 Critical point로 지적된 4k, 128k 를 기준으로 실시함.

. 반복횟수 : 1000

. 메모리 해제시 순차적 해제가 아닌 최악의 조건인 중간 중간에 빈 블록이 발생하여

이를 고려하여 해제하는 방식으로 테스트
  2) Test
결과 (단위 : Second)

No

MemSize

반복횟수

기존 방법

MemoryPool 방식

1

128k

50

120(2.4)

0 (0)

2

4K

1000

39 (0.039)

39 (0.039

3

1k

5000

95 (0.019)

616 (0.1232)

ㄱ.   128k 이상의 할당에서는 MemoryPool 방식이 기존 방식보다 월등히 우수한 성능을 보임.

ㄴ.   4k 에서는 동일한 성능을 보임

ㄷ.   1k 미만에서는 기존 방식이 훨씬 우수한 성능을 보임

ㄹ.   MemoryPool 방식은 할당 메모리 횟수가 클 수록, 수행 속도가 급수적으로 증가함.

( )안의 값은 1회당 소요시간을 의미함

  3) Test 결과

MemoryPool 방식이 작은 용량의 할당에서는 성능저하를 보이나, 전체 App. 단위에서

볼 때, 그리고 다른 Process 처리 시간 단위를 비교해 보았을 때 그 영향이 크지 않으며

더욱이 큰용량의 메모리 할당에서는 기존 방식보다 훨씬 우월한 성능을 보이고 있으며,

WinCE상 한 Process 32Mb의 메모리 문제를 해결하기 위한 좋은 대안으로 판단

7. 적용 방법
   1)  메모리 할당 Size를 크게하고, 횟수를 최소화 하는 방향으로 적용

-----------------------------------------------------------------------------------------------------------------

[참고자료] WinCE 5.0 환경에서 메모리 할당시 메모리 변화 현황

 

alloc size

Avail. Phy.

Avail. Virtual.

Diff. Phy.(K)

Diff. Virtual.(K)

Pointer Pos.

diff.(K)

Initial

164073472

29949952

-

-

0x00000000

-

512K

163545088

29360128

516

576

0x00060020

384.0

256K

163278848

29032448

260

320

0x000f0020

576.0

128K

163139584

28835840

136

192

0x00140020

320.0

64K

163074048

28835840

64

0

0x00032600

(1078.5)

32K

163041280

28835840

32

0

0x00042610

64.0

16K

163024896

28835840

16

0

0x0004a620

32.0

8K

163016704

28835840

8

0

0x0004e630

16.0

4K

163012608

28835840

4

0

0x00050640

8.0

2K

163012608

28835840

0

0

0x00051650

4.0

1K

163008512

28835840

4

0

0x00051e60

2.0

1)     128k 이하시 Virtual Mem.의 변화량이 없음. ( Virtual Mem -> 128 k align )

2)     4K 이하시 Phy. Mem. 의 변화량이 없음. ( Phy. Mem. -> 4k align)

 

Posted by 꿈을펼쳐라
,