Additions:
~~- rappresentazione piramidale di una gerarchia di memoria
~~~- problema del memory wall e rilevanza del caching multi-livello
Deletions:
~~- struttura piramidale per una gerarchia di memoria:
Additions:
==Lunedì 12 dicembre 2016 (90 min)==
~- Come è strutturata la memoria? (parte II) [[[http://www.cs.cmu.edu/~213/lectures/10-memory-hierarchy.pdf ref1]], [[http://www.cs.cmu.edu/~213/lectures/12-cache-memories.pdf ref2]]]
~~- gestione dei write miss: strategie fetch-on-write (write-allocate) e write-no-allocate
~~- struttura piramidale per una gerarchia di memoria:
~~~- registri, cache L1, L2, L3, memoria, storage primario (disco) e secondario (cloud, etc.)
~~~- trasferimento dati a blocchi tra livelli successivi di una memoria gerarchica
~~~- analisi di costo/dimensione/[[https://gist.github.com/hellerbarde/2843375 velocità]] dei livelli di una memoria gerarchica
~~~- caso di studio: Intel Core i7 (L1-I, L1-D, L2, L3)
~~- ottimizzazioni del codice nell'uso della memoria:
~~~- tempo di esecuzione
~~~~- register allocation per sfruttare la velocità dei registri e ridurre il ricorso al register spilling
~~~~- scrittura di codice cache-friendly
~~~~~- ordinamenti row-major e column-major per array multidimensionali (es. matrici)
~~~~~- casi di studio: inizializzazione di una matrice, prodotto tra matrici (varianti del ciclo ijk)
~~~~- accessi a memoria allineati
~~~~~- cenni a problemi prestazionali da accessi non allineati, ruolo del padding
~~~~~- allineamento dei campi delle struct C
~~~~~- stack pointer a 16 byte prima di una call
~~~- spazio
~~~~- ridurre la dimensione dei dati: riordinare le struct per ridurre il padding
~~~~- ridurre la dimensione del codice: rimpiazzo di istruzioni con altre che richiedono meno byte (es. movl $1, D -> incl D)
Additions:
~~~- livelli di caching multipli
Additions:
==Lunedì 5 dicembre 2016 (90 min)==
~- Come è strutturata la memoria? (parte I) [[[http://www.cs.cmu.edu/~213/lectures/10-memory-hierarchy.pdf ref1]], [[http://www.cs.cmu.edu/~213/lectures/12-cache-memories.pdf ref2]]]
~~- astrazione con modello lineare
~~- transazioni di lettura e scrittura: configurazione del bus, trasferimenti da CPU a memoria e viceversa
~~- divario tra velocità CPU (cycle time) e velocità accesso a memoria, evoluzione del trend
~~- principio di località, località spaziale e temporale
~~- caching come strategia di duplicazione della memoria oppure per memorizzare risultati di computazioni ricorrenti
~~- cache come buffer per compensare divario tra velocità di processamento e velocità di accesso ai dati sfruttando il principio di località
~~~- partizionamento in blocchi, dimensione blocco (linea di cache), cache hit e cache miss, cenni a strategia di replacement
~~~- esempi di analisi: somma degli elementi di un array, scansione lineare di un array vs. lista collegata
~~~- gestione delle scritture: strategie write-back e write-through
~~- altri usi delle cache in un sistema di calcolo (es. disco, browser)
Additions:
==Giovedì 1 dicembre 2016 (180 min)==
~- Esecuzione simultanea di più processi (parte II):
~~- approcci alternativi per I/O: busy waiting, polling tra più dispositivi
~~- system call per il controllo dei processi:
~~~- creazione (##fork##) ed effetti su immagine del processo e descrittori
~~~- terminazione, differenze tra libc ##exit(3)## e system call ##_exit(2)##
~~~- attesa terminazione (##wait##), macro per manipolazione exit status (##WEXITSTATUS##, ##WIFEXITED##)
~~~- sostituzione immagine di un processo con [[http://pubs.opengroup.org/onlinepubs/009695399/functions/exec.html exec]] (versioni ##execv## ed ##execvp##)
~~- meccanismo dei segnali
~~~- principi, signali sincroni ed asincroni, segnali POSIX più comuni
~~~- signal handler, blocco di un segnale
~~~- system calls ##sigaction(2)## e ##kill(2)##, campi di ##struct sigaction## e prototipo di un signal handler, funzione di libreria ##raise(3)##
~~~- esempio: cattura di ##SIGCHLD## per attesa asincrona della terminazione di un processo figlio
Additions:
~~- processo ##init##, albero dei processi e comando ##pstree##
Deletions:
~~- ##init##, albero dei processi e comando ##pstree##
Additions:
~~- comandi ##ps## e ##top## per analizzare i processi
~~- ##init##, albero dei processi e comando ##pstree##
Deletions:
~~- uso dei comandi ##ps## e ##top## per analizzare i processi
~~- albero dei processi, comando ##pstree##
Additions:
==Venerdì 25 novembre 2016 - Coppa/D'Elia/Demetrescu==
==Lunedì 28 novembre 2016 (90 min)==
~- Esecuzione di un processo (parte IV):
~~- stati di un processo: running user, running kernel, blocked (detto anche waiting o sleeping)
~- Esecuzione simultanea di più processi (parte I):
~~- nozione di esecuzione concorrente
~~- astrazioni offerte da un processo: control flow logico, spazio di indirizzamento privato
~~- multiprogrammazione e scheduling dei processi: [[[https://www.cs.cmu.edu/afs/cs/academic/class/15213-f10/www/lectures/12-exceptions.pdf ref]]]
~~~- context switch: salvataggio dello stato della CPU nel PCB
~~~- ulteriori stati di un processo: started, ready, zombie ([[http://www.linux-tutorial.info/modules.php?name=MContent&pageid=84 diagramma degli stati in Linux]])
~~~- principi di fairness e di balance per uno scheduler
~~~- esempio del time sharing round-robin mediante timer e interrupt
~~~- cenni allo scheduling con priorità
~~- uso dei comandi ##ps## e ##top## per analizzare i processi
~~- albero dei processi, comando ##pstree##
Deletions:
==Venerdì 25 ottobre 2016 - Coppa/D'Elia/Demetrescu==
Additions:
~~- cenni alla semantica di basso livello di ##INT## ed ai suoi usi (es. programmi MS-DOS, software breakpoint nei debugger)
==Venerdì 25 ottobre 2016 - Coppa/D'Elia/Demetrescu==
~- Prova intermedia di esonero
Deletions:
~~- cenni alla semantica di basso livello per ##INT## ed ai suoi usi (es. programmi MS-DOS, software breakpoint nei debugger)
Additions:
~~- cenni alla semantica di basso livello per ##INT## ed ai suoi usi (es. programmi MS-DOS, software breakpoint nei debugger)
Deletions:
~~- cenni alla semantica di ##INT## ed ai suoi usi (es. programmi MS-DOS, software breakpoint nei debugger)
Additions:
~~- cenni alla semantica di ##INT## ed ai suoi usi (es. programmi MS-DOS, software breakpoint nei debugger)
Deletions:
~~- cenni alla semantica di ##INT## ed ai suoi usi (es. nei debugger e storicamente nei programmi MS-DOS)
Additions:
~~- eccezioni in IA32: Interrupt Descriptor Table (IDT)
~~- cenni alla semantica di ##INT## ed ai suoi usi (es. nei debugger e storicamente nei programmi MS-DOS)
Deletions:
~~- eccezioni in IA32: Interrupt Descriptor Table (IDT), cenni alla semantica dell'istruzione ##INT## ed ai suoi usi (es. nei debugger e storicamente nei programmi MS-DOS)
Additions:
~~- OS e tabella delle eccezioni (interrupt vector), ruolo degli interrupt handler
Deletions:
~~- OS e tabella delle eccezioni (interrupt vector), concetto di interrupt handler
Additions:
~~- OS e tabella delle eccezioni (interrupt vector), concetto di interrupt handler
~~- eccezioni in IA32: Interrupt Descriptor Table (IDT), cenni alla semantica dell'istruzione ##INT## ed ai suoi usi (es. nei debugger e storicamente nei programmi MS-DOS)
Deletions:
~~- OS e tabella delle eccezioni (interrupt vector), interrupt handler
~~- tabella delle eccezioni IA32: Interrupt Descriptor Table (IDT), cenni alla semantica dell'istruzione ##INT## ed ai suoi usi (es. nei debugger e storicamente nei programmi MS-DOS)
Additions:
~~~- trap: istruzione IA32 ##INT##, invocazione di system call (##INT 0x80##, passaggio dei parametri, esempio con ##write##) [[[https://en.wikibooks.org/wiki/X86_Assembly/Interfacing_with_Linux ref3]]]
Deletions:
~~~- trap: istruzione IA32 ##INT##, invocazione di system call (##INT 0x80##, passaggio dei parametri, esempio con ##write##) [[[https://en.wikibooks.org/wiki/X86_Assembly/Interfacing_with_Linux ref]]]
Additions:
==Martedì 4 ottobre 2016 (90 min)==
==Giovedì 6 ottobre 2016 (180 min)==
==Lunedì 10 ottobre 2016 (90 min)==
==Giovedì 13 ottobre 2016 (180 min)==
==Lunedì 17 ottobre 2016 (90 min)==
==Giovedì 20 ottobre 2016 (180 min)==
==Lunedì 24 ottobre 2016 (90 min)==
==Giovedì 27 ottobre 2016 (180 min) ==
==Giovedì 3 novembre 2016 (180 min)==
==Lunedì 7 novembre 2016 (90 min)==
==Giovedì 10 novembre 2016 (180 min)==
==Lunedì 14 novembre 2016 (90 min)==
==Giovedì 17 novembre 2016 (180 min)==
==Lunedì 21 novembre 2016 (90 min)==
~- Esecuzione di un processo (parte II):
~~- architetture superscalari, pipelining, hazard (strutturali, dati, controllo) e stalli (bubbles)
~~- cenni ad architetture CISC e RISC, pipeline RISC a 5 stadi, concetto di branch prediction
~~- ottimizzazioni del codice sfruttando la pipeline: istruzioni branchless, instruction scheduling
~~~- esempi svolti: massimo tra due interi con CMOV, valore assoluto di un intero con CMOV e in variante senza uso di condition code
~~- cenni ad esecuzione parallela: CPU multicore e instruction-level parallelism (SIMD ed estensioni MMX/3DNow!/SSE/AVX)
~~- esecuzione in modalità utente (user) e in modalità supervisore (kernel): concetto di ring ed operazioni privilegiate
==Giovedì 24 novembre 2016 (180 min)==
~- Esecuzione di un processo (parte III): [[[https://www.cs.cmu.edu/afs/cs/academic/class/15213-f10/www/lectures/12-exceptions.pdf ref1]], [[https://www.cs.columbia.edu/~junfeng/11sp-w4118/lectures/trap.pdf ref2]]]
~~- flusso del controllo normale ed eccezionale, stato del programma vs. stato del sistema
~~- eccezioni sincrone (interne):
~~~- distinzione concettuale: eccezioni intenzionali e non, recuperabili e non
~~~- trap: istruzione IA32 ##INT##, invocazione di system call (##INT 0x80##, passaggio dei parametri, esempio con ##write##) [[[https://en.wikibooks.org/wiki/X86_Assembly/Interfacing_with_Linux ref]]]
~~~- fault: es. divisione per zero, accesso a memoria
~~~- abort: es. parity error
~~- eccezioni asincrone (esterne):
~~~- interrupt: dispositivi I/O, timer, ecc
~~~- ruolo del PIC (Programmable Interrupt Controller)
~~~- differenza con interrupt software/trap
~~- OS e tabella delle eccezioni (interrupt vector), interrupt handler
~~- tabella delle eccezioni IA32: Interrupt Descriptor Table (IDT), cenni alla semantica dell'istruzione ##INT## ed ai suoi usi (es. nei debugger e storicamente nei programmi MS-DOS)
Deletions:
==Martedì 4 ottobre 2016 (90 min) - D'Elia==
==Giovedì 6 ottobre 2016 (180 min) - D'Elia==
==Lunedì 10 ottobre 2016 (90 min) - D'Elia==
==Giovedì 13 ottobre 2016 (180 min) - D'Elia==
==Lunedì 17 ottobre 2016 (90 min) - D'Elia==
==Giovedì 20 ottobre 2016 (180 min) - D'Elia==
==Lunedì 24 ottobre 2016 (90 min) - D'Elia==
==Giovedì 27 ottobre 2016 (180 min) - D'Elia ==
==Giovedì 3 novembre 2016 (180 min) - D'Elia ==
==Lunedì 7 novembre 2016 (90 min) - D'Elia ==
==Giovedì 10 novembre 2016 (180 min) - D'Elia ==
==Lunedì 14 novembre 2016 (90 min) - D'Elia ==
==Giovedì 17 novembre 2016 (180 min) - D'Elia ==
Additions:
~~- Svolgimento esercizio tipologia esame su ottimizzazione: analisi con gprof e time dei tempi di esecuzione, creazione di una copia ##static## di un metodo definito altrove (ovvero in un altro file) per automatizzare l'inlining
Deletions:
~~- Svolgimento esercizio tipologia esame su ottimizzazione: analisi con gprof e time dei tempi di esecuzione, creazione di una copia ##static## locale di un metodo definito altrove (ovvero in un altro file) per automatizzare l'inlining
Additions:
~- Panoramica su servizi più comuni offerti da un OS: esecuzione di programmi, operazioni di I/O, manipolazione del filesystem, comunicazione tra processi, gestione risorse, protezione e gestione errori
~~- file descriptor, descrittori standard, apertura di un file descriptor con ##open()## e possibili flags, differenze tra ##int fd## e ##FILE*## da ####
==Giovedì 17 novembre 2016 (180 min) - D'Elia ==
~- Lettura da descrittore con ##read()##, scheletro ciclo per lettura fino ad ##EOF##
~- Scrittura su descrittore con ##write()##, scheletro ciclo per scrittura con gestione scritture parziali
~- Chiusura di un descrittore con ##close()##
~- Definizione di processo, concetto di PID (Process ID) e di PCB (Process Control Block)
~- Elementi di un PCB: PID, PID del genitore, fotografia del processore, informazioni di memory management, accounting (es. tempo di CPU consumato), priorità nello scheduling, risorse I/O (es. tabella dei descrittori)
~- Ruolo del loader e task svolti dal loader Linux: validazione, copia dell'immagine in memoria, copia di argomenti/variabili d'ambiente e impostazione registri, trasferimento controllo a ##_start()##
~- Struttura di memoria di un processo
~~- Sezioni base: text, data, heap, stack
~~- Boundaries di stack e heap (cenno a ##sbrk## e uso negli allocatori)
~~- Ulteriori sezioni: rodata, bss
~~- Storage delle variabili: static variables in data o bss, letterali stringa in rodata, variabili locali in stack, memoria allocata dinamicamente in heap
~- Esecuzione di un processo (parte I)
~~- Fetch-decode-execute e definizione di ciclo macchina (o instruction cycle)
~~- Ciclo di clock e relazione con ciclo macchina
~~- Aspetti prestazionali
~~~- Approccio di ottimizzazione: riduzione del numero di cicli di clock richiesti per eseguire il codice
~~~- Metriche IPC (instructions per cycle), IPS (instructions per second), CPI (cycles per instruction)
~~~- Time Stamp Counter (TSC) ed istruzione RDTSC con memorizzazione del risultato usando due registri
~~~- Hardware counters, possibili impieghi, tool di profilazione ##perf##
~~- Ottimizzazione: strength reduction ed operator strength reduction, uso di LEA per operazioni matematiche
~- Esempi ed esercizi svolti
~~- Ricerca utilizando una lookup table (calcolo del numero di vocali in una stringa)
~~- Differenze prestazionali tra implementazione ricorsiva e tail-recursive/iterativa nel calcolo del fattoriale
~~- Analisi delle cause degli errori per le system calls: variabile globale ##errno##, funzione ##perror()##
~~- Implementazione del comando ##cat## utilizzando read() e write()
~~- Redirezione di stdin/stdout/stderr manipolando la tabella dei descrittore
~~- Svolgimento esercizio tipologia esame su ottimizzazione: analisi con gprof e time dei tempi di esecuzione, creazione di una copia ##static## locale di un metodo definito altrove (ovvero in un altro file) per automatizzare l'inlining
Deletions:
~- Servizi più comuni offerti da un OS: esecuzione di programmi, operazioni di I/O, manipolazione del filesystem, comunicazione tra processi, gestione risorse, protezione e gestione errori
~~- file descriptor, descrittori standard, apertura di un file descriptor con ##open()## e relative opzioni, differenze tra ##int fd## e ##FILE*## da ####
Additions:
==Lunedì 14 novembre 2016 (90 min) - D'Elia ==
~- Sistema operativo come:
~~- ambiente per consentire l'utilizzo del calcolatore da parte degli utenti
~~- ambiente di esecuzione per i programmi, fornendo risorse e servizi
~- Tipologie di OS: batch, time-sharing, real time, altro
~- Funzioni del sistema operativo
~~- Management (CPU, memoria, dispositivi, filesystem)
~~- Coordinazione tra software e tra utenti
~~- Gestione dei job
~~- Aspetti legati alla sicurezza
~- Servizi più comuni offerti da un OS: esecuzione di programmi, operazioni di I/O, manipolazione del filesystem, comunicazione tra processi, gestione risorse, protezione e gestione errori
~- Servizi OS dal punto di vista dell'utente
~~- utility per navigazione e manipolazione del filesystem
~~- esecuzione comandi: CLI (command line interface) vs GUI (graphical user interface) -> shell vs ambiente grafico
~~- utenze e permessi
~~- canali I/O
~~- variabili d'ambiente
~- Servizi OS dal punto di vista del programmatore
~~- passaggio degli argomenti con ##argc## e ##argv##
~~- exit status: ##exit()## vs ##return##
~~- kernel e servizi forniti: system calls (POSIX standard)
~~- differenza tra librerie e system calls
~~- accesso e manipolazione variabili d'ambiente: ##getenv()## e ##setenv()##
~~- file descriptor, descrittori standard, apertura di un file descriptor con ##open()## e relative opzioni, differenze tra ##int fd## e ##FILE*## da ####