Argomenti per le prossime lezioni
Giovedì 15 dicembre 2016 (180 min) - allocazione dinamica e allocazione della memoria fisica
- Come è strutturata la memoria? (parte III)
- Ordine dei byte in memoria (endianness)
- storia e motivazioni, usi attuali (es. network byte order)
- esempi di accesso a singoli byte/word in un dato memorizzato
- Come viene gestita la memoria? [ref1, ref2]
- memoria fisica (gestita dal sistema operativo) e memoria virtuale (visibile ai processi)
- allocazione dinamica della memoria
- frammentazione interna ed esterna
- qualità di un allocatore: tempo e spazio
- allocazione in cascata della memoria
- cenni ad implementazione di un allocatore: malloc/free, sbrk(2)
- allocazione nella memoria fisica: memoria virtuale
- mapping tra indirizzi virtuali e indirizzi fisici: MMU
- paginazione
- come avviene il mapping degli indirizzi logici su quelli fisici?
- quanto spazio occupa una tabella delle pagine?
- paginazione con bit di validità
- page fault memoria virtuale e loro gestione, protection fault (SIGSEGV)
- paginazione con bit di validità e swapping su disco
- working set e thrashing
Venerdì 16 dicembre 2016 (120 min) - esercitazione: ottimizzazioni memoria (cache, ecc.)
Lunedì 19 dicembre 2016 (90 min)
Argomenti non più trattati dopo la fine anticipata del semestre
- caso di studio: Intel Core i7, paginazione a 4 livelli spazio di indirizzi virtuale a 48 bit
- come viene gestita la memoria? (parte II) [ref] -> dettagli sugli allocatori
- complementi su metodologie sperimentali:
- effetti imprevedibili che possono influenzare misurazioni: scheduling dei processi, swapping su disco
- trial, aggregazione (media, varianza), intervallo di confidenza
- pericoli nel trarre conclusioni dagli esperimenti
Argomenti trattati da Daniele ma non da Camil:
- Linguaggi di alto e basso livello
- Compilazione vs. interpretazione, approcci ibridi (compilazione JIT, interpretazione di bytecode)
- Opzione objdump mixed assembly/source
- tool cpp, cc0, as, ld non menzionati esplicitamente
- visione astratta della memoria come array di byte
- massif, clock_gettime, granularità e risoluzione dei timer
- esistenza di calling convention diverse: citare almeno cdecl
- misurazione del tempo speso da un programma:
- hardware counter: RDTSC, perf
- metriche aggregate: cycles per instruction (CPI), instruction per cycle (IPC)
- risoluzione del timer e precisione della misura
- funzioni clock (cross-platform) e clock_gettime (POSIX)
- ottimizzazioni del codice usando istruzioni equivalenti meno costose: operator strength reduction
Argomenti trattati da Camil ma non da Daniele:
- condition code come espressione booleana sui flag (esempi avanzati), side-effect sui flag delle operazioni aritmetico logiche
- indirizzi di memoria a 64 bit
- consultazione manuale Intel
- Argomenti da trattare: nozione di utente e gruppo (fatto?), cenni ad IDE e ambienti grafici
- Eventuali approfondimenti: formato ELF, mount/unmount di device, apt-get, struttura standard delle directory: /tmp, /usr, /bin, /sbin, /opt, /lib, /etc, /dev (es. /dev/null)
- Argomenti correlati da introdurre più avanti: /proc
- Eventuali complementi: variabili globali e letterali stringa -> indirizzamento assoluto a memoria
- Argomenti core non trattati: (C) struct/union, virgola mobile, puntatori a funzione, switch, divisione intera; (IA32/System V) direttiva asm, frame pointer %ebp
- Lasciati come esercizio: do...while