Dopo aver dato uno sguardo allinterno dei sistemi operativi,
vediamo adesso alcune cose notevolmente interessanti per chi sviluppa
software.
Probabilmente si tratta di cose già note, ma val la pena di parlarne
anche solo per rinfrescarci la memoria :-).
Allinizio del corso abbiamo appreso che un SO astrae dallhardware
fornendo allutente, sia esso semplice utilizzatore o programmatore,
uninterfaccia semplice per interagire con il calcolatore e
un ambiente di esecuzione dei programmi indipendente dalle caratteristiche
di basso livello della macchina.
Inizialmente gli elaboratori digitali venivano programmati direttamente
nel linguaggio dellhardware, dapprima in codice binario, subito
dopo in Assembler.
Con questo metodo si potevano scrivere programmi piccoli e veloci
(per le esigenze computazionali di quei tempi), ma strettamente
dipendenti dalla macchina per cui erano stati scritti.
Lintroduzione di uno strato software tra lhardware e
i programmi utente e lavvento dei linguaggi di programmazione
ad alto livello (i cosiddetti linguaggi della terza generazione,
3GL), hanno reso possibile sviluppare applicazioni indipendenti
dalla macchina, ma dipendenti dal SO.
Ad es. un programma scritto per un sistema Windows non può essere
eseguito su un sistema GNU/Linux (attualmente fanno eccezione i
bytecode di Java, secondo quanto discusso in Corso
di Java lezione 2).
Comprendiamo bene che questa realtà nasce dal fatto che ogni sistema
adotta soluzioni proprie per risolvere i problemi discussi nelle
puntate precedenti e per fornire le funzionalità di base richieste.
Entriamo più a fondo nella questione, seguendo il percorso intrapreso
da un codice sorgente per diventare un programma riconosciuto ed
eseguito dal SO.
Con riferimento al grafico in figura, consideriamo il caso generico
di un programma composto da più moduli sorgenti (nel nostro esempio
MS1, MS2, MS3).
La prima fase cui vengono sottoposti i moduli sorgenti è
la traduzione, con la quale si ottengono dei moduli oggetto
(MO1, MO2, MO3 in figura), che costituiscono una rappresentazione
del programma in codice macchina.
Al fine di costituire un programma unico, questi moduli dovranno
essere sottoposti ad unoperazione di collegamento,
che associa i vari riferimenti e le definizioni tra i simboli generando
un codice rilocabile.
Infine, per ottenere il programma eseguibile vero e proprio
può essere necessaria unulteriore operazione di rilocazione,
che modifica i riferimenti alle locazioni di memoria per tenere
conto del precedente collegamento.
Infatti, durante la prima traduzione dei moduli, ogni riferimento
alla memoria è fatto presupponendo che il modulo verrà caricato
in memoria principale a partire dallindirizzo 0.
Durante la fase di collegamento i moduli vengono posti luno
dopo laltro, per cui se anche tale assunzione fosse vera per
il modulo 1, non lo sarà sicuramente per gli altri due moduli.
Nelles. in figura il modulo MO2 inizia a partire dallindirizzo
1024 e il modulo MO3 a partire dallindirizzo 2048 e la rilocazione
è necessaria per aggiornare i riferimenti contenuti in MO2 e MO3,
sommando agli indirizzi generati in MO2 il valore 1024 e a quelli
presenti in MO3 il valore 2048.
Il file eseguibile così prodotto viene memorizzato nel file system
e può essere invocato in qualsiasi momento da un utente per eseguire
il proprio programma.
Poiché lesecuzione di un programma richiede che esso sia presente
almeno parzialmente in memoria principale, occorre innanzitutto
caricare il programma in memoria, e ciò può essere fatto in due
modi:
- caricamento statico: se il programma viene caricato per
intero e rimane in memoria fino al suo completamento;
- caricamento dinamico: se il programma (o sue parti, come
segmenti o pagine) possono essere caricati e scaricati più volte
dalla memoria durante la sua esecuzione.
Nella maggioranza dei computer di ultima generazione si effettua
quasi esclusivamente il caricamento dinamico.
I programmi eseguibili sono a loro volta rilocabili e la rilocazione
dinamica viene affidata a meccanismi hardware (come la MMU) per
tradurre gli indirizzi a tempo di esecuzione.
Torna all'indice Generale del corso di Corso di Sistemi Operativi di Software Planet