Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Gestione della Cache e Paginazione a Domanda: Appunti di Sistemi Operativi, Appunti di Sistemi Operativi

Libro di Michael Dahlin, Thomas Anderson tradotto in italiano (13 capitoli).

Tipologia: Appunti

2017/2018

In vendita dal 09/09/2018

maDave
maDave 🇮🇹

12 documenti

1 / 11

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Capitolo 9 (26/04/18) CACHE
La cache è una memoria, che contiene una copia di dati, molto veloce. Se un dato che sto cercando lo trovo
viene chiamato hit altrimenti ho un miss.
Perché funzionano le cache?
Dapprima ci si era accorti che nei programmi vigeva il principio di località. Per un bel po’ di tempo quindi
utilizzo gli stessi dati/istruzioni. Esiste anche una località spaziale: per esempio quando lavoro in una matrice
(quindi i dati sono uno accanto all’altro).
In lettura In Scrittura
Working set= insieme di locazioni di memoria che vengono utilizzate da un processo per un certo periodo di
tempo, quindi è molto ragionevole mettere tale working set all’interno della cache.
Thrashing: Il working set > dimensione della cache, quindi ogni volta devo recuperare informazioni che non
ho.
Come si realizza fisicamente la cache?
Come una memoria associativa chiamata Fully Associative. In questo caso ho subito il valore se esiste in
cache (poiché viene fatto un controllo in parallelo) ma costa tanto. Potrei realizzarla con una tabella hash,
tale tecnica chiamata Direct Mapped. In pratica si utilizza una via di mezzo, quindi si utilizzano più
memorie associative le quali sono indirizzate tramite funzioni hash()
pf3
pf4
pf5
pf8
pf9
pfa

Anteprima parziale del testo

Scarica Gestione della Cache e Paginazione a Domanda: Appunti di Sistemi Operativi e più Appunti in PDF di Sistemi Operativi solo su Docsity!

Capitolo 9 (26/04/18) CACHE La cache è una memoria, che contiene una copia di dati, molto veloce. Se un dato che sto cercando lo trovo viene chiamato hit altrimenti ho un miss. Perché funzionano le cache? Dapprima ci si era accorti che nei programmi vigeva il principio di località. Per un bel po’ di tempo quindi utilizzo gli stessi dati/istruzioni. Esiste anche una località spaziale: per esempio quando lavoro in una matrice (quindi i dati sono uno accanto all’altro). In lettura In Scrittura

Working set= insieme di locazioni di memoria che vengono utilizzate da un processo per un certo periodo di tempo, quindi è molto ragionevole mettere tale working set all’interno della cache. Thrashing: Il working set > dimensione della cache, quindi ogni volta devo recuperare informazioni che non ho. Come si realizza fisicamente la cache? Come una memoria associativa chiamata Fully Associative. In questo caso ho subito il valore se esiste in cache (poiché viene fatto un controllo in parallelo) ma costa tanto. Potrei realizzarla con una tabella hash, tale tecnica chiamata Direct Mapped. In pratica si utilizza una via di mezzo, quindi si utilizzano più memorie associative le quali sono indirizzate tramite funzioni hash()

Che succede se la cache è piena? Devo scegliere quali oggetti mettere. Quali sono i criteri?

  • Cache vuota o possibilità di spazio:
    • Metto tutti quelli che riferisco fin quando non riempio
  • Cache piena
    • Devo scegliere uno da buttare fuori: La scelta è critica per la probabilità di cache miss. ■ Random: Uno a caso ■ FIFO Continuo capitolo 9 (03/05/18) Perché non uso una memoria veloce per tutto? Perché è estremamente costosa. Come scelgo l’elemento da buttare via? Dobbiamo evitare il più possibile il fenomeno del trashing.
  • Min: Minimizza il numero di cache miss, ma deve conoscere il futuro (ma come sappiamo non possiamo predirlo).
  • Least Recently Used (LRU): Poniamo il caso che il futuro sia speculare al passato. Individua la vittima (l’elemento che deve essere sostituito) prendendo quello che è stato riferito per l’ultima volta più indietro nel tempo.

Least Frequently Used (LFU): Scaricare quello che in un certo lasso di tempo è stato riferito molto meno. A volte MIN si comporta come LRU.

