Google nuova versione del sistema di distribuzione della memoria , utilizzato in molti progetti interni di Google. Il codice TCMalloc è scritto in C++ e è distribuito sotto licenza Apache. Richiede un compilatore che supporti C++17 per il linguaggio C++ e C11 per il linguaggio C (gcc 9.2+ o clang 9.0+). Le sole piattaforme supportate sono Linux (x86, PPC).
È interessante notare che dal 2005 esiste un'altra versione di tcmalloc che fa parte del pacchetto (Google Performance Tools). Questi sono due progetti con radici comuni. Il nuovo TCMalloc è più un tentativo di rilasciare il codice delle attuali implementazioni interne di Google, ma non è ancora mirato a fornire un ABI stabile e a supportare un'ampia gamma di sistemi operativi. Il supporto per il vecchio tcmalloc di gperftools continuerà, ma non sono previsti trasferimenti di nuove funzionalità, come la cache legata alla CPU.
TCMalloc include un'implementazione della function malloc() in C e dell'operatore "new" in C++, ottimizzati per prestazioni elevate e applicazioni multithreading. TCMalloc offre anche funzionalità di introspezione e profiling, consentendo all'applicazione di ottenere informazioni dettagliate sull'utilizzo della memoria nell'heap. Nel codice sono applicate ottimizzazioni basate sulle moderne funzionalità del linguaggio C++, come
l'operatore delete con da C++14 e l'allocazione della memoria con da C++17.
TCMalloc è composto da tre componenti: un front-end con cache per l'allocazione e la liberazione rapida della memoria, uno strato per il riempimento della cache del front-end e un backend che esegue operazioni come l'ottenimento di memoria dal sistema operativo, la gestione di grandi blocchi di memoria non utilizzata e la restituzione di memoria in eccesso al SO. La cache è priva di blocchi e funziona legata ai core della CPU, ma ricade sul modello di caching legato ai thread in assenza della necessaria funzionalità nel kernel OS (la cache legata alla CPU funziona solo nei recenti kernel di Linux). Il backend supporta sia le normali pagine di memoria sia le pagine di grandi dimensioni (hugepage).
Caratteristiche principali di TCMalloc:
- Allocazione e liberazione rapida della memoria utilizzando la cache. La maggior parte delle operazioni di allocazione della memoria non richiede blocchi, garantendo una buona scalabilità per applicazioni multi-thread ad alta parallelicità;
- Utilizzo flessibile della memoria, che consente di riutilizzare aree di memoria liberate per oggetti di diverse dimensioni o restituire la memoria al sistema operativo;
- Bassi costi overhead per ciascun oggetto grazie all'allocazione di pagine di oggetti di dimensioni identiche e a una rappresentazione efficiente degli oggetti di piccole dimensioni. Sono supportate pagine logiche di dimensioni 4KiB, 8KiB, 32KiB e 256KiB. Ad esempio, se si richiedono blocchi di 512 byte di memoria, verrà allocata un'intera pagina di 4KiB per oggetti da 512 byte, che può contenere 8 di tali oggetti;
- È possibile una regolazione fine attraverso la definizione della dimensione della cache e dei parametri di intensità per il ritorno della memoria al SO;
- Fornitura di informazioni dettagliate per analizzare l'uso della memoria da parte dell'applicazione.
Fonte: opennet.ru
