Одним махом 100 миллионов убивахом. Или lock-free распределитель памяти

Постановка задачи Один из алгоритмов, который я реализовывал, имел интересные особенности при работе с памятью: Могло выделяться огромное количество, до десятков и сотен миллионов небольших объектов одного типа. Объекты представляли собой POD- типы.PODA Plain Old Data Structure in C++ is an aggregate class that contains only PODS as members, has no user-defined destructor, no user-defined copy assignment operator, and no nonstatic members of pointer-to-member type. Заранее было неизвестно какое количество объектов понадобится, могло так случится, что потребуется сотня, а может и сто миллионов. Объекты никогда не удаляются по одному, в какой-то момент они становятся не нужны все сразу. Алгоритм хорошо распараллеливается, по этому выделением объектов занимается одновременно несколько потоков, по количеству ядер процессора (ов). Использование в таких условиях стандартного new — delete приводит к очень большим потерям времени на удаление объектов. Если без отладчика удаление происходило хотя бы за несколько секунд, то в присутствии отладчика освобождение памяти замедляется примерно в 100(!) раз, и отладка проекта становится просто невозможной. Кроме того из-за большого количества выделенных объектов достаточно ощутимым становился перерасход памяти на внутренние данные расперделителя памяти. Для решения задачи выделения огромного количества объектов одного типа, и их пакетного удаления, был сделан lock-free контейнер MassAllocator. Код компилируется Visual Studio 2012. Полный код проекта выложен на github.Читать дальше →

© Habrahabr.ru