Quand devons-nous utiliser posix_memalign au lieu de malloc?

Semble posix_memalign vous laisse choisir un alignment personnalisé, mais quand est-ce nécessaire?

malloc a déjà effectué le travail d’alignement en interne.

METTRE À JOUR

La raison exacte pour laquelle je pose cette question est que je vois que nginx le fait, ngx_memalign(NGX_POOL_ALIGNMENT, size, log); , ici, NGX_POOL_ALIGNMENT est défini comme 16 , nginxs.googlecode.com/svn-history/trunk/src/core/ngx_palloc.c

Fondamentalement, si vous avez besoin d’un alignement plus difficile que celui que malloc vous donnera. Malloc renvoie généralement un pointeur aligné de telle sorte qu’il puisse être utilisé avec l’un des types primitifs (souvent 8 octets sur des ordinateurs de bureau courants).

Cependant, vous avez parfois besoin d’une mémoire alignée sur d’autres limites, par exemple alignée sur 4K, etc. Dans ce cas, vous avez besoin de memalign .

Vous auriez besoin de cela, par exemple,

  • lors de l’écriture d’un gestionnaire de mémoire (tel qu’un ramasse-miettes). Dans ce cas, il est parfois pratique de travailler avec de la mémoire alignée sur des blocs de grande taille. De cette façon, vous pouvez stocker des métadonnées communes à tous les objects d’un bloc donné au bas de la zone atsortingbuée et y accéder simplement en masquant les bits les moins significatifs du pointeur d’object.
  • lors de l’interfaçage avec du matériel (jamais fait cela moi-même, mais IIRC, certains types de périphériques en mode bloc nécessitent une mémoire alignée). Voir la réponse de nm pour plus de détails.

Les seuls avantages de posix_memalign , pour autant que je posix_memalign , sont les suivants:

  1. Allocation de mémoire alignée sur des pages (généralement 4096 ou plus) pour des besoins spécifiques au matériel.
  2. Mauvais piratages où vous gardez les N bits bas d’un pointeur zéro afin que vous puissiez stocker un entier à N bits dans les bits bas. 🙂

Divers matériels peuvent avoir des exigences d’alignement que malloc ne peut pas satisfaire. La page de manuel Linux en donne un exemple, je cite:

Sur de nombreux systèmes, il existe des ressortingctions d’alignement, par exemple sur les tampons utilisés pour les E / S de périphériques à blocage direct. POSIX spécifie l’appel pathconf (path, _PC_REC_XFER_ALIGN) qui indique quel alignement est nécessaire.

Quelques utilisations:

  • Certains processeurs ont des instructions qui ne fonctionneront que sur des données alignées sur une puissance égale ou supérieure à deux fois la taille de la mémoire tampon – par exemple, les instructions d’adressage inversé utilisées dans les fft (transformations rapides de Fourier).

  • Pour aligner les données sur les limites du cache afin d’optimiser l’access aux applications multitraitement afin que les données d’une même ligne de cache ne soient pas accédées simultanément par deux processeurs.

En gros, si vous n’avez pas besoin d’optimiser des niveaux absurdes et / ou si votre matériel n’exige pas qu’un tableau se trouve sur une limite particulière, vous pouvez oublier posix_memalign.