Corso di Sistemi Operativi

Programmi e processi

 

Dopo aver dato uno sguardo all’interno 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 :-).

All’inizio del corso abbiamo appreso che un SO astrae dall’hardware fornendo all’utente, sia esso semplice utilizzatore o programmatore, un’interfaccia 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 dell’hardware, 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.
L’introduzione di uno strato software tra l’hardware e i programmi utente e l’avvento 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 un’operazione 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 un’ulteriore 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 dall’indirizzo 0.
Durante la fase di collegamento i moduli vengono posti l’uno dopo l’altro, per cui se anche tale assunzione fosse vera per il modulo 1, non lo sarà sicuramente per gli altri due moduli.
Nell’es. in figura il modulo MO2 inizia a partire dall’indirizzo 1024 e il modulo MO3 a partire dall’indirizzo 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é l’esecuzione 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