In un sistema multiprogrammato, come distribuiamo i frame (pagine di memoria) disponibili fra i processi? Ci sono varie soluzioni detti algoritmi di allocazione:
Allocazione uniforme: lo stesso numero di frame a tutti i processi: n frame, p processi, n/p frame a ciascun processo
Allocazione proporzionale: tiene conto del fatto che i processi hanno dimensioni diverse. Se le dimensioni in pagine di tre processi sono: P1 = 4, P2 = 6, P3 = 12 e ci sono 11 frame disponibili, l’allocazione sarà: P1 = 2, P2 = 3, P3 = 6.
Allocazione proporzionale in base alla priorità: tiene conto del fatto che i processi hanno priorità diverse Una volta deciso come allocare le pagine , dobbiamo decide in quale gruppo di pagine (di che processo) possiamo/dobbiamo scegliere la vittima da rimuovere dalla MP. Anche qui ci sono diverse soluzioni.
Allocazione globale: scegliamo la vittima fra tutte le pagine della memoria principale (di solito, escluse quelle del SO). Potremmo in questo modo portare via una pagina ad un processo diverso da quello che ha generato il page fault.
Allocazione locale: scegliamo la vittima fra le pagine del processo che ha generato page fault. In questo modo il numero di frame per processo rimane costante. Attenzione però, se si danno troppe (relativamente) pagine ad un processo, si può peggiorare la situazione del sistema perché gli altri processi genereranno più page fault.
In generale l’allocazione globale è di solito preferita per sistemi time sharing. Può succedere che avendo pochi frame, ogni processo ha un’alta probabilità di generare un page fault. Per gestire il page fault, una pagina viene tolta dalla MP, probabilmente ad un altro processo, il quale ha a sua volta un’alta probabilità di generare un page fault. Alla fine tutti i processi sono attivissimi a rubarsi pagine l'un l'altro, per fare page-fault subito dopo! Questo fenomeno si chiama THRASHING ed è assolutamente da evitare dimensionando opportunamente il numero di pagine per processo. Intuitivamente, il thrashing si verifica quando si tenta di aumentare troppo il grado di multiprogrammazione, in modo da sfruttare al massimo il tempo di CPU e incrementare il throughput del sistema. Oltre una certa soglia però, i processi passano più tempo a fare page fault che a portare avanti il loro lavoro, e il livello di utilizzazione della CPU, e quindi il throughput, crollano verticalmente!
In definitiva quindi, il thrashing è una sorta di “ingolfamento” del sistema: vogliamo sfruttarlo al meglio “iniettando” più e più processi nel sistema, col risultato che i processi si danneggiano a vicenda. Per risolvere questo problema si può per esempio misurare la frequenza di page-fault, per vedere se è “accettabile” rispetto alle prestazioni che vogliamo ottenere dal sistema. Se la frequenza osservata è troppo bassa, possiamo togliere ai processi qualche frame, e aumentare il grado di multiprogrammazione Se la frequenza osservata è troppo alta, diminuiamo il grado di multiprogrammazione e ridistribuiamo i frame liberati fra i processi non rimossi.
Tutto quanto riportato in questa pagina è a puro scopo informativo personale. Se non ti trovi in accordo con quanto riportato nella pagina, vuoi fare delle precisazioni, vuoi fare delle aggiunte o hai delle proposte e dei consigli da dare, puoi farlo mandando un email. Ogni indicazione è fondamentale per la continua crescita del sito.