Cd—+ является популярным языком общего назначения, разработанным в 1980-х годах как улучшение широко используемого языка С. Главным новшеством языка было введение объектно-ориентированных конструкций, позволявшей моделировать предметную область программы на языке объектов. С самого начала C—+ разрабатывался с учетом высоких требований к производительности, таким образом, чтобы введение новых языковых конструкций не нарушало обратную совместимость и не накладывало дополнительных накладных расходов (принцип ’’don’t pay for what you don’t use”). C++ используется в приложениях, где критичными являются требования ко времени выполнения, потребляемой памяти, размеру исполняемых файлов. Среди таких приложений можно выделить финансовые и банковские системы (High-Frequency Trading), приложения, активно работающие с графикой (графические редакторы, системы виртуальной реальности, компьютерные игры), программы, работающие на встраиваемых платформах (Embedded System).
Одним из основных ресурсов приложения является память. Большинство современных языков программирования активно использует динамическое распределение памяти, при котором выделение памяти осуществляется во время исполнения программы. Динамическое управление памятью вводит два основных примитива — функции выделения и освобождения блоков памяти. Существуют два способа управления динамической памятью — ручное и автоматическое. При ручном управлении памятью программист должен следить за освобождением выделенной памяти, что приводит к возможности возникновения труднообнаружимых ошибок. Более того, в некоторых ситуациях (например, при программировании на функциональных языках или в многопоточной среде) время жизни объекта не всегда очевидно для разработчика. Автоматическое управление памятью избавляет программиста от необходимости вручную освобождать выделенную память, устраняя тем самым целый класс возможных ошибок и увеличивая безопасность исходного кода программы. Сборка мусора(garbage collection) давно стала стандартом в области автоматического управления памятью, хотя её использование может накладывать дополнительные расходы по памяти и времени исполнения.
На сегодняшний день среды времени выполнения многих популярных языков программирования, таких как Java, C#, Python, Ruby и другие, активно используют сборку мусора. Язык Cd—+ разрабатывался с расчетом на использование ручного управления памятью. Некоторые языковые возможности, такие как адресная арифметика и приведение типов указателей, затрудняют реализацию сборщиков мусора для этого языка. Несмотря на это, существует ряд подходов к сборке мусора для языка C—+.
В рамках проекта лаборатории JetBrains была реализована сборка мусора для языка C+—+ [1,13,15] на уровне библиотеки. Сборщик приостанавливает работу приложения на все время сборки мусора, из- за чего в работе программы могут возникать длительные паузы. Продолжительные остановки на сборку мусора неприемлемы для целого класса приложений, для которых важна низкая латентность, то есть малое время отклика на запросы пользователей. Существуют подходы, призванные уменьшить время паузы на сборку мусора, в частности инкрементальная параллельная маркировки. Идея данного подхода заключается в том, чтобы выполнять часть работы по сборке мусора параллельно с приложением, без его полной остановки.
Постановка задачи
В данной работе были поставлены следующие задачи:
• проанализировать ограничения и недостатки текущей версии библиотеки сборки мусора;
• предложить и реализовать новые методы для модернизации библиотеки;
• реализовать и встроить в библиотеку алгоритм инкрементальной параллельной маркировки;
• протестировать функциональность и производительность новой версии библиотеки.
В ходе работы были достигнуты следующие результаты:
• проанализированы ограничения и недостатки предыдущей версии библиотеки;
Таблица 9: Многопоточная сортировка слиянием: сравнение с аналогами (среднее время xи стандартное отклонение sуказано в миллисекундах)
• реализован новый алгоритм остановки мира;
• реализован новый алгоритм закрепления объектов;
• реализована модификация алгоритма инкрементальной параллельной маркировки;
• выполнена апробация: протестирована функциональность библиотеки, измерена её производительность, произведено сравнение с аналогами.
[1] Berezun Daniil, Boulytchev Dmitri. Precise Garbage Collection for C++ with a Non-cooperative Compiler. Proceedings of the 10th Central and Eastern European Software Engineering Conference in Russia. — 2014.
[2] Boehm Hans-Juergen. Space efficient conservative garbage collection // ACM SIGPLAN Notices / ACM. - Vol. 28.- 1993.- P. 197-206.
[3] Boehm Hans-J, Spertus Michael. Transparent Programmer- Directed Garbage Collection for C+ // URL: http://www.open- std.org/jtc1/sc22/wg21/docs/papers. — 2007. — no. 2310.
[4] BoehmGC - A garbage collector for C and C++. — URL: http://www.hboehm.info/gc/ (online; accessed: 17.12.2015).
[5] Boost — free peer-reviewed portable C++ source libraries. — URL: http://www.boost.org/ (online; accessed: 15.05.2016).
[6] C++/CLI Language Specification.— URL: http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-372.pdf (online; accessed: 08.04.2016).
[7] Google Test, Google’s C++ test framework. — URL: https://github.com/google/googletest (online; accessed: 15.05.2016).
[8] ISO/IEC. Working Draft, Standard for Programming Language C++. — 2014. — URL: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf (online; accessed: 17.12.2015).
[9] Jones Richard, Hosking Antony, Moss Eliot. The garbage collection handbook: the art of automatic memory management.— Chapman & Hall/CRC, 2011.
[10] Jones Richard, Lins Rafael D. Garbage collection: algorithms for automatic dynamic memory management. — Wiley, 1996.
[11] Nonious, a C++ micro-benchmarking framework.— URL: https://nonius.io/ (online; accessed: 15.05.2016).
[12] On-the-fly garbage collection: An exercise in cooperation / Edsger W Dijkstra, Leslie Lamport, Alain J Martin et al. // Communications of the ACM.— 1978.— Vol. 21, no. 11.— P. 966¬975.
[13] Березун Даниил. Реализация основных примитивов библиотеки неконсервативной сборки мусора для C—+ Труды лаборатории языковых инструментов JetBrains, выпуск 2.
[14] Робачевский Андрей Михайлович. Операционная система UNIX, 2 изд. — БХВ-Петербург, 2010.
[15] Самофалов Александр. Библиотека почти точной копирующей сборки мусора для C++. Труды лаборатории языковых инструментов JetBrains,, выпуск 3.
[16] Уильямс Энтони. Параллельное программирование на C+—+ в действии. Практика разработки многопоточных программ. -- Litres,
2014.