2012-07-04 4 views
16

Sto lavorando su un semplice stack machine scritto in C, principalmente per scopi di apprendimento. Dopo aver usato malloc/free per le mie operazioni di memoria, ho pensato che sarebbe stata una buona idea leggere un codice specifico per l'allocazione della memoria dalle moderne macchine virtuali.In che modo le moderne macchine virtuali gestiscono l'allocazione della memoria?

Ho scaricato il codice sorgente Lua e ho iniziato a leggerlo. Dopo un po 'mi sono reso conto che ci sono molte cose macro coinvolte e non sono riuscito a trovare il codice in cui è stata eseguita l'allocazione della memoria reale (ad esempio chiamata malloc).

find . -exec grep -i "malloc" '{}' \; -print 

E 'stampata solo alcune macro Lua che hanno malloc parola nel loro nome. La Lua VM (e il linguaggio di programmazione) non usa affatto malloc!

Quindi questo mi porta alla domanda: in che modo le moderne macchine virtuali gestiscono l'allocazione della memoria? In che modo Lua alloca la memoria dall'heap? Esistono modi per l'allocazione diversi da malloc? Quali sono i pro/contro di altri metodi?

Mi sto anche interrogando su best practice, schemi di progettazione, ecc. Per lavorare in modo sicuro sulla memoria allocata. Vedo nella fonte di Lua che c'è molto indiretto prima di allocare memoria. Dove posso conoscere questa roba?

+0

Che tipo di VM è interessato? Ci sono macchine virtuali che virtualizzano interi computer, lo sai. Stai chiedendo anche a quelli? –

+0

@AlexeyFrunze, No, sono solo interessato alle macchine virtuali utilizzate per i linguaggi di programmazione. – sinan

+0

OK, il titolo sembra confuso. –

risposta

14

Lua più utilizza sicuramente malloc, sotto forma di realloc (si può anche passare un allocatore personalizzato troppo), però, perché Lua utilizza un GC come il 99% dei linguaggi basati VM, utilizza le macro per aggiungere automaticamente il GC blocco di intestazione per l'assegnazione.

Troverete la memoria di Lua tutti gestiti dalle LuaM_ routine in lmem.c e lmem.h, questi tutti usano lo stato globale del VM per memorizzare un allocatore, che inizialmente è impostato su l_alloc (da lauxlib.c), ma può essere modificata di lua_setallocf.

Recentemente, LuaJIT ha aggiunto l'affondamento di allocazioni e piani per alcune funzioni di memoria davvero interessanti, che è possibile leggere su questo articolo su LuaJIT Garbage Collection. L'articolo copre un sacco di strategia e design che ruotano attorno all'allocazione della memoria VM/JIT, all'affondamento, all'aggregazione e alla raccolta dei rifiuti.

Come si può vedere, l'allocazione della memoria e le strategie di sinking sono strettamente collegate al GC che si impiega (se esiste).

In termini di pro ei contro di vario memoria allocatori, utilizzando lo standard malloc è semplice da usare, ma a costo di velocità e sprechi di allineamento e vari blocchi aggiuntivi tag a ciascuna assegnazione.

Passando ad allocatori di arena, pool, slab e blocchi più avanzati, è possibile accelerare notevolmente le operazioni (soprattutto per allocazioni interne di VM di dimensioni fisse) ed evitare un sacco di frammentazione e overhead che possono verificarsi con allocatori più generali come malloc, ma ovviamente questi allocatori sono più complessi e bisogna eseguirne il debug se si parte da zero (che in un sistema più grande come una VM sta solo chiedendo dei problemi), come da applicazione alla comprovata implementazione CRT malloc .

+0

Grazie, puoi mostrarmi dove sta usando 'malloc', perché come ho detto, non riesco a trovarlo. Sto progettando di rintracciare il codice di malloc usato per capire meglio gli interni. – sinan

+0

@sinan: lemme scavare rapidamente – Necrolis

+0

@sinan: vedere il mio aggiornamento – Necrolis

5

Il core Lua non utilizza malloc e gli amici. Si basa su una funzione di allocazione della memoria fornita dall'utente che ha la semantica realloc-like (ma è più precisa quando si trattano i puntatori e le dimensioni di 0 NULL). Vedi lua_Alloc.

La libreria ausiliario Lua fornisce una funzione luaL_newstate convenienza che crea uno stato Lua tramite la funzione principale lua_newstate utilizzando una funzione di allocazione di memoria in base allo standard realloc e free. Altri client possono utilizzare qualsiasi allocazione di memoria adatta alla propria app.