Esercizio - Buddy system per la memoria del kernel (slide di memoria virtuale)
In questa pagina 5
Testo.
- (Slide.) Il kernel dispone di un segmento di 256 KB gestito con il buddy system e chiede 21 KB: come viene diviso il segmento e quanto spazio si spreca?
- Segmento da 256 KB, tutto libero. Arrivano nell'ordine le richieste KB, KB, KB, KB. Mostrare i blocchi assegnati, la frammentazione interna totale, e le fusioni quando si liberano nell'ordine , , , .
- Cosa cambia con la slab allocation?
Il buddy system
Il segmento è formato da pagine fisicamente contigue. Ogni richiesta è arrotondata alla potenza di 2 superiore. Se il blocco libero più piccolo che basta è più grande del necessario, lo si divide in due compagni (buddies) di dimensione metà, e si ripete fino alla dimensione giusta; un compagno si usa, l'altro resta libero. Quando un blocco viene liberato e anche il suo compagno è libero, i due si fondono in un blocco doppio, e si ripete.
Il compagno di un blocco di dimensione che parte all'indirizzo (multiplo di ) è il blocco che parte da (cioè se è pari, se è dispari).
Parte 1: 21 KB su 256 KB
KB (potenza di 2 superiore). Si divide:
Un blocco da 32 KB serve la richiesta; restano liberi un blocco da 32 KB, uno da 64 KB e uno da 128 KB. Lo spreco (frammentazione interna) è KB.
Parte 2: quattro richieste
Rappresentiamo la memoria come un segmento in KB.
| passo | richiesta | blocco richiesto | operazione | blocchi liberi dopo |
|---|---|---|---|---|
| 0 | (256) | |||
| 1 | 32 | divisioni fino a 32: in | , , | |
| 2 | 64 | si usa il blocco libero da 64: in | , | |
| 3 | 16 | si divide il 32 libero: ; in | , | |
| 4 | 128 | si usa il blocco libero da 128: in | (16) |
Frammentazione interna. : ; : ; : ; : . Totale: KB sprecati su 240 KB assegnati (). Rimangono liberi 16 KB nel blocco , ma una nuova richiesta da 17 KB o più non sarebbe soddisfatta.
Liberazioni (ordine , , , ):
- Si libera : il suo compagno è diviso (contiene ): niente fusione. Liberi: , .
- Si libera : il compagno è libero: si fondono in (32 KB); il compagno di questo è , libero: si fondono in (64 KB); il compagno di è (, occupato): si ferma. Libero: .
- Si libera : il compagno è libero: fusione in ; il compagno di questo, , è (occupato): si ferma. Libero: .
- Si libera : il compagno è libero: fusione in . La memoria è di nuovo un unico blocco da 256 KB.
La fusione è veloce perché basta controllare il compagno (indirizzo ); lo svantaggio è la frammentazione interna dovuta all'arrotondamento.
Parte 3: slab
Con la slab allocation una slab è una o più pagine contigue; ogni cache contiene una o più slab per una struttura dati del kernel ed è riempita di oggetti di quella struttura, all'inizio tutti marcati liberi. Un'allocazione prende un oggetto libero (lo marca usato); se la slab è piena si passa a una vuota, e se non ce n'è si crea una nuova slab. Poiché ogni cache è fatta di oggetti della dimensione esatta della struttura, non c'è frammentazione dovuta all'arrotondamento a potenze di 2 e le richieste sono servite rapidamente, senza dividere e fondere blocchi.
Errori tipici
- Dimenticare di arrotondare alla potenza di 2 superiore (21 KB 32 KB, non 16 né 21).
- Fondere due blocchi vicini che non sono compagni (per esempio con ): la fusione vale solo per i compagni, che hanno la stessa dimensione e provengono dalla stessa divisione.
- Fermarsi alla prima fusione senza controllare il compagno del blocco risultante.
- Contare come spreco anche la memoria libera: la frammentazione interna è solo la differenza fra blocco assegnato e richiesta.
Versione ripasso
Regole. Richiesta arrotondata alla potenza di 2 superiore; si divide un blocco libero in due compagni di metà dimensione finché serve; al rilascio, se il compagno (indirizzo ) è libero ci si fonde, e si ripete.
1. 21 KB KB: ; restano liberi 32, 64, 128; spreco KB.
2. in ; in ; in (si divide il 32 in 16+16); in . Interna: KB (su 240 assegnati); restano liberi 16 KB in . Liberazioni: (compagno diviso: nessuna fusione); (si fonde con , poi con , poi si ferma davanti a ): libero ; libero ; libero .
3. Slab. Cache per ogni struttura del kernel, riempita di oggetti della misura esatta (liberi o usati); se la slab è piena si usa una vuota o se ne crea una; niente arrotondamenti a potenze di 2, richieste rapide.
Errori tipici: niente arrotondamento; fusione tra blocchi non compagni; fermarsi alla prima fusione; spreco contato sulla memoria libera.