Vai alla Home Page About me Courseware Federica Living Library Federica Federica Podstudio Virtual Campus 3D La Corte in Rete
 
Il Corso Le lezioni del Corso La Cattedra
 
Materiali di approfondimento Risorse Web Il Podcast di questa lezione

Salvatore Cuomo » 2.Sistemi Operativi – parte prima


Un po’ di storia (anni ‘40-’50)

Con il consolidamento del concetto di Esecutore di Algoritmi e con l’avvento della Macchina di Von Neumann si fa strada l’idea di formalizzare i passi necessari alla risoluzione di un problema seguendo uno specifico piano di lavoro ovvero un dato programma.

I passi principali si possono così schematizzare:

  1. preparare un programma in un linguaggio “parlato” dalla macchina
  2. registrare i dati e le direttive (istruzioni) da eseguire
  3. rendere “eseguibile” il programma
  4. leggere il risultato fornito dal programma presente nella memoria
Figura 1: La macchina di Von Neumann. Fonte: Wikipedia

Figura 1: La macchina di Von Neumann. Fonte: Wikipedia


Un po’ di storia (anni ‘40-’50) (segue)

Il programma veniva scritto in un linguaggio comprensibile all’elaboratore detto linguaggio macchina. La sua trascrizione era effettuata su delle schede perforate mediante apposite macchine perforatrici e letta da appositi lettori.

In particolare:

  • Le schede perforate sono lette da apposito dispositivo detto: lettore di schede.
  • il programma viene inviato dal lettore di schede alla memoria del calcolatore. Nasce l’esigenza di avere “precaricati” sull’elaboratore un programma caricatore o loader a cui viene demandato a questo compito.
  • il risultato viene trasferito in uscita mediante la scrittura di altre schede perforate utilizzando una macchina perforatrice.
Schede perforate e relativo lettore

Schede perforate e relativo lettore

Lettore di schede perforate. Fonte: Wikipedia.

Lettore di schede perforate. Fonte: Wikipedia.


Un po’ di storia (anni ‘40-’50) (segue)

Schema sintetico di esecuzione di un programma.

Schema sintetico di esecuzione di un programma.


Sistema Operativo (embrione)

Un utilizzatore del calcolatore, per poter richiamare il proprio programma nella memoria, in prima istanza deve caricare in memoria il loader.
In sintesi:

  • Il loader è uno strumento di utilità (utility) comune a tutti i programmi scritti dall’utente (programmi utente).
  • La presenza di un programma loader che è fruibile da tutti gli utenti di un elaboratore costituì il primo embrione di sistema operativo.

Quello riportato è il primo esempio di programma non scritto dall’utente ma messo a disposizione per l’utilizzo efficace della macchina.

Embrione di sistema operativo.

Embrione di sistema operativo.


Un po’ di storia (anni ‘50-’60) (segue)

Verso la fine degli anni ‘50 il linguaggio macchina ostico per molti programmatori e prolisso nella descrizione di un programma viene sostituito da un linguaggio più vicino a quello naturale detto linguaggi ad alto livello.

Nasce l’esigenza di sviluppare dei programmi che avessero il compito di trasformare il programma scritto in un linguaggio ad alto livello con quello scritto in linguaggio macchina.

Tali strumenti vennero detti: programmi traduttore.

Programma traduttore e schema di sistema operativo.

Programma traduttore e schema di sistema operativo.


Un po’ di storia (anni ‘50-’60) (segue)

Il programma traduttore risulta essere una nuova un nuovo strumento a disposizione del programmatore.

L’utilizzo efficiente delle risorse di calcolo deve tenere conto di esigenze molteplici. A tale fine si riporta un esempio.

Esempio: Nell’utilizzo ordinario del calcolatore è necessario eseguire una istruzione di stampa, e contestualmente fare in modo che la CPU resta attiva.
Soluzione: Avere a disposizione un dispositivo aggiuntivo in grado di controllare esclusivamente le operazioni di I/O.

Tale dispositivo è detto canale di I/O.
A livello di programmi di utilità è necessario avere uno strumento che sincronizzi le operazioni di I/O sul canale e la CPU.

Schema di un canale di I/O

Schema di un canale di I/O


Sistema Operativo (embrione)

Embrione di sistema operativo.

Embrione di sistema operativo.


Un po’ di storia (anni ‘60-’70) (segue)

