Newest Viewed Downloaded

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

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

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

Showing 1 - 20 of 29 items Details

Name: 
Corso di Programma...
Author: 
N/A
Company: 
N/A
Description: 
Corso di Programmazione di Sistema  Anno accademico 2005/2006Presentazione del corso Umberto Villano, 29 Settembre 2005
Tags: 
corso | programmi | sistema | prestazioni | memoria | linguaggio | programmazione | sistemi
Created: 
9/26/2005 5:32:51 PM
Slides: 
29
Views: 
10
Downloads: 
2
Rating: 
0


> Comment



Share this presentation
|

Comments

Share this presentation:

|
Sitemap