ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • boost/pool을 멀티 스레드 환경에서 제대로 활용하려면..
    프로그래밍/c++ 2016. 2. 28. 05:56
    반응형

    boost::pool_alloc과 boost::singleton_pool


    boost/pool은 멀티 스레드 환경에서 느리다는 인식이 있다.


    boost::pool_alloc은 내부적으로 boost::singleton_pool을 사용하며, 


    singleton_pool은 멀티 스레드 환경에서의 동기화를 위해 할당/해제에 스레드 락이 있기 때문에


    할당 테스트에서는 기본 메모리 할당자보다 안 좋은 퍼포먼스를 보이지만, 


    할당=>해제=>할당 식으로 테스트를 한다면 기본 할당자보다는 좋은 성능을 보인다. 


    그렇다면 일단 전역적인 풀로도 ok다. 


    풀이 필요한 환경이라면 어차피 할당=>해제=>할당=>해제 의 과정이 빈번하기 때문인데 이러한 환경에서는 전혀 문제될 것이 없음을 의미한다.


    그럼 일단 singleton_pool은 여기서 넘기고, boost::pool로 가보자.



    boost::pool


    boost::pool은 단일 스레드 환경에서 굉장히 좋은 성능을 보이며, 가변 길이 할당을 지원한다. 

    (이는 내부적으로 버디 시스템을 사용하기 때문이다.)


    멀티스레드 환경에서 단일 스레드 환경에서의 boost::pool의 성능을 이용하고 싶다면, 레드마다 독립적인 pool을 생성하면 된다. 


    thread_local이니 할당/해제에 스레드 락이 필요 없어지므로 단일 스레드에서 처럼 굉장히 좋은 성능을 보여줄 것이다.


    물론 할당은 스레드 로컬하게 한다고 하더라도, 해제는 외부 스레드에서 일어날 가능성이 크니, 그 부분에 대한 고려는 필요할 듯.




    메모리 풀을 직접 짜보고, boost::pool과 비교를 해보면서 개인적인 라이브러리 코어에 어떤 할당자를 적용할까 고민했는데, 


    boost::pool의 성능이 생각보다 뛰어나 boost::pool로 마음을 굳혔습니다. 


    인터넷의 많은 글들은 boost::pool은 멀티 스레드에 취약하다라곤 하지만, 


    많은 글들이 제대로 된 내부 파악이 안 된 상태에서 그런 글들을 작성하셨다고 생각해요. 


    c++11에서 부턴가요? thread_local 키워드가 지원 되니, boost::pool을 thread local하게 만들면 성능적인 이점을 쉽게 가져갈 수 있을 거란 생각이 드네요.


    물론 할당은 스레드 로컬하게, 해제는 외부 스레드에서 일어날 수도 있으니 그 부분에 대한 고려는 필요할 거 같습니다. 


    tcmalloc이 위에 말한 구조와 비슷하다고 하는데, 어지간하면 tcmalloc을 쓰는 편이 좋을 거라고 생각합니다.(프로젝트 포함도 매우 쉬움!)


    하지만 저와 같은 생각이나 고민을 한 사람이 있을까 싶어 글을 남겼어요.

    반응형
Designed by Tistory.