Corso di Programmazione di Sistema Anno accademico 2005/2006Presentazione del corso
Umberto Villano, 29 Settembre 2005
Corso di Programmazione di Sistema Anno accademico 2005/2006
Presentazione del corso
Umberto Villano, 29 Settembre 2005
Descrizione del corso
Destinato a studenti con precedente esperienza di programmazione in un linguaggio ad alto livello orientato agli oggetti.
Si propone innanzitutto di introdurre l’uso del linguaggio C (e delle librerie di sistema Unix).
Obiettivo successivo: migliorare le capacità di programmazione, mostrando cosa avviene all’interno di un sistema di calcolo durante l’esecuzione di un programma.
Descrizione del corso
Spiegati i concetti fondamentali dell’architettura e del funzionamento dei sistemi di calcolo, mostrando come essi hanno influenza sulla correttezza, le prestazioni e l’utilità dei programmi applicativi.
In conclusione: il corso verte su alcuni argomenti che hanno un valore immediato per lo studente come programmatore, insieme ad altri che possono essere utili per eventuali corsi avanzati di compilatori, architettura dei sistemi di calcolo, sistemi operativi, reti di calcolatori.
Obiettivi del corso
fornire una conoscenza del linguaggio C e del suo utilizzo in un ambiente di programmazione Unix
dare una vista di dettaglio di alcune fondamentali funzioni di un sistema operativo dal punto di vista del programmatore
dare nozioni dettagliate sull’architettura ed il funzionamento interno dei sistemi di calcolo che siano di immediato interesse per il programmatore, in maniera da fornirgli tutte le conoscenze e gli strumenti per la scrittura di programmi corretti ed efficienti
Prospettiva del Corso
P.S. è un corso Programmer-Centric
Lo scopo è mostrare che conoscendo di più sul funzionamento del sistema si possa essere più efficace come programmatore
Rendervi capaci di
Scrivere programmi più affidabili ed efficienti
Incorporare caratteristiche che richiedono di agganciarsi al S.O.
E.g., concorrenza, handler dei segnali
Non è solo un corso per hacker dedicati
Portare fuori l’hacker nascosto che è in voi
Coprire materiale che non sarebbe trattato altrove
Inserimento nel piano di studi
Perché il corso di Programmazione di Sistema
A partire dall’a. a. 2000/2001, nei corsi di Fondamenti di Informatica del Corso di Laurea in Ingegneria Informatica (ora corsi di Programmazione) e’ stato adottato il linguaggio Java.
Inserire nel manifesto un corso che, partendo dal linguaggio C, recepisse alcuni degli argomenti precedente trattati nei corsi di Sistemi Operativi con un approccio orientato alla programmazione.
Altri contenuti
Far capire nel dettaglio allo studente cosa succede durante l’esecuzione dei propri programmi, in modo che abbia a disposizione tutti i concetti e i tool che possono servire qualora (come accade praticamente sempre) qualcosa nei suoi programmi non funziona a dovere.
Questo richiede quindi di scendere di livello rispetto ai tradizionali corsi di programmazione, e di trattare, tra le varie cose, argomenti quali la programmazione in linguaggio macchina, spesso esclusi dai percorsi formativi dell’ingegnere informatico.
Un libro da poco pubblicato sull’argomento...
Altri contenuti
http://csapp.cs.cmu.edu/
L’astrazione va bene, ma non dimenticate la realtà!
Tipicamente i corsi enfatizzano l’astrazione
Tipi di dato astratto
Analisi asintotica
Queste astrazioni hanno dei limiti
Specialmente in presenza di bug
E’ necessario comprendere le implementazioni usate
Risultati utili
Divenire programmatori più efficienti
Essere in grado di trovare ed eliminare i bug più efficientemente
Essere in grado di ottimizzare le prestazioni dei programmi
Prepararsi per corsi successivi “di sistema”
Compilatori, Sistemi Operativi, Reti, Calcolatori
Grande realtà #1
Gli Int’s non sono Interi, i Float non sono Reali
Esempi
E’ x2 ≥ 0?
Float’s: Si!
Int’s:
65535 * 65535 --> -131071 (On most machines)
65535L * 65535 --> 4292836225 (On Alpha)
E’ (x + y) + z = x + (y + z)?
Unsigned & Signed Int’s: Si!
Float’s:
(1e10 + -1e10) + 3.14 --> 3.14
1e10 + (-1e10 + 3.14) --> 0.0
Aritmetica dei Calcolatori
Non genera numeri “a caso”
Le operazioni aritmetiche hanno importanti proprietà matematiche
Non si possono assumere proprietà “usuali”
A causa delle rappresentazioni finite
Le operazioni intere soddisfano le proprietà di “anello” (di solito)
Commutativa, associativa, distributiva
Le operazioni floating point soddisfano proprietà “di ordinamento”
Monotonicità, valori dei segni
Osservazione
Occorre capire quali astrazioni si applicano in ogni contesto
Problemi importanti per chi scrive compilatori e per i programmatori di applicazioni “serie”
Grande realtà #2
C’è bisogno di conoscere il linguaggio assembly
C’è la possibilità che non scriverete mai un programma in assembly
I compilatori sono più bravi e pazienti di voi
Capire l’assembly è la chiave per il modello di esecuzione a livello macchina
Comportamento dei programmi in presenza di bug
il modello di linguaggio ad alto livello non va più bene
Ottimizzazione delle prestazioni dei programmi
Comprendere le cause di inefficienza dei programmi
Implementazione del software di sistema
Il compilatore ha codice macchina come target
I sistemi operativi devono gestire lo stato dei processi
Grande realtà #3
La memoria conta
La memoria non è illimitata
Deve essere allocata e gestita
Molte applicazioni sono dominate dalla memoria
I bug di riferimento alla memoria sono particolarmente insidiosi
I loro effetti possono essere distanti nel tempo e nello spazio
Le prestazioni della memoria non sono uniformi
Cache e memoria virtuale hanno grande impatto sulle prestazioni dei programmi
Adattare i programmi alle caratteristiche del sistema di memoria può portare a significativi incrementi di prestazioni
Esempio di Bug di Riferimento in Memoria
main ()
{
long int a[2];
double d = 3.14;
a[2] = 1073741824; /* Out of bounds reference */
printf("d = %.15g\n", d);
exit(0);
} A lph a M I PS S un -g 5.30498947741318e-315 3.1399998664856 3.14 -O 3.14 3.14 3.14
Errori di Riferimento in Memoria
C e C++ non forniscono nessuna protezione di memoria
Riferimenti ad array “out of bounds”
Valori invalidi di puntatori
Abusi di malloc/free
Può portare a bug particolarmente perniciosi
Il bug può avere effetto o meno a seconda di sistema e compilatore
Azione a distanza
L’oggetto corrotto è logicamente non correlato a quello acceduto
L’effetto del bug può essere osservato molto dopo la sua generazione
Possibili rimedi
Programmare in Java, Lisp, o ML
Capire quali possibili interazioni ci possono essere
Usare o sviluppare tool per rilevare errori di riferimento in memoria
Esempio di Prestazioni della Memoria
/* ijk */
for (i=0; i
Prestazioni di Matmult (Alpha 21164)
0 20 40 60 80 100 120 140 160 matrix size (n) ijk ikj jik jki kij kji Too big for L1 Cache Too big for L2 Cache
Le prestazioni non sono solo complessità asintotica
Anche i fattori costanti contano!
E’ facile osservare prestazioni 10:1 a seconda di come è scritto il codice
Occorre ottimizzare a più livelli: algoritmo, rappresentazione dei dati, procedure, loops
Occorre comprendere il sistema per ottimizzare le prestazioni
Come i programmi sono compilati ed eseguiti
Come misurare le prestazioni dei programmi ed identificare eventuali “bottlenecks”
Come migliorare le prestazioni senza distruggere la modularità e generalità del codice
Copy the following code to your webpage or blog to embed this presentation:
<a href="http://www.slidefinder.net/c/corso_programmazione_sistema_anno_accademico/corsodiprogrammazionedisistema/21317126" class="slidefinder">Corso di Programmazione di Sistema</a>
Comments