Cosa si fa nel caso di un page fault?

  1. CPU riferisce un indirizzo logico relativo ad una pagina PG con offset OF
  2. Si va a vedere nella tabella delle pagine e il bit di presenza è 0 => page fault
  3. Esiste una posizione libera nella core map => uso l’indirizzo logico per andare sul disco la pagina
  4. La pagina fisica viene messa nella posizione libera che avevo trovato modificato il bit di presenza ad

Se non trovo nessuna posizione libera: Prima di andare a caricare dal disco la pagina richiesta, devo buttare fuori una pagina chiamata vittima , la quale viene salvata in disco prima di essere rimpiazzata. OSS: Se la pagina da buttar via non è stata mai modificata, allora la dichiaro libera immediatamente. Altrimenti, prima la salvo su disco e poi posso rimpiazzarla. Questo è possibile grazie al bit di modifica. Riassunto paginazione a domanda:

  1. TLB miss (cerco un oggetto e ho un miss)
  2. Vado a vedere nella tabella delle pagine
  3. Page fault (marco la pagina come invalida)
  4. Devo farla caricare tramite il kernel causando una trap
  5. Converte indirizzo del file + offset
  6. Cerco una pagina fisica libera 6.a. Se non lo trovo devo buttare fuori qualche pagina
  7. Inizio il trasferimento della pagina da disco
  8. Quando il trasferimento è completato tramite DMA, il disco causa un’interruzione
  9. La pagina viene marcata come valida. Viene messo nella coda dei processi pronti
  10. Riparte il processo dopo l’istruzione di fault
  1. Ho di nuovo un TLB miss
  2. Vado di nuovo nella tabella delle pagine
  3. Eseguo l’istruzione dopo. Come scelgo la vittima? Uso delle tecniche per scegliere la vittima. Potrei usare le stesse tecniche della cache; queste rischiano di essere molto costose rallentando molto il sistema. Una volta scelta la pagina vittima devo distinguere se la pagina è:
  • Condivisa:
  • Devo scandire tutte le tabelle della pagine di tutti i processi che la riferiscono.
  • Devo invalidare tale posizione
  • Devo anche toglierla dal TLB
  • (^) La scrivo su disco se è necessario.
  • Non condivisa: Come spiegato tutto in precedenza Come faccio a sapere se è stata modificata? Ho il bit M di modifica. Nelle ipotesi migliori se il processore è abbastanza potente, il bit di modifica lo setta automaticamente l’hardware. Deve anche essere settata automaticamente sia nella page table che nella TLB. (Tutto ciò nel caso di istruzioni di store). È utile sapere anche se la pagina è stata letta ( bit di uso ) quindi viene settato il bit corrispondente ad hardware, sia nella TLB e Page Table. Quando vengono resettati tale bit? Quando trasferisco una determinata pagina sul disco, quindi non è in memoria. Dirty = bit di modifica

Una volta che la pagina è stata modificata

Ad ogni giro di lancetta ho 2 possibilità:

  • Bit di uso a 1: Lo porto a 0 => Seconda chance.
  • Bit di uso a 0: Vittima. Posizionandosi in quella dopo. Si può generalizzare a n -chance. Algoritmi di sostituzione Globali Seleziono la pagina tra tutta la memoria. Uso la distanza passata definita in base ai tempi assoluti; ma questi potrebbero causare del trashing per i processi lenti. Locali Seleziono la pagina guardando solo quelle del processo in questione. Potrei usare anche LRU poiché la coda è corta. Problema: Inizializzazione delle pagine che possono stare in memoria. Quindi ad ogni processo devo stabilire una dimensione minima di pagine che servono a far eseguire il programma; questo viene chiamato working set. Working set: Contiene al suo interno LRU.
  • Paginazione on-demand : Inizialmente quando un processo viene caricato non ha pagine in memoria. Riferisce una pagina, causa page fault e carico la pagina in memoria. Questo lo faccio finché non ha il suo working set in memoria. I page fault diminuiscono quando viene creato il working set.
  • Prepaging: Io ho stabilito le dimensione del working set di quel processo. Carico altre pagine facendo un pre-fetching. Grandezza Working Set: Rischio di sprecare memoria, o di rallentare il processore. Si cerca di capire la grandezza a periodi.

Quindi per ogni pagina mantengo un bit che indica se è stato riferito nell’ultimo time tick, ad un page fault si esamina il bit R. WSCLOCK

età: time ultimo rif.

Continuo lezione (08/05/18)

  • Quindi per esempio: funzione hash(processo(A), pagina logica 7) = blocco