Obiettivi del SO
Nell'ambito della gestione della memoria, gli obietti del SO:
- allocare più processi in memoria, per avere parallelismo, e migliorare così la performance del sistema
- proteggere la memoria dei processi, impedendo che ciascuno di essi acceda alle aree degli altri processi
Se il SO offre la memoria virtuale, all'obbiettivo 1 si aggiunge la possibilità di eseguire al tempo stesso pù processi di quanti ce ne starebbero in RAM
Traduzione, linking e loading
Il passaggio da programma sorgente a programma binario in memoria è composto da tre fasi: traduzione, linking e loading
- Source program: il programma sorgente, scritto in un linguaggio come assembly, C, ecc. (non in linguaggio macchina)
- Il translator (assembler/compilatore) riceve in input il programma sorgente e produce un object module (modulo oggetto): un programma in linguaggio macchina che solitamente non è ancora eseguibile, in quanto può contenere riferimenti a funzoni/dati definiti in altri moduli e/o librerie, i cui indirizzi non sono ancora noti.
- Il linker collega i vari moduli oggetto e le librerie, producendo il programma eseguibile. In questa fase, gli indirizzi in memoria assegnati dal traduttore possono essere rilocati (cambiati), per evitare overlapping con gli indirizzi di altri moduli/librerie.
- Quando si vuole eseguire il programma, il loader lo carica in memoria, associandolo a un processo. Può essere necessario effettuare un'ulteriore rilocazione degli indirizzi di memoria generati dal linker, per evitare overlapping con altri programmi già presenti in memoria.
Osservazioni
- L'overlapping tra gli indirizzi di moduli - programmi diversi è normale e inevitabile, perchè essi possono essere scritti da programmatori diversi, ciascuno dei quali non può conoscere gli indirizzi usati da tutti gli altri programmi esistenti
- Quando un programma è scritto in un linguaggio ad alto livello, l'indirizzo iniziale viene scelto dal compilatore, che non è a conoscenza degli altri moduli.
- Un programma non viene sempre caricato nella stessa zona di memoria, dato che le zone disponibili variano in base a quali altri programmi sono in esecuzione.
Per questi motivi, la rilocazione (sia in fase di linking, che di loading) è indispensabile.
Rilocazione e linking dinamici