Un allocateur de dalle est un algorithme d'allocation de mémoire utilisé dans les noyaux des systèmes d'exploitation (et parfois dans d'autres systèmes nécessitant une gestion de mémoire haute performance) pour gérer efficacement la mémoire des objets du noyau. Contrairement aux allocateurs plus simples comme le système de binôme ou une simple liste gratuite, il vise à minimiser la fragmentation interne et externe et à améliorer les performances en mettant en cache les structures de données fréquemment utilisées.
Voici comment cela fonctionne :
1. Cache : L'allocateur de dalle divise la mémoire en caches. Chaque cache est dédié à un type spécifique d'objet du noyau (par exemple, inodes, sockets, tampons réseau). C’est la clé de son efficacité.
2. Dalles : Dans chaque cache, la mémoire est divisée en tranches. Une dalle est un bloc de mémoire contigu suffisamment grand pour contenir plusieurs instances du type d'objet associé à ce cache. La taille d'une dalle est choisie en fonction de la taille de l'objet plus le rembourrage nécessaire (pour l'alignement).
3. Création d'objet : Lorsqu'un nouvel objet d'un type particulier est nécessaire, l'allocateur vérifie d'abord le cache associé à ce type d'objet.
4. Listes gratuites : Dans chaque dalle, il existe une liste gratuite contenant des pointeurs vers les objets disponibles. Lorsqu'un objet est demandé, l'allocateur vérifie d'abord cette liste libre. Si un objet libre est trouvé, il est simplement retiré de la liste, minimisant ainsi la surcharge d'allocation.
5. Attribution des dalles : Si la liste libre d'une dalle est vide, l'allocateur peut prendre une toute nouvelle dalle du pool de mémoire général du système.
6. Gestion des dalles : Les dalles peuvent être dans l'un des états suivants :
* Complet : Tous les objets de la dalle sont utilisés.
* Partiel : Certains objets sont utilisés et d’autres sont gratuits.
* Vide : Tous les objets sont gratuits.
7. Réutilisation et désallocation des dalles : Lorsqu'un objet n'est plus nécessaire, il est renvoyé dans la liste libre de sa dalle, le rendant immédiatement disponible pour être réutilisé. Les dalles vides sont souvent renvoyées dans le pool de mémoire du système pour conserver la mémoire.
8. Minimiser la fragmentation : En dédiant des dalles à des types d'objets spécifiques et en les réutilisant, l'allocateur de dalles réduit considérablement la fragmentation interne (espace perdu dans les blocs alloués) et la fragmentation externe (espace perdu entre les blocs alloués). Étant donné que la taille des objets est connue à l’avance, il n’est pas nécessaire de les rechercher ni de les diviser.
Avantages de l'allocateur de dalles :
* Vitesse : Allocation et désallocation très rapides grâce à l'utilisation gratuite de la liste et au temps de recherche minimal.
* Fragmentation réduite : Utilise efficacement la mémoire en évitant la fragmentation.
* Efficacité du cache : Réduit les échecs de cache en gardant les objets associés ensemble dans des dalles.
* Évolutivité : Gère efficacement un grand nombre d’allocations et de désallocations d’objets.
Inconvénients de l'allocateur de dalles :
* Surcharge de mémoire : Chaque cache et chaque dalle ont une certaine surcharge en termes de structures de gestion (listes libres, métadonnées).
* Complexité : Plus complexe à mettre en œuvre que des répartiteurs plus simples.
* Coût d'installation initial : La création et l'initialisation des caches et des dalles prennent du temps au départ.
En résumé, l'allocateur slab est une technique sophistiquée de gestion de la mémoire particulièrement adaptée aux besoins des noyaux du système d'exploitation où les performances et l'utilisation efficace de la mémoire sont essentielles, en particulier pour les petits objets fréquemment alloués et désalloués. Il établit un bon équilibre entre vitesse et efficacité de la mémoire en évitant les problèmes de fragmentation des méthodes plus simples.
|