Attualmente sto esaminando l'implementazione di malloc()
in Windows. Ma nella mia ricerca ho inciampato su cose che mi ha sconcertato:Domande di assegnazione di memoria di Windows
First, so che a livello di API, Windows utilizza per lo più le HeapAlloc()
e VirtualAlloc()
chiamate per allocare la memoria. Raccolgo da here che l'implementazione Microsoft di malloc()
(quella inclusa nel CRT - il runtime C) chiama fondamentalmente HeapAlloc()
per i blocchi> 480 byte e gestisce in altro modo un'area speciale allocata con VirtualAlloc()
per piccole allocazioni, al fine di evitare la frammentazione.
Beh, va tutto bene. Ma poi ci sono altre implementazioni di malloc()
, ad esempio nedmalloc, che dichiarano di essere fino al 125% più veloce di Microsoft malloc
.
Tutto questo mi fa chiedo alcune cose:
Perché non possiamo semplicemente chiamare
HeapAlloc()
per piccoli blocchi? Esiste uno scarso rendimento in termini di frammentazione (ad esempio eseguendo "first-fit" anziché "best-fit")?- In realtà, non v'è alcun modo per sapere cosa sta succedendo sotto il cofano delle varie chiamate di allocazione API? Sarebbe molto utile.
Ciò che rende
nedmalloc
così molto più veloce di Microsoft dimalloc
?Da quanto sopra, ho avuto l'impressione che
HeapAlloc()
/VirtualAlloc()
sono così lento che è molto più veloce permalloc()
chiamarli solo una volta in un po 'e poi di gestire la memoria allocata per sé. Questa supposizione è vera? O è il "wrapper"malloc()
"necessario" a causa della frammentazione? Si potrebbe pensare che le chiamate di sistema come questa sarebbero veloci - o almeno che alcuni pensieri sarebbero stati messi in loro per renderle efficienti.- Se è vero, perché è così?
In media, quanti (un ordine di grandezza) Memoria legge/scrittura vengono eseguite da un tipico
malloc
chiamata (probabilmente in funzione del numero di segmenti già assegnati)? Direi intuitivamente che è nelle decine per un programma medio, ho ragione?
Per inciso, la lettura di "dlmalloc" è molto informativa sulle strategie di malloc – Will