Efficient Memory Management with Hardware Transactional Memory: A Focus on Java Garbage Collectors and C++ Smart Pointers - Carpen-Amarie, Maria (Neuchâtel : Université de Neuchâtel, Faculté des sciences, 2017)
De nos jours les systèmes multi-cœurs sont omniprésents. La conception des applications demande de plus en plus un moyen de synchronisation plus léger, ainsi qu'une gestion automatique de la mémoire plus efficace. Les techniques de gestion de la mémoire tâchent de profiter au maximum du parallélisme qui augmente chaque jour. Néanmoins, la complexité de la synchronisation peut entraîner des problèmes de performance majeurs. Dans cette thèse, nous tirons parti du support matériel pour la mémoire transactionnelle afin d'améliorer la performance de la gestion automatique de la mémoire. Ce travail porte sur des environnements supervisés (Java), ainsi que non-supervisés (C++). Nous étudions la mesure dans laquelle ce nouveau moyen de synchronisation peut rendre des systèmes réputés de gestion de la mémoire plus efficaces. De plus, nous identifions les scénarios où l'on peut utiliser la mémoire transactionnelle matérielle pour maximiser ses bénéfices. En général, les environnements supervisés ont un mécanisme intégré de récupération et recyclage de la mémoire, appelé le ramasse-miettes. Le but d'un ramasse-miettes est de gérer automatiquement la mémoire sans affecter la performance de l'application. La machine virtuelle Java HotSpot comporte plusieurs types de ramasse-miettes, qui ont tous besoin d'arrêter (ou bloquer) l'application pendant le ramassage. Nous proposons un nouvel algorithme pour un ramasse-miettes entièrement concurrent, employant de la mémoire transactionnelle matérielle pour la synchronisation avec l'application. Nous développons et optimisons une partie fondamentale de notre algorithme, des barrières en écriture et en lecture transactionnelles. Notre évaluation indique qu'après la mise en œuvre complète de notre algorithme, le ramasse-miettes transactionnel aura une performance comparable aux ramasse-miettes existants, mais sans bloquer l'application. Les langages non-supervisés utilisent parfois des moyens spécialisés de gestion automatique de la mémoire. Dans ce contexte, nous étudions les pointeurs intelligents de C++. La gestion de la mémoire repose sur un algorithme à comptage des références. La performance des applications est parfois dégradée en raison de la synchronisation requise par cet algorithme. Nous proposons une variante des pointeurs intelligents synchronisés avec de la mémoire transactionnelle matérielle. L'idée est de remplacer les opérations atomiques au niveau du compteur des références par des transactions. En cas de conflit, le pointeur transactionnel se transforme en pointeur intelligent classique. Les pointeurs transactionnels se révèlent particulièrement avantageux dans le contexte des structures des données. Nous analysons les désavantages de la gestion automatique de la mémoire dans plusieurs contextes. Nous montrons que la mémoire transactionnelle matérielle représente une très bonne solution pour les problèmes spécifiques de synchronisation rencontrés par les systèmes de gestion de la mémoire, dans des environnements aussi bien supervisés que non-supervisés., With multi-core systems becoming ubiquitous in the last few years, lightweight synchronization and efficient automatic memory management are more and more demanded in the design of applications and libraries. Memory management techniques try to take advantage of the growing parallelism as much as possible, but the increasingly complex synchronization introduces considerable performance issues. The goal of this thesis is to leverage hardware transactional memory (HTM) for improving automatic memory management. We address both managed environments (Java) and unmanaged languages (C++). We investigated to what extent a novel synchronization mechanism such as HTM is able to make well-known memory management systems more efficient. We further provided insight into what scenarios benefit most from HTM-based synchronization. Managed runtime environments generally have a memory reclamation and recycling mechanism integrated, called garbage collector (GC). Its goal is to manage memory automatically and transparently, without impacting the application execution. The Java HotSpot virtual machine features several types of GCs, all of which need to block all application threads, i.e., stop the world, during collection. We proposed a novel algorithm for a fully-concurrent GC based on HTM. We implemented and optimized transactional access barriers, the core part of the algorithm. Our evaluation suggests that a full implementation of the transactional GC would have comparable performance with Java's low-pause concurrent GC, while also eliminating stop-the-world pauses. Unmanaged languages use specialized forms of automatic memory management. In this context, we focus on smart pointers in C++. Their logic is based on reference-counting. However, the extra synchronization required by smart pointers has a negative impact on the performance of applications. We proposed an HTM-based implementation of smart pointers. We aim to improve their performance by replacing atomic operations on the reference counter with transactions. In case of conflict, the pointer falls back to being a classical smart pointer. We identified favorable scenarios for using transactional pointers and we subsequently specialized them for concurrent data structure traversal. After studying the downsides of automatic memory management in multiple contexts, we found that HTM is a good candidate for addressing their specific synchronization issues. We showed that HTM can successfully support both a feasible pauseless Java GC implementation, as well as more efficient smart pointers in C++.
Keywords: mémoire transactionnelle; ramasse-miettes; machine virtuelle Java; comptage de références; structures des données