2016-05-24 13 views

risposta

8

Una lastra è una raccolta di oggetti della stessa dimensione. Evita la frammentazione allocando un blocco di memoria abbastanza grande e dividendolo in pezzi di dimensioni uguali. Il numero di pezzi è in genere molto più grande di due, diciamo 128 circa.

Esistono due modi per utilizzare le lastre. In primo luogo, si potrebbe avere una lastra solo per una dimensione che si assegna molto frequentemente. Ad esempio, un kernel potrebbe avere una lastra inode. Ma potresti anche avere un numero di lastre in dimensioni progressive, come una lastra da 128 byte, una lastra da 192 byte, una lastra da 256 byte e così via. È quindi possibile allocare un oggetto di qualsiasi dimensione dalla successiva dimensione della lastra.

Si noti che in entrambi i casi una lastra non riutilizza la memoria per un oggetto di dimensioni diverse a meno che l'intero slab non venga restituito a un allocatore di "blocco grande" globale.

Il sistema di amici è un metodo non correlato in cui ogni oggetto ha un oggetto "amico" con cui viene coalizzato quando viene liberato. I blocchi sono divisi a metà quando sono necessari blocchi più piccoli. Si noti che nel sistema amico, i blocchi vengono divisi e combinati in blocchi più grandi come mezzo principale di allocazione e di ritorno per il riutilizzo. Questo è molto diverso da come funzionano le lastre.

O per dirla più semplicemente:

sistema compagno: varie dimensioni blocchi sono divisi quando assegnato e fuse quando liberato per dividere efficientemente un grande blocco in piccoli blocchi di varie dimensioni a seconda delle necessità.

Lastra: i blocchi molto grandi vengono allocati e divisi una volta in blocchi uguali. Nessun'altra divisione o coalescenza avviene e i blocchi liberati sono semplicemente contenuti in una lista da assegnare alle assegnazioni successive.

L'allocatore principale del kernel Linux è un allocatore di sistema flessibile buddy. Questo allocatore fornisce le lastre per i vari allcoators della lastra.

+0

Sarebbe anche molto carino se è possibile spiegare la connessione tra l'allocatore di buddy e l'allocatore di slab nella risposta (qualcosa come [questo] (http://image.slidesharecdn.com/mm-121212232739-phpapp02/95/linux- memory-management-11-638.jpg? cb = 1355354903), ma probabilmente con maggiori dettagli). Grazie. –

2

In generale l'allocatore di lastre è un elenco di lastre con dimensioni fisse adatte a posizionare elementi di dimensioni predefiniti. Come tutti gli oggetti nel pool della stessa dimensione non c'è frammentazione.

L'allocatore di amici divide la memoria in blocchi di dimensioni doppie. Ad esempio se il blocco minimo è 1k, il prossimo sarà 2K, quindi 4K ecc. Quindi se chiediamo di allocare 100b, verrà scelto il blocco con dimensione 1k. Ciò che porta alla frammentazione, ma consente di allocare oggetti di dimensioni arbitrarie (quindi è adatto per allocazioni di memoria utente in cui la dimensione esatta dell'oggetto può essere di qualsiasi dimensione).

Consulta anche:

controllare anche peggio questa presentazioni: http://events.linuxfoundation.org/images/stories/pdf/klf2012_kim.pdf diapositive da pagina 22 rivelare la sintesi delle differenze.