Skip to main content

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. Consultez XALLOC_ATTRIBUTES Valeur renvoyée Type : PVOID Renvoie 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 hooks d’allocation. Si les titres choisissent de ne pas fournir leurs propres hooks d’allocation, ces allocateurs système par défaut sont utilisés à la place. Si les titres souhaitent fournir des hooks d’allocation à des fins de suivi, sans pour autant 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 souhaitent pas intercepter ce comportement, ou qui souhaitent revenir au comportement par défaut pour les cas qu’ils ne gèrent pas. La plateforme XBOX fait passer toutes les allocations de mémoire de titre qu’elle effectue par XMemAlloc, ce qui permet aux développeurs 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 tout ou partie des requêtes qui passent par XMemAlloc. Pour le reste, l’API XMemAllocDefault est utilisée. XMemAllocDefault traite les requêtes d’allocation au moyen de l’un des trois mécanismes suivants : HeapAlloc, VirtualAlloc ou une série de tas gérés en interne. Le choix entre ces trois mécanismes 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 est dirigée vers HeapAlloc à condition 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 sont dirigées vers XMemVirtualAlloc. Les allocations qui spécifient XALLOC_PAGESIZE_2MB_* sont dirigées vers XMemVirtualAlloc. Les allocations de type XALLOC_MEMTYPE_GRAPHICS_* sont promues à une taille de page minimale de 64 Ko. Sinon, l’allocation est 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 « petits blocs ») et l’autre gère toutes les autres allocations (le tas « grands blocs »). Cela représente 30 tas au total. 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, un tas donné ne peut pas contenir plus de 2 Go d’allocations.
  • Si un tas est configuré pour utiliser des pages de 2 Mo, chaque tas valide des pages de 2 Mo selon les besoins ; chaque allocation est donc 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 valide 512 Ko de pages selon les besoins.
  • Chaque tas est monothread ; les requêtes d’allocation et/ou de libération simultanées provenant de plusieurs threads sont donc sérialisées. La sérialisation n’est requise qu’au sein de chaque tas individuel ; les requêtes simultanées provenant de tas différents peuvent donc ê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 la quantité de mémoire nécessaire au fonctionnement du tas.
  • Chaque tas peut spécifier sa propre hystérésis d’allocation, qui détermine avec quelle rapidité la mémoire est 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 jamais utilisés, car 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 sur 64 Mo, cela signifie que le tas doit accumuler 64 Mo de pages libres avant que des pages libres ne soient rendues au système d’exploitation. Cela garantit que le code du tas n’aura jamais besoin de solliciter à nouveau le système d’exploitation tant que la quantité de mémoire requise fluctue dans les limites de l’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. Toutefois, un tas peut préallouer de la mémoire auprès du système d’exploitation si vous le souhaitez, en appelant XMemPreallocateFreeSpace pour ce tas. Cela porte en pratique 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
Last modified on October 6, 2026