Dati i seguenti vincoli:
- Nessun multithreading.
- Non interessa l'utilizzo della cache dell'hardware.
Ti stai chiedendo quale sarebbe uno schema di allocazione della memoria ragionevolmente ottimale.
Dalla mia conoscenza limitata, un'implementazione è Liste gratuite , ma dice che hanno alcuni problemi. Poi c'è la gestione degli amici e l'allocazione dinamica.
Nel complesso, la procedura sembra essere la seguente:
- Assegna blocco
- Trova spazio disponibile
- Se ne esiste qualcuno, quindi usalo.
- In caso contrario,
- Calcola le modifiche che dovresti apportare ai blocchi di memoria per soddisfare la richiesta. Ciò si traduce in una serie di movimenti di blocchi per aprire un intervallo di dimensioni appropriate per soddisfare la richiesta.
- Dato che sai come mescolare i blocchi, fallo.
- Quindi alloca la memoria.
- Potenzialmente spostati su altri blocchi se hai tempo, per sbarazzarti di parte della frammentazione.
- Return
La parte centrale di questo è dove inizia a diventare difficile. Ci deve essere qualche struttura dati associata ai blocchi liberi / usati, forse, per renderlo efficiente navigare in essi. Quindi chiedendo quanto tempo possiamo dedicare alla ricerca di una posizione ideale. È come se si debba calcolare e prevedere quale sia lo scenario migliore, ma ciò richiederebbe il calcolo di un sacco di cose. Poi c'è il problema di fare una specie di GC e ripulire l'organizzazione della memoria. Tutto questo in cima al bilanciamento della memoria di copia, che è un piccolo successo di prestazioni. Chi l'avrebbe mai pensato così complesso.
Per riassumere, chiedendosi come sia una procedura standard di allocazione della memoria è piuttosto ottimale. Ho visto le implementazioni C delle variazioni di malloc ma è difficile raccogliere tutti i pezzi da quanto è grande e complesso.
Per riferimento, sto pensando a come se un ricordo fosse organizzato in questo modo:
type 1
type 2
type 3
Se sono imballati insieme, se type 1
ha bisogno di più spazio, chiedi se aggiunge alla fine:
[empty]
type 2
type 3
type 1
O se avrebbe dato più spazio spostando:
type 1
[empty]
type 2
type 3
Ma poi inizia a complicarsi. Si potrebbe attenuare questo un po ' assegnando un po' più spazio del necessario, ma alla fine diventerà troppo grande per la sua posizione, quindi come bilanciarlo. È lì che mi confondo. Vengo da JavaScript Land.