GNU/Linux >> Linux Esercitazione >  >> Linux

Realloc mantiene l'allineamento della memoria di posix_memalign?

No, realloc sulla memoria restituita da posix_memalign non è garantito da ISO o POSIX per mantenere lo stesso allineamento. Un realloc può espande semplicemente il blocco corrente allo stesso indirizzo ma può anche spostare il blocco a un indirizzo diverso il cui allineamento è meno rigoroso dell'originale.

Se vuoi lo stesso allineamento, probabilmente è meglio allocare un altro blocco e copiarci sopra i dati.

Sfortunatamente, non c'è posix_memalign_realloc funzione nella specifica Single UNIX.

Se non vuoi affrontare il fastidio di copiare i dati ogni tempo, potresti provare il realloc e, se l'allineamento non era quello previsto, allora e solo allora chiama posix_memalign per ottenere un indirizzo correttamente allineato e copiarvi i dati, liberando il vecchio indirizzo una volta terminato.

Ciò può comportare:

  • zero copie (se il blocco corrente può essere espanso sul posto);
  • una copia (se realloc copia ma sembra darti un blocco correttamente allineato); o
  • due copie (se realloc copie e poi devi anche copiare a causa del disallineamento).

Può comportano anche meno copie di quanto indicato a seconda dell'implementazione della gestione della memoria sottostante. Ad esempio, una "copia" può comportare semplicemente la rimappatura dei blocchi di memoria piuttosto che lo spostamento fisico dei dati.

Quindi potresti voler tenere alcune statistiche per vedere se questo schema è utile.

Tieni presente che né le pagine man di POSIX né quelle di Linux specificano se puoi o meno passa questi puntatori a realloc , solo che puoi passarli a free .

Tuttavia, in base all'attuale codice sorgente GNU libc, sembra funzionare, anche se non è una garanzia che continuerà a funzionare in futuro :-)

La mia paura era che allocasse la memoria normalmente (allineamento standard) e restituisse un indirizzo offset (cioè, non l'effettivo indirizzo allocato, ma un N bytes oltre) che free era abbastanza intelligente da tornare all'indirizzo effettivo prima di tessere la sua magia.

Un modo per farlo sarebbe memorizzare il effettivo indirizzo immediatamente prima dell'indirizzo restituito anche se questo ovviamente porterebbe a uno spreco anche per allocazioni regolari.

In tal caso, free potrebbe essere stato reso intelligente (poiché le specifiche dicono che deve essere in grado di gestire le allocazioni fatte da posix_memalign ) ma realloc potrebbe non aver ricevuto la stessa intelligenza (dal momento che i documenti tacciono su tale questione).

Tuttavia, basato su GNU glibc 2.14.1, in realtà alloca più memoria del necessario, quindi giocherella con l'arena per liberare il pre-spazio e il post-spazio, in modo che l'indirizzo restituito sia un indirizzo "reale", utilizzabile da free o realloc .

Ma, come affermato, la documentazione non lo garantisce.


Linux
  1. Linux:in che modo Oom Killer decide quale processo uccidere per primo?

  2. Quando si utilizza Vlc, perché lo screen saver continua a svegliarsi?

  3. Trova il computer su una rete LAN?

  4. La macchina virtuale con sistema operativo CentOS 5 a 32 bit non indirizza la memoria fisica superiore a 3 GB

  5. Controlla il carico di sistema su Linux

Usando il comando gratuito di Linux

La modifica dello scambio richiede un riavvio?

Come funziona la memoria di scambio in Linux?

Cosa fa il permesso di esecuzione?

Quanta RAM utilizza il kernel?

Come fa la CPU a sapere quale indirizzo fisico è mappato a quale indirizzo virtuale?