L’introduzione dei canali di I/O introduce la necessità di un utilizzo contestuale e/o contemporaneo della CPU da parte di diversi programmi in esecuzione sul calcolatore.

Nasce un nuovo concetto di programmazione quello della Multiprogrammazione.
In particolare per multiprogrammazione si intende la possibilità di un sistema operativo di gestire più programmi che utilizzano la CPU.

Tempo di esecuzione.

Tempo di esecuzione.


Multiprogrammazione e Time Sharing

Problema:

  1. se un programma effettua una operazione di I/O, l’utilizzo della CPU passa ad un altro programma.
  2. i programmi che sono in coda attendono periodi di tempo più lunghi per effettuare una istruzione di I/O rispetto al programma che sta utilizzando la CPU.

Soluzione (time sharing): Ovvero ad ogni programma viene dato un fissato tempo massimo per l’uso della CPU. Tale tempo viene detto time slice

In figura viene riportato un esempio di multiprogrammazione con time sharing il cui tempo di time slice è pari a 3 unita’.

Nell’esempio si evince che il programma 2 attende solo 3 unità di tempo prima di utilizzare la CPU con una rispettiva riduzione dei tempi di attesa.

Esempio di time sharing.

Esempio di time sharing.


Multiprogrammazione e Monitoring

Ogni programma può utilizzare la CPU fin quando non si verifica una delle seguenti condizioni:

  1. il programma è terminato;
  2. il programma si trova in uno stato di errore (è avvenuta una divisione per zero, accesso illegale alla memoria, …);
  3. viene richiesta una operazione di di I/O;
  4. è scaduto il tempo ad esso assegnato.

Nelle prime due situazioni il programma viene eliminato dalla memoria
Nelle ultime due il programma viene sospeso

Da quanto allora osservato si ha che la multiprogrammazione con il time sharing determinano la necessità della la presenza di un opportuno programma in grado di garantire la corretta sospensione e l’eventuale ripresa dei programmi nella CPU. Tale programma è detto Monitor.

Multiprogrammazione e Monitoring

Vediamo nel dettagli cosa deve di base fare un programma Monitor.
I punti essenziali sono:

  1. La capacità di conservare tutte le informazioni relative allo stato del programma che deve essere sospeso. Tali informazioni devono essere sufficienti a garantire una corretta ripresa della esecuzione.
  2. La possibilità di decidere a quale tra i programmi che sono in attesa di essere eseguiti si deve passare il controllo
  3. La capacità di interrompere, qualora sia necessario, l’esecuzione del programma e di consentire l’esecuzione il nuovo programma.

Al fine di stabilire quale dei programmi in esecuzione passare in memoria quando altri programmi attendono di essere esguiti, bisogna individuare un ordine di accesso alla CPU.

La presenza di un strumento in grado di stabilire tale ordine è: lo Scheduler. Esso assegna ad ogni programma un numero di priorità che è il criterio di precedenza rispetto all’utilizzo della CPU.
In particolare i programmi che:

  • necessitano di poca memoria e poco tempo di CPU hanno priorità piú alta;
  • sono di sistema hanno priorità piú alta rispetto a quelli di utente.

Sistema Operativo (embrione)

Embrione di sistema operativo.

Embrione di sistema operativo.


Sistema Operativo

Quanto detto porta alla seguente definizione.

Definizione

Un Sistema Operativo è l’insieme di tutti gli strumenti (programmi)
che consentono il controllo e la gestione delle diverse risorse di
un elaboratore.

In sintesi:

Hardware + Sistema Operativo costituiscono il Software di Sistema ovvero quella che in gergo viene detta la macchina virtuale.

La programmazione: i linguaggi

Verso la fine degli anni ‘50 il linguaggio macchina ostico per molti programmatori e prolisso nella descrizione
di un programma viene sostituito da linguaggi ad alto livello.

  • Le principali caratteristiche sono:
  • La”somiglianza” al linguaggio naturale.
  • Maggiore metodologia nella formalizzazione dei concetti
  • Maggiori possibilità nella programmazione

Alcuni linguaggi di programmazione

  • C
  • C#
  • C++
  • Pascal
  • Basic
  • Fortran 77/90/95
  • Phyton
  • Matlab
  • Java
  • …..
