![Page 1: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/1.jpg)
Corso di Programmazione di Sistema
Anno accademico 2007/2008
Presentazione del corso
Umberto Villano, 10 Ottobre 2007
![Page 2: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/2.jpg)
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.
![Page 3: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/3.jpg)
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.
![Page 4: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/4.jpg)
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
![Page 5: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/5.jpg)
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
![Page 6: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/6.jpg)
Inserimento nel piano di studi
T e cnologie diproduz ione de l
software
Lingua ggi d iP rogra m m a z ione
SistemiOperativi
Elementi diInformatica
P rogra m m a z ione
P rogra m m a z ionedi siste m a
CalcolatoriElettronici
Reti diCalcolatori
Basi di Dati
Reti logicheT e cnologie
software pe r ilWEB
P rim o an no S e co n d o a n n o T e rz o a n n o
![Page 7: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/7.jpg)
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.
![Page 8: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/8.jpg)
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...
![Page 9: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/9.jpg)
Altri contenuti• http://csapp.cs.cmu.edu/
![Page 10: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/10.jpg)
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
![Page 11: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/11.jpg)
Grande realtà #1Gli 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
![Page 12: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/12.jpg)
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”
![Page 13: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/13.jpg)
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
![Page 14: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/14.jpg)
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
![Page 15: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/15.jpg)
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);}
Alpha MIPS Sun
-g 5.30498947741318e-315 3.1399998664856 3.14
-O 3.14 3.14 3.14
![Page 16: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/16.jpg)
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
![Page 17: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/17.jpg)
Esempio di Prestazioni della Memoria
Implementazioni della Moltiplicazione di Matrici– Più modi alternativi di innestare i loop
/* ijk */for (i=0; i<n; i++) { for (j=0; j<n; j++) { sum = 0.0; for (k=0; k<n; k++) sum += a[i][k] * b[k][j]; c[i][j] = sum; }}
/* jik */for (j=0; j<n; j++) { for (i=0; i<n; i++) { sum = 0.0; for (k=0; k<n; k++) sum += a[i][k] * b[k][j]; c[i][j] = sum }}
![Page 18: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/18.jpg)
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
![Page 19: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/19.jpg)
Prest. di Blocked matmult (Alpha 21164)
0
20
40
60
80
100
120
140
160
50 75 100 125 150 175 200 225 250 275 300 325 350 375 400 425 450 475 500
matrix size (n)
bijk
bikj
ijk
ikj
![Page 20: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/20.jpg)
Grande Realtà #4
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
![Page 21: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/21.jpg)
Grande Realtà #5
I computer non si limitano ad eseguire programmi
• Hanno bisogno di portare dati dentro e fuori– Il sistema di I/O è critico per l’affidabilità e le
prestazioni dei programmi
• Comunicano tra di loro su reti– Molti problemi a livello di sistema nascono in presenza
di reti• Operazioni concorrenti effettuate da processi autonomi
• Gestire mezzi di comunicazione inaffidabili
• Compatibilità “cross platform”
• Problemi di prestazioni complessi
![Page 22: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/22.jpg)
A chi è destinato il corso di Programmazione di Sistema
Istituzionalmente destinato agli studenti in corso del Secondo Anno.
![Page 23: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/23.jpg)
Come verrà tenuto il corso
• 8 crediti formativi - 5 ore di corso settimanale nell’ambito del primo semestre (27 Settembre 2005 – 20 Gennaio 2005).
• sono previste tre prove pratiche durante il corso, più un colloquio finale.
La frequenza non e’ obbligatoria, ma è fortemente consigliata
![Page 24: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/24.jpg)
Come verrà tenuto il corso
• Esempi e gli approfondimenti (nonché le tre prove intracorso) basate su processori Intel 386-compatibili che eseguono programmi C sotto il sistema operativo Unix.
• Lo studente deve essere in grado di accedere ad una macchina del genere (ad esempio un PC con Linux), aprendo sessioni e facendo operazioni semplici come cambiare directory, copiare file, ... .
![Page 25: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/25.jpg)
Programma del Corso
• Il linguaggio C
• I sistemi di calcolo dal punto di vista del programmatore
![Page 26: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/26.jpg)
Libri di testo
Per la parte sul linguaggio C:
• B. Kerningham, D. Ritchie, "Il linguaggio C - Seconda Edizione", Pearson Education Italia.
![Page 27: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/27.jpg)
Libri di testo
Per la parte sull'architettura dei sistemi di calcolo dal punto di vista del programmatore:
• R. E. Bryant e D. R. O'Hallaron, "Computer Systems: A Programmer's Perspective", Prentice Hall (2002).
![Page 28: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/28.jpg)
Web page del corsohttp://www.ing.unisannio.it/villano/ps0708
![Page 29: Corso di Programmazione di Sistema Anno accademico 2007/2008](https://reader036.vdocuments.net/reader036/viewer/2022062315/56815181550346895dbfb996/html5/thumbnails/29.jpg)
Aiuto!