ALLOCAZIONE LOCALE/GLOBALE (problema)
Assegnazione di Memoria Iniziale
- Quando un processo viene avviato, il sistema operativo gli assegna una certa quantità di spazio in memoria (numero di frame o pagine) stimato in base al comportamento osservato dei vari processi in esecuzione.
- L’idea è di allocare abbastanza memoria per contenere il working set del processo, ossia il numero minimo di pagine necessarie affinché il processo funzioni senza causare continui page fault.
Possibile Insufficienza di Memoria
- Questa stima potrebbe non essere sempre precisa: a volte lo spazio assegnato inizialmente al processo potrebbe essere insufficiente per contenere l’intero working set del processo.
- Quando lo spazio è insufficiente, il processo sarà costretto a richiedere frequentemente nuove pagine (causando page fault), poiché non riesce a mantenere tutte le pagine necessarie in memoria contemporaneamente.
Conseguenze Prestazionali
- Dal punto di vista delle prestazioni, un numero elevato di page fault rende l’esecuzione del processo lenta, poiché il sistema operativo deve continuamente caricare e scaricare pagine dalla memoria secondaria.
- La soluzione ottimale, in questo caso, è aumentare lo spazio di memoria assegnato al processo, permettendo al suo working set di "starci dentro" (ovvero, mantenere in memoria tutte le pagine attive di cui ha bisogno).
PAGE FAULT FREQUENCY (soluzione)
Ad ogni processo viene assegnato un flag che stabilisce quale delle due politiche adottare. Questo flag viene assegnato sulla base del Page Fault Frequency (PFF) che deve stare all’interno di un definito intervallo delimitato da una soglia superiore e inferiore:
- Se la PFF è troppo alta significa che si è sottostimato il WS del processo e viene adottata una politica globale
- Se la PFF è troppo bassa il WS è fin troppo grande e si adotta una politica locale
Si dice che il sistema va in trashing quando tutti i processi superano la soglia A, e la somma di tutti i working set supera le capacità della memoria virtuale. A quel punto il sistema operativo uccide un processo a caso sperando la situazione migliori.
OTTIMIZZAZIONE MEMORIA VIRTUALE
DIMENSIONAMENTO
DIMENSIONE OTTIMALE DELLA PAGINE
Introduzione al Problema
La gestione della memoria richiede di determinare una dimensione ottimale per le pagine al fine di bilanciare l'uso della memoria e minimizzare gli sprechi. Non esiste una dimensione ideale valida in tutti i casi, quindi si utilizza un approccio statistico per stimare i costi e benefici di diverse dimensioni.
- in verità si era stabilito che con la page table a più livelli o invertita le pagine potessero essere anche piccolissime. ma mai infinitamente pk le pagine sono registrate come buckets e occupano memoria RAM o disco che sia
- L'obiettivo è scegliere una dimensione che minimizzi complessivamente la spreco tra frammentazione interna e dimensione tabella
- obiettivo = calcolare overhead di un processo = dimensione media frammentazione interna e entry del processo per definire la p ottimale
- ogni processo ha la sua Page Table
- s/p = numero di pagine → e = dimensione (fissa) di una entry
- derivata dell’overhead rispetto a p e pongo uguale a 0
- p/2 pk calcola la dimensione ottimale di un processo, ed un processo ha una page table per sé, quindi mi preoccupa della frammentazione interna di solo quel processo
- overhead = costi aggiuntivi, che ci sono sempre, ed è questione di trovare il giusto compromesso
CONDIVISIONE DI MEMORIA
SEPARARE Instruction Space e Data Space + PROBLEMA
COSA SIGNIFICA
La separazione tra Instruction Space e Data Space riguarda la divisione della memoria di un programma in due aree distinte:
- Instruction Space (spazio istruzioni): è l'area di memoria dove risiede il codice del programma (cioè, le istruzioni che la CPU deve eseguire). Questa zona è generalmente di sola lettura per evitare rischi di modifica accidentale o dannosa al codice stesso. Ad esempio, modificare per errore il codice di un programma potrebbe introdurre bug o problemi di sicurezza.
- SOMMA DELLE TEXT SEGMENT DEI PROCESSI
- Data Space (spazio dati): è l'area di memoria dove risiedono i dati di lavoro del programma, cioè le variabili e le strutture dati che vengono manipolate durante l'esecuzione del programma. Questa zona è di lettura e scrittura, poiché il programma ha bisogno di aggiornare e modificare i dati man mano che avanza nell’esecuzione.
- SOMMA DELLE HEAP E STACK SEGMENT DEI PROCESSI
Obiettivo della Separazione
Il principale obiettivo di questa separazione è garantire maggiore sicurezza e stabilità:
- Evitare modifiche accidentali al codice
- Isolare i dati: si permette al programma di accedervi e modificarli senza interferire con il codice di esecuzione.
- condividere l’I-Space tra più processi uguali
PAGINE CONDIVISE per I-Space e per D-Space(COW)
Se si apre Microsoft Word due volte sullo stesso computer (magari con due documenti diversi), entrambe le attività possono condividere lo stesso codice eseguibile
- In altre parole, quando apri un programma, il sistema operativo crea un processo per eseguire quel programma, e ogni volta che lo apri di nuovo, crea un nuovo processo separato,
- Ho quindi la possibilità di condividere l'Instruction Space tra più processi pk è di sola lettura → così nn devo più
ESTENDO IL CONCETTO DI CONDIVISIONE ALLA DATA SPACE → Copy-On-Write (COW)
A volte, i sistemi operativi condividono non solo il codice ma anche certe pagine di dati(data space) impostandole come READ_ONLY. In pratica:
- Se due processi condividono una pagina di dati in sola lettura e uno dei due tenta di modificarla, si verifica una trap al sistema operativo.
- Il sistema operativo genera una copia privata della pagina per il processo che sta cercando di modificarla, in modo che la pagina originale rimanga invariata.
- La copia privata della pagina viene impostata come READ_WRITE e assegnata al processo, mentre la pagina originale può continuare a essere condivisa in modalità sola lettura da altri processi.
Questo approccio, noto come Copy-On-Write (COW), consente di risparmiare memoria, poiché le pagine di dati vengono duplicate solo quando è necessario (quando un processo tenta di modificarle).
allocazione SHARED LABRARY con il Late Binding
Una shared library (libreria condivisa) è un insieme di funzioni e risorse già pronte (di sistema o scaricate) che possono essere utilizzate da più programmi contemporaneamente. In Linux, queste librerie sono note come Shared Object (SO)
LATE BINDING = meccanismo che permette di caricare le librerie condivise dinamicamente:
- Identificazione delle librerie necessarie (Shared Objects)
- Caricamento di queste librerie in memoria in uno spazio dedicato
- Configuro la libreria come Position Independent Code (PIC):
tipo di codice che rende i riferimenti nel codice della libreria non sono assoluti ma relativi
- Quando elimino una Libreria condivisa?
- Il sistema operativo tiene traccia di quante page table puntano al frame della libreria (contatore di riferimento). Quando nessun processo utilizza più quella libreria, il frame può essere rimosso dalla memoria.
Memory-Mapped File → OTTIMIZZAZIONE TEMPO
- COSA FA: evita l’uso delle system call per accedere a files del disco
- COME: il comando
mmap, mappa la posizione dei file direttamente nel processo, con un puntatore - in questo modo la CPU fa le operazioni di scrittura come se avesse a disposizione i files, queste finte scritture saranno lette dal Kernel in seguito per aggiornare realmente i files su disco
BACKING STORE → GESTIONE SPAZIO SU DISCO
Se una pagina è spostata in RAM ci sono due strategie principali:
- Focus sulle Prestazioni:
- lo spazio corrispondente su disco rimane vuoto pk gli appartiene
- Questo consente di accedere rapidamente ai dati durante lo swapping, poiché il sistema sa esattamente dove trovare o salvare una pagina.
- Più veloce, ma spreca spazio su disco
- Focus sull’ottimizzazione dello spazio:
- Si utilizza una struttura intermedia chiamata Disk map, che tiene traccia della posizione reale delle pagine dei processi in area swap.
- Usa meglio lo spazio, ma è più lento
- I sistemi operativi moderni generalmente preferiscono la scelta orientata al consumo, perché con i dischi moderni la differenza in termini di velocità è minima
SEPARARE POLITICA E IMPLEMENTAZIONE
Politica
- Cos'è?
- La politica definisce cosa fare quando si verifica una situazione specifica.
- È l'insieme delle regole o dei criteri che il sistema operativo utilizza per decidere come comportarsi.
- Esempio nella gestione del page fault:
- Quale pagina in RAM deve essere sostituita? (Politica di rimpiazzamento delle pagine)
- Esempio di politiche:
- FIFO: Sostituisco la pagina più vecchia.
- LRU: Sostituisco la pagina meno recentemente utilizzata.
- Algoritmo Ottimo: Sostituisco la pagina che non verrà più utilizzata per il periodo più lungo (teorico).
- La politica decide chi eliminare, ma non si preoccupa di come eseguire tecnicamente questa eliminazione.
Implementazione
- Cos'è?
- L'implementazione riguarda il come fare ciò che la politica ha deciso.
- Si riferisce ai dettagli tecnici, alle strutture dati e agli algoritmi necessari per mettere in pratica le decisioni prese dalla politica.
- Esempio nella gestione del page fault:
- Dopo che la politica ha deciso quale pagina sostituire, l'implementazione si occupa di:
- Aggiornare la Page Table.
- Effettuare un eventuale Page Out (se la pagina è modificata).
- Eseguire un Page In per caricare la nuova pagina richiesta.
- Ripristinare il processo in stato di ready.