Please enable JavaScript.
Coggle requires JavaScript to display documents.
Mappa tecnologie e progettazione - Coggle Diagram
Mappa tecnologie e progettazione
tecniche di allocazione
Nello schema a partizione fissa la dimensione
della partizione viene definita all’atto
dell’inizializzazione del sistema, quindi
staticamente
Le partizioni possono anche essere di
dimensione diversa tra loro e possono
essere stabilite dall’operatore all’avvio del SO.
Frammentazione interna
Supponiamo che ogni processo occupi
un’intera partizione e che venga schedulato un
job“piccolo”
se ogni partizione piccola ma sufficientemente
grande per contenerlo ha la coda piena e
invece la coda di una partizione grande è
vuota, il job piccolo viene assegnato alla
partizione grande.
La frammentazione della memoria
La figura simula lo stato della RAM in seguito
all’esecuzione di una sequenza di processi
il partizionamento dinamico è generalmente
soggetto a frammentazione esterna
Nella partizione fissa si possono verificare due
problemi:
il problema della frammentazione interna, che si
presenta quando le singole partizioni sono di
grandi dimensioni;
il problema della frammentazione esterna, che si
presenta quando le singole partizioni sono di
piccole dimensioni.
Il sistema più semplice per allocare la memoria
centrale nei sistemi multiprogrammati è quello
di suddividerla in partizioni
la scelta della dimensione della partizione è
fondamentale per l’efficienza del sistema in
quanto effettuare partizioni troppo piccole
potrebbe provocare problemi di
frammentazione
Esistono molte tecniche per l’allocazione del codice
e dei dati :
1) Mono programmato
con allocazione contigua a partizione singola
2) Multi programmato
con allocazione contigua a partizioni sia fisse che variabile
e anche con allocazione non contigua che possiede una paginazione con segmentazione
Una possibile soluzione è quella di spostare
periodicamente i processi all’interno della RAM per
fare in modo di “ricompattare le aree di memoria
libere” (memory compaction) ottenendo quindi
un’intera zona da riutilizzare
Area di swap
Per ottimizzare l’utilizzo della
memoria generalmente il
partizionamento dinamico fa uso del
disco come area di appoggio
(backing store o swap) per i
processi che per un qualsiasi
motivo non sono in grado di
continuare e passano nello stato di
wait
Frammentazione interna
Come si vede nella figura a lato potremmo
sprecare quasi tutta la partizione grande per un
job molto piccolo.
Frammentazione esterna
La dimensione di un processo può essere più
grande di una qualunque partizione esistente
anche se, nel complesso, la memoria
associata a tutte le partizioni è sufficiente per
contenerla.
Schema a partizione variabile o dinamico
Nello schema a partizione variabile è possibile
modificare dinamicamente sia il numero sia la
dimensione di ogni singola partizione
È anche possibile creare blocchi di dimensione
specifica per il nuovo processo direttamente al
momento del suo caricamento
Frammentazione esterna
Il grado di
multiprogrammazione è
limitato al numero di partizioni
non posso eseguire processi
se non sono in grado di
allocare una partizione.
Il problema della frammentazione interna si può risolvere
mediante l’uso di una singola coda di ingresso;
quando si libera una partizione, si possono avere due
strategie di assegnazione ai job:
si percorre la coda a partire dalla testa fino a individuare
un job di dimensioni tali da poter essere contenuto;
si percorre tutta la coda individuando il job più grande che
può essere contenuto nella partizione che è libera: in
questo modo, però, vengono discriminati i job di
dimensione ridotta
Memoria virtuale: introduzione
Entrambe le tecniche descritte in precedenza
determinano problemi di frammentazione della
memoria
I moderni sistemi operativi introducono il
concetto di memoria virtuale, realizzata con le
tecniche di paginazione, segmentazione e
tecniche ibride che uniscono i vantaggi di
entrambe le soluzioni.
Il principale scopo di queste tecniche è di ridurre la
frammentazione della memoria, della quantità di
memoria che risulta non utilizzabile.
L’introduzione di una tecnica di allocazione non
contigua può portare a un altro fondamentale
vantaggio
caricare in memoria solo le parti di programma che
effettivamente sono utili per l’evoluzione del processo in
quel dato istante e liberare le altre parti per poter caricare
nuovi task
Statisticamente nei programmi vale il principio
di località:
quando viene eseguita un’istruzione, la
probabilità più alta è che subito dopo ne venga
eseguita una a essa vicina
quindi è sufficiente avere caricato un “pezzo” di
codice mentre il resto può rimanere sulla
memoria di massa.
I Gli obiettivi della paginazione sono i seguenti:
mantenere in memoria solo le parti necessarie;
gestire ogni volta solo piccole porzioni di memoria;
non sprecare spazio evitando la frammentazione;
ridurre la frammentazione interna a valori trascurabili;
poter utilizzare porzioni di memoria non contigue per
lo stesso programma;
non porre vincoli al programmatore (come nelle
overlay).
Nella paginazione sia il programma sia la
memoria centrale vengono suddivisi in pagine
di dimensione fissa:
•la memoria fisica in blocchi
chiamati frame o pagine
fisiche;
•il programma in blocchi di
uguale dimensione detti
pagine (o pagine logiche).
Per ottenere un indirizzo di memoria dobbiamo
ora avere a disposizione due elementi, ovvero
il numero di pagina (p) e lo spiazzamento nella
pagina o offset (d)
la somma di questi due elementi permette di
ricavare l’indirizzo fisico desiderato (binding tra
indirizzo logico e fisico).
Nella figura seguente si vede come il nuovo
processo non viene completamente caricato in
RAM, ma solo due pagine logiche trovano
spazio libero e tale spazio non è contiguo.
Il SO cura una tabella delle pagine ove il
numero stesso di pagina fisica viene utilizzato
come indice
nella tabella sono memorizzati gli indirizzi fisici
iniziali di tutti i frame presenti nella memoria
fisica oltre alle indicazioni generali, cioè se la
pagina è occupata o libera, ed eventualmente
l’ID del processo che la occupa.
Naturalmente il numero di pagine logiche può
essere diverso dal numero di pagine:
se il numero delle pagine logiche è minore del
numero delle pagine fisiche (libere) il programma
potrebbe anche essere caricato tutto in memoria;
se il numero delle pagine logiche è maggiore del
numero delle pagine fisiche (libere) il programma
verrà caricato in memoria parzialmente.
Non necessariamente le pagine fisiche devono
essere contigue e quindi le pagine logiche
possono trovarsi “mischiate” nella memoria
centrale
naturalmente affinché un processo possa
sfruttare questa tecnica di gestione condizione
necessaria è che il codice sia rilocabile
dinamicamente.
La gestione delle pagine rientra tra i compiti del
SO mentre la traduzione da indirizzo virtuale a
indirizzo fisico viene effettuata da MMU,
precedentemente già descritto, dove:
lo spazio degli indirizzi logici rappresenta l’intero
insieme degli indirizzi generabili dalla CPU;
lo spazio degli indirizzi fisici rappresenta l’intero
insieme degli indirizzi visibili dalla memoria.
Il SO determina, tramite le politiche fetch policy, quando una
pagina deve essere portata nella RAM.
Le fetch policy si basano su due concetti fondamentali:
1 demand page: la pagina è caricata in memoria solo
quando viene fatto un riferimento a una sua locazione, in
modo da lasciare il maggior numero di free frame;
2 prepaging: si cerca di sfruttare il principio di località
spaziale caricando, oltre alla pagina desiderata, alcune
pagine adiacenti però dello stesso processo; questa tecnica
però può risultare inefficace se si caricano troppe pagine
inutili.