본문 바로가기

2015/0417

Pooling 메모리 풀메모리 풀을 쓰는 이유메모리 Pool은 메모리 할당/해제/최적화 작업등을 유저가 직접 다룰 수 있도록 만든 객체이다. OS에게 메모리 할당/해제을 요청하면 시스템 콜이 발생한다. 빈번한 메모리 요청이 발생할 때, 하나하나 OS에게 작업을 맞긴다면 지나치게 많은 비용이 발생할수도 있다. 그리고 LFH파트에서 본것처럼 시스템이 유저에게 메모리를 할당할때, 데이터 뿐만 아니라 기타 관리 정보까지 포함해서 메모리를 할당하기 때문에, 작은 메모리를 자주 요청하는 경우 필요 이상의 메모리를 사용하게 된다. 그리고 LFH같은 훌륭한 관리체계가 없는 OS의 경우 빈번한 할당/해제는 파편화 문제를 발생시킬 것이다.메모리 풀은 이런 문제들을 해결할 수 있는 좋은 방법이다. 미리 유저가 큰 메모리를 할당 받은뒤에 .. 2015. 4. 17.
Windows Low Fragmentation Heap Windows LFHLFH : Low Fragmentation Heap, 단편화가 적은 힙windows 2k SP4, windows XP, windows 2k3 부터 적용Heap Fragmentation (힙 단편화) 사용자가 힙의 메모리를 할당받아서 사용하면, 메모리 관리자는 가능한 영역에서 연속된 공간을 사용자한테 할당해줄 것이다. 단일 객체는 연속된 메모리 공간을 사용하기 때문이다. 사용자가 메모리를 사용하는 패턴을 생각해보면, 메모리의 할당 순서는 연속적이어서 착착 힙을 순서대로 사용하는 것 같지만, 할당한 해제 순서는 뒤죽 박죽이다. 그렇기 때문의 위 그림처럼 쓸수 있는 공간이 파편화되는 현상이 발생한다. 이것을 Heap Fragmentation이라고 한다. 문제는 이렇게 파편화된 메모리 상황에.. 2015. 4. 17.
Modern Effective C++ item 20 : 댕글링 포인터엔 weak_ptr 댕글링 체크엔 std::weak_ptrweak_ptr은 shared_ptr과는 달리 참조 횟수에 영향을 받지 않는 스마트 포인터이다. shared_ptr에서 고민했던 내용들을 생각해보자. 어떤 포인터가 주소를 가져오는데, 참조 횟수에 영향을 미치지 않는다면, 공유 자원의 일관성을 유지하기 위해서 실제 포인터가 할 수 있는 기능들을 대부분 포기해야할 것이다. 실제로 이 포인터는 역참조가 안되고, nullptr체크도 안된다. 게다가 참조 카운터를 고려안하므로 댕글링상태에 빠지기도 쉬울 것이다.(후후..) 스스로는 뭔가 제대로된 역할을 하기 힘든 포인터이다. 이런걸 smart하다고 말하기 어려울 수 있지만, shared_ptr과 함께 쓰일때 그 진정한 스마트함을을 갖출 수 있다. 결론부터 말하자면 이 포인터는.. 2015. 4. 14.
Modern Effective C++ item 19 : 공유자원은 std::shared_ptr 공유하는 자원을 사용할 때 std::shared_ptrstd::unique_ptr은 사용권을 양도하는 식으로 자원을 관리했다. 하지만 실제로 우리가 할당된 자원(포인터)을 사용할 때 unique한 방식보다는 여러 곳에서 그 자원을 공유하는 방식으로 사용하게 된다. 하지만 처음 할당한 자원을 여기저기에서 참조하고 있으면 dangling 포인터와 같은 자원관리 문제가 발생하기 쉽다. Java에는 Garbage Collection이라는 자동 자원관리 방식을 지원해서 공유된 자원에 유저가 신경쓸 필요없이 편하게 프로그래밍이 가능하다. 대신 유저가 자원이 해제되는 시점에 대해서 알기 어렵다는 단점이 있다. C++ 11부터는 shared_ptr을 사용하여 두가지 목표(자동 자원관리, 예측 가능한 해제시점)를 모두 .. 2015. 4. 14.