Statistica sull’utilizzo di alcuni linguaggi di porgrammazione aggiornata a Settembre 2009 Tiobe.

Statistica sull'utilizzo di alcuni linguaggi di porgrammazione aggiornata a Settembre 2009 Tiobe.


Alcuni linguaggi di programmazione

L’uso di un linguaggio di programmazione ad alto livello è reso possibile da particolari strumenti detti Programmi Traduttori che traducono un programma scritto in un linguaggio ad alto livello in un programma scritto in un linguaggio macchina.

I programmi traduttori possono essere suddivisi principalmente in due categorie:

  • Programmi traduttore Compilatori
  • Programmi traduttori Interpreti

Interprete

Descriviamo molto in generale come lavoro un programma di tipo interprete:

  • prende in ingresso una istruzione di un programma scritto in un linguaggio ad alto livello ed i dati che sono coinvolti in tale istruzione.
  • fornisce in uscita, traducendo in maniera diretta, il risultato dell’esecuzione della istruzione.
Interprete.

Interprete.


Compilatore

Descriviamo molto in generale come lavoro un programma di tipo Compilatore. Questo tipo di strumento organizza la “costruzione” di un programma eseguibile in fasi disistinte.

Nella prima Fase:

  • prende in ingresso il programma scritto nel linguaggio ad
    alto livello.
  • fornisce in uscita un programma “tradotto”
    nel linguaggio macchina

Nella seconda Fase

  • Il programma scritto in linguaggio macchina, a cui vengono dati in ingresso i dati, viene eseguito e restituisce i risultati attesi.
Compilazione. Fonte: Wikipedia

Compilazione. Fonte: Wikipedia


Compilatore

Come prima osservazione ci si rende conto che per un programma di tipo compilatore
esiste una distinzione tra:
Codice Sorgente

Ovvero un programma scritto in un qualsiasi linguaggi ad alto livello che è il dato di ingresso del programma di tipo compilatore
Codice Oggetto

Ovvero il programma tradotto in linguaggio macchina che è fornito in uscita dal compilatore e d è pronto per essere “eseguito”.

E’ necessario dunque per procedere in tale modo un traduzione automatica del codice sorgente in codice oggetto e successivamente in programma eseguibile. Bisogna allora definire:

  • quando una frase del programma appartiene al linguaggio, ovvero definizione sintattica.
  • il significato di ciascuna frase del linguaggio, la definizione semantica, con le correlazioni che esistono tra le varie frasi del linguaggio.

Compilatore o Interprete

Facciamo un brevissima analisi comparativa tra i differenti programmi di traduzione.

Per l’Interprete

il programma scritto in un linguaggio ad alto livello è sempre sotto controllo, nel senso che eventuali errori di tipo di sintattico o semantico vengono segnalati immediatamente. Ciò comporta generalmente una dispendio di memoria.

Per il Compiltore
Le diverse fasi di traduzione con la generazione del codice oggetto ed il linking con la generazione del codice eseguibile sono logicamente e nel tempo delle fasi distinte. Una volta corretti eventuali errori di carattere semantico o sinattico nella programmazione dsi ha a disposizione un codice eseguibile che puo’ essere “lanciato” diverse volte senza dispendio di tempo e memoria ggiuntiva.

Schematicamente si può affermare che:

  • Il programma di tipo compilatore è generalmente più efficiente
  • Quello di tipi interprete è generalmente più flessibile

I materiali di supporto della lezione

Testi Consigliati

Per un approfondimento sugli argomenti trattati si consiglia di leggere:

(a) A. Murli, G. Giunta, G. Laccetti, M. Rizzardi – Laboratorio di Programmazione I – Ed. Liguori

(b) G. Criscuolo, F. Tramontano, Introduzione alla programmazione. Algoritmi iterativi in C++. Ed. Manna

  • Contenuti protetti da Creative Commons
  • Feed RSS
  • Condividi su FriendFeed
  • Condividi su Facebook
  • Segnala su Twitter
  • Condividi su LinkedIn
Progetto "Campus Virtuale" dell'Università degli Studi di Napoli Federico II, realizzato con il cofinanziamento dell'Unione europea. Asse V - Società dell'informazione - Obiettivo Operativo 5.1 e-Government ed e-Inclusion

Fatal error: Call to undefined function federicaDebug() in /usr/local/apache/htdocs/html/footer.php on line 93