메모리 풀(Memory Pool)

2015. 3. 18. 01:23프로그래밍/서버

728x90
728x90

단편화(Fragmentation)

분할된 주기억장치에 프로그램을 할당하고 반납하는 과정을 반복하면서 사용되지 않고

남는 기억장치의 빈 공간 조작을 의미한다.


단편화의 종류

내부 단편화(Internal Fragmentation)

- 분할된 영역이 할당될 프로그램의 크기보다 커서 사용되지 않고 남아 있는 빈 공간.

외부 단편화(External Fragmentation)

- 분할된 영역이 할당될 프로그램의 크기보다 작아서 할당할 수 없어 모두 빈 공간으로 남아 있는 전체 영역.


단편화 해결 방법

통합(Coalescing) 기법

- 인접해 있는 단편화된 공간을 하나의 공간으로 통합하는 작업을 의미한다.

압축(Compaction) 기법

- 주기억장치 내에 분산되어 있는 단편화된 빈 공간을 결합하여 하나의 큰 가용 공간을 만드는 작업을 의미한다.

쓰레기 수집(GC)라고도 한다. 여러 위치에 분산된 단편화된 공간을 주기억장치의 한 쪽 끝으로 옮겨서 큰 가용 공간을 만든다.


가상메모리 구현 기법

페이징 기법 - 프로그램을 동일한 크기로 나눈 단위를 페이지라 하며 이 페이지를 블록으로 사용하는 기법. 

세그먼테이션 기법 - 프로그램을 가변적인 크기로 나눈 단위를 세그먼트라 하며, 이 세그먼트를 블록으로 사용하는 기법.


메모리 풀(Memory Pool) 방식

정의 - 다량의 고정된 메모리를 할당하여 필요한 곳에 빌려주고 돌려받는다. 

빈번한 메모리 할당과 해제를 필요로 할 때 사용한다.


장점

- 메모리 풀은 일정한 실행 시간으로 단편화 없이 메모리를 할당할 수 있다.

- 메모리 풀들을 계층구조적으로 그룹화할 수 있다.

- 고정된 크기의 블록 메모리 풀들은 각각의 할당된 메모리 블록에 대한 메타 정보 및 

할당된 블록의 사이즈 같은 설명을 보관할 필요가 없다. 작은 크기의 할당에서 상당한 공간 절약을 할 수 있다.


단점

- 메모리 풀들은 메모리 풀을 사용하는 응용프로그램에 따라 조정된다.


구현

- 큰 메모리 블록을 힙으로 부터 할당 받는다.

- 할당 받은 페이지를 각 객체 크기의 블록으로 나눈다.

- 각 객체를 위한 블록을 순차적으로 링크한다.

- 이때 현시점에서 할당할 블록을 특정 포인터가 가리키게 한다.

- 메모리 요청이 생기면 현재 헤어 포인터가 가리키는 블록을 돌려준다.

- 할당이 일어난 후 헤더 포인터는 할당 직전에 가리키던 블록이 가리키던 블록이 가리키던 다음 블록을 가리킨다.

- 사용되던 메모리가 해제돼 메모리 풀로 돌아올 경우 헤더 포인터는 그 블록을 가리키고

방금 전까지 헤더 포인터가 가리키던 블록을 돌아온 블록의 다음 포인터가 가리키게 한다.

728x90
반응형

'프로그래밍 > 서버' 카테고리의 다른 글

동기화  (0) 2015.07.23
Thread  (0) 2015.07.23
Blocking vs Non-Blocking  (0) 2015.07.12
[서버] 데드 레커닝(Dead Reckoning)  (1) 2015.05.23
Overlapped I/O 모델  (0) 2015.05.17
IOCP 정리  (0) 2015.05.14
TCP/IP 프로토콜 개요  (1) 2015.04.27