5

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:

  1. 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.
  2. Ciò che rende nedmalloc così molto più veloce di Microsoft di malloc?

  3. Da quanto sopra, ho avuto l'impressione che HeapAlloc()/VirtualAlloc() sono così lento che è molto più veloce per malloc() 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ì?
  4. 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?

+0

Per inciso, la lettura di "dlmalloc" è molto informativa sulle strategie di malloc – Will

risposta

5
  1. Calling HeapAlloc non suona cross-platform. La SM è libera di cambiare la propria implementazione quando lo desidera; consiglia di stare lontano. :)
  2. E probabilmente sta usando pool di memoria in modo più efficace, proprio come la biblioteca Loki fa con la sua "piccola allocatore oggetto"
  3. assegnazioni Heap, che sono di uso generale per natura, sono sempre lenti tramite qualsiasi applicazione. Quanto più "specializzato" è l'allocatore, tanto più veloce sarà. Questo ci riporta al punto # 2, che riguarda i pool di memoria (e le dimensioni di allocazione utilizzate che sono specifici per la tua applicazione).
  4. Non so.
+0

Microsoft è inoltre libera di cambiare le cose per rendere tutto migliore. Vedi la transizione all'Heap a bassa frammentazione. – MSN

+0

1. Nemmeno mi aspettavo che fosse, dal momento che sto tentando un obiettivo di implementazione malloc su Windows. Ma la domanda rimane: è inefficace, frammentaria? 2. Con questo si intende che gestisce i puntatori per liberare lo spazio in modo più efficiente, in modo che l'allocazione del blocco appropriato in memoria sia più veloce? Sai dove posso leggere sui pool di memoria? Come suggerito dall'utente Will sopra, ho iniziato su dlmalloc (l'ho scansionato in precedenza, ma suona unix-oriented, descrivendo la sua funzionalità di windows come l'emulazione delle chiamate unix). – Norswap

1

Da quanto sopra, ho avuto l'impressione che HeapAlloc()/VirtualAlloc() sono così lento che è molto più veloce per malloc() per chiamare loro solo una volta ogni tanto e poi per gestire il allocato memoria stessa. Questa supposizione è vera?

Le chiamate di sistema a livello di OS sono progettate ed ottimizzate per la gestione dell'intero spazio di memoria dei processi. Usarli per allocare 4 byte per un intero è in effetti non ottimale: si ottengono prestazioni e utilizzo della memoria migliori in generale gestendo piccole allocazioni nel codice della libreria e consentendo al sistema operativo di ottimizzare le allocazioni più grandi. Almeno per quanto ho capito.