Passer au contenu principal

XMemAllocDefault

La routine d’allocation de mémoire par défaut.

Syntaxe

Paramètres

Size Type : SIZE_T [in] Taille du bloc de mémoire demandé. Attributes
Type : ULONGLONG
[in] Attributs de l’allocation. Reportez-vous à XALLOC_ATTRIBUTES Valeur de retour Type : PVOID Retourne un pointeur vers le bloc de mémoire alloué. Remarques Deux fonctions par défaut sont exportées par le système : XMemAllocDefault et XMemFreeDefault. Elles représentent les valeurs initiales des crochets d’allocation. Si les titres choisissent de ne pas fournir leurs propres crochets d’allocation, ces allocateurs système par défaut seront utilisés à la place. Si les titres souhaitent fournir des crochets d’allocation à des fins de suivi, mais ne veulent pas implémenter leur propre allocateur, ils peuvent appeler directement l’allocateur par défaut. XMemAllocDefault prend les mêmes paramètres que XMemAlloc. Elle fournit l’implémentation du système d’exploitation de XMemAlloc pour les titres qui ne veulent pas intercepter ce comportement, ou qui veulent revenir au comportement par défaut pour les cas qu’ils ne gèrent pas. La plateforme XBOX achemine toutes les allocations de mémoire de titre qu’elle effectue par XMemAlloc, ce qui donne aux développeurs la possibilité de surveiller ou de gérer les besoins en mémoire de la plateforme. Les titres peuvent fournir leurs propres gestionnaires de mémoire pour une partie ou la totalité des demandes qui passent par XMemAlloc. Pour le reste, l’API XMemAllocDefault est utilisée. XMemAllocDefault traite les demandes d’allocation au moyen de l’un de trois mécanismes : HeapAlloc, VirtualAlloc ou une série de tas gérés en interne. Le choix du mécanisme parmi ces trois dépend du type et des exigences d’alignement de l’allocation. Diagramme montrant que XMemAllocDefault sert d'interface vers HeapAlloc, VirtualAlloc et les tas Xmem Chaque allocation de type XALLOC_MEMTYPE_HEAP_CACHEABLE sera dirigée vers HeapAlloc tant qu’elle spécifie un alignement <= 16 octets et une taille de page de 4 Ko. Les allocations de type XALLOC_MEMTYPE_PHYSICAL_*, ou qui nécessitent une adresse 32 bits, ou qui sont > 128 Ko, ou qui nécessitent un alignement >= 64 Ko seront dirigées vers XMemVirtualAlloc. Les allocations qui spécifient XALLOC_PAGESIZE_2MB_* seront dirigées vers XMemVirtualAlloc. Les allocations de type XALLOC_MEMTYPE_GRAPHICS_* seront promues à une taille de page minimale de 64 Ko. Sinon, l’allocation sera gérée par le tas interne de XMemAllocDefault. Il existe deux tas pour chacun des 15 types d’allocation documentés : l’un gère les allocations < 4 Ko avec un alignement <= 4 Ko (le tas de « petits blocs ») et l’autre gère toutes les autres allocations (le tas de « grands blocs »). Cela donne un total de 30 tas. Détails des tas de XMemAllocDefault
  • Un tas est créé à la demande; ainsi, s’il n’y a aucune allocation d’un type particulier pour une taille grande/petite donnée, le tas ne sera jamais créé.
  • Chaque tas réserve 2 Go d’espace d’adressage virtuel. Par conséquent, il ne peut y avoir plus de 2 Go d’allocations pour un tas donné.
  • Si un tas est configuré pour utiliser des pages de 2 Mo, chaque tas validera des pages de 2 Mo au besoin; ainsi, chaque allocation sera satisfaite à partir d’une page de 2 Mo, même si des pages de 64 Ko sont demandées. Par défaut, les tas qui utilisent des pages de 2 Mo sont autorisés à rétrograder vers des pages de 64 Ko si le système a épuisé les pages de 2 Mo. Ce comportement de rétrogradation peut être désactivé en utilisant eXMEMOPT_XMEMALLOCDEFAULT_DISABLEPAGESIZEDEMOTION avec XMemSetOption.
  • Si un tas est configuré pour utiliser des pages de 64 Ko, chaque tas validera 512 Ko de pages au besoin.
  • Chaque tas est monothread; ainsi, les demandes simultanées d’allocation ou de libération provenant de plusieurs threads seront sérialisées. La sérialisation n’est requise qu’à l’intérieur de chaque tas individuel; ainsi, des demandes simultanées provenant de tas différents peuvent être traitées simultanément.
  • Chaque tas tente de regrouper les allocations aussi densément que possible (tout en respectant les contraintes d’alignement) afin de réduire au minimum la quantité de mémoire requise pour prendre en charge le tas.
  • Chaque tas peut spécifier sa propre hystérésis d’allocation, qui détermine avec quelle agressivité la mémoire sera rendue au système d’exploitation lorsqu’elle a été libérée. Par défaut, chaque tas graphique spécifie une hystérésis de 64 Mo, et les tas XALLOC_MEMTYPE_HEAP_CACHEABLE spécifient 8 Mo (il est peu probable que ceux-ci soient utilisés, puisque les allocations de tas pouvant être mises en cache ne spécifient généralement pas d’exigence d’alignement > 16 octets). Si l’hystérésis est définie à 64 Mo, cela signifie que le tas devra accumuler 64 Mo de pages libres avant que des pages libres soient rendues au système d’exploitation. Cela garantit que le code du tas n’aura jamais besoin de revenir au système d’exploitation tant que la quantité de mémoire requise fluctue à l’intérieur de la valeur d’hystérésis.
  • Les tas démarrent sans mémoire validée et demandent de la mémoire au système d’exploitation à la demande. Cependant, un tas peut préallouer de la mémoire auprès du système d’exploitation, si désiré, en appelant XMemPreallocateFreeSpace pour ce tas. Cela porte effectivement la réserve de pages libres jusqu’à la limite d’hystérésis de ce tas.
Voir aussi xmem_set_allocation_hooks xmem_allocation_hooks
Dernière modification le 6 octobre 2026