Corso di Sistemi Operativi

Funzioni di un SO: gestione della memoria principale (I)

 

Al momento dell’esecuzione ogni programma deve risiedere, almeno in parte, nella memoria centrale.
In un sistema monoprogrammato, questa condizione può essere facilmente soddisfatta imponendo un limite alla dimensione massima che un processo può avere; soluzione, questa, certamente non elegante e poco efficiente.
La situazione si aggrava nei sistemi multiprogrammati, in cui un numero imprecisato di processi aventi dimensioni variabili possono contemporaneamente contendersi il processore per l’esecuzione.
La contesa fra i vari processi riguarda naturalmente anche la memoria e il SO deve fornire dei meccanismi per tenere conto delle parti di memoria utilizzate e di quelle libere, per allocare memoria ai processi quando ne hanno bisogno e deallocarla quando hanno finito, e infine per gestire gli scambi fra la memoria principale e il disco, quando la memoria non è sufficiente a contenere tutti i processi.

Infatti, con il timesharing, ad un sistema sono normalmente collegati tanti utenti e la memoria non è in grado di contenere tutti i loro processi, rendendo così necessario scaricarne alcuni su disco.
Per far girare i processi che ad un dato istante risiedono nel disco, è necessario che essi vengano caricati in memoria: l’operazione relativa allo spostamento di processi dalla memoria al disco e viceversa prende il nome di swapping (scambio) e il modulo del SO che se ne occupa si chiama swapper.
Alcuni sistemi operativi (ad es. Linux) richiedono una partizione dell’hard disk dedicata esclusivamente a questo scopo, mentre altri sistemi (ad es. Windows) creano ed utilizzano un file particolare (in Windows questo file si chiama Win386.swp e si trova nella directory C:\WINDOWS\).

Per permettere a più processi di risiedere contemporaneamente in memoria, questa viene divisa in partizioni o regioni, ossia porzioni di celle di memoria contigue, che possono essere di dimensioni fisse o variabili, secondo le scelte fatte da chi sviluppa il sistema.
La maggior parte dei sistemi attuali utilizza partizioni variabili, perché presentano una maggiore flessibilità, resa necessaria dal fatto che i processi hanno dimensioni molto diverse tra loro e non tutti richiedono la stessa quantità di memoria per poter eseguire.
Inoltre gran parte dei processi cambia dinamicamente la propria dimensione durante l’esecuzione, richiedendo di volta in volta una quantità di memoria variabile e, spesso, non predicibile.
Occorre notare che, a seguito dello swapping, un processo non occupa sempre le stesse le regioni di memoria, anzi, la cosa più probabile è che ogni volta che il processo viene rimesso in memoria dal dispositivo di swap (swap device), il SO gli assegnerà regioni differenti, in relazione alla situazione di occupazione della memoria al momento in cui viene richiesto il caricamento di quel processo.

Riguardo allo spazio di swap, l’allocazione può avere caratteristiche differenti da sistema a sistema: alcuni non allocano spazio sullo swap device fino a che il processo non viene scaricato e ad ogni scaricamento questo può essere piazzato in una zona diversa del disco; altri sistemi al momento della creazione del processo gli riservano spazio per lo swap sul disco, cosicché esso occuperà sempre lo spazio che gli è stato assegnato.
In quest’ultimo caso, quando il processo termina lo spazio viene liberato.

Lo swapping puro prevede che il caricamento e lo scaricamento di un processo avvenga per intero.
Esiste però una soluzione alternativa che tiene conto di una caratteristica comune a tutti i processi: ad un dato istante ogni processo esegue utilizzando solo un sottoinsieme del suo spazio di indirizzamento.

Lo spazio di indirizzamento è l’insieme degli indirizzi di memoria generati da un programma.
Ad un dato istante, un programma in esecuzione utilizza solo gli indirizzi relativi alle istruzioni che esegue in quel momento, per cui si potrebbe pensare di tenere in memoria solo il sottoinsieme di indirizzi necessario, evitando di occupare la memoria con informazioni non necessarie.
Su questa importante proprietà si basa il metodo della memoria virtuale, di cui discuteremo nella prossima lezione.

 

Torna all'indice Generale del corso di Corso di Sistemi Operativi di Software